ブログ


direnvとAWSCLI:複数環境へのアクセスを簡単に
こんにちは!
今回は「direnv」というツールについての紹介をさせていただきます。
主に、環境変数の設定をディレクトリごとに管理することができるという便利なツールです。
タイトルにもあるように、AWSCLIで複数環境へのアクセスを行う必要がある場合、direnvを使用することでかなりシームレスにアクセスができるようになったと感じています。
導入したきっかけ
クラウド開発の現場では、複数のAWSアカウントを行き来することは多いと思います。(開発環境、ステージング環境、本番環境、複数のクライアントやプロジェクト用のアカウント…etc)
これらを切り替えるたびに、aws configure
コマンド・--profile
オプションを毎回指定するのは結構大変だと思います。
この一手間が少しでも楽にできないだろうかと感じたことがきっかけでした。
同じように感じている方には、かなり恩恵のあるツールかもしれません。
direnvとは
公式:direnv
ディレクトリごとに環境変数を自動的に設定・解除するツールです。
ディレクトリに.envrc
というファイルを配置しておくと、そのディレクトリに移動した際に自動的にファイル内の設定が読み込まれ、ディレクトリから出ると設定が元に戻ります。
たとえば、プロジェクトAのディレクトリでは「開発環境用のAWSアカウント」の認証情報を設定し、プロジェクトBのディレクトリでは「本番環境用のAWSアカウント」の認証情報を設定しておけば、ディレクトリを移動するだけで適切なAWS環境に自動的に切り替わります。(素晴らしい。)
direnvのメリット
上記で概ねのツールの概要をお伝えしたので、すでに伝わっているかもしれません。
導入することによるメリットは、以下が挙げられるかと思います。
- ディレクトリ移動だけで自動的に環境が切り替わる
- 設定忘れや間違いのリスクが激減する
- 環境変数の汚染を防ぎ、ディレクトリを出れば元の状態に戻る
つまり、「どのディレクトリにいるか」が「どの環境を使用するか」を決定するため、認知負荷が減り、ミスの可能性も大幅に減少します。
導入方法
(私はM2 Macを使用しているため)homebrewからインストールを行います。
$ brew install direnv
インストール後、シェル環境に合わせて設定を追加する必要があります。
私の場合はzshを使用しているので、.zshrc
ファイルに以下の設定を追加します。
# ~/.zshrc に追加
eval "$(direnv hook zsh)"
もしbashを使用している場合は、.bashrc
または.bash_profile
に以下を追加します。
# ~/.bashrc または ~/.bash_profile に追加
eval "$(direnv hook bash)"
設定を追加しましたら、変更を反映させるために以下コマンドを実行します。
source ~/.zshrc # zshの場合
source ~/.bashrc # bashの場合
これでdirenvの導入は完了です!
direnvを使ってみよう(動作確認)
使い方を理解するために、簡単なテスト方法をご紹介します。
まずはテスト用のディレクトリを作成し、テスト用ディレクトリへ移動します。
mkdir ~/direnv-test
cd ~/direnv-test
.envrc
ファイルを作成します。
echo 'export TEST_VAR="direnv works!"' > .envrc
direnvの許可を与えます。(作成・内容の更新をした場合、その都度行う必要があります。)
direnv allow
環境変数が設定されているかどうかを確認します。
echo $TEST_VAR # "direnv works!" と表示される
ディレクトリから出て、環境変数が解除されることを確認します。
cd ~
echo $TEST_VAR # 何も表示されない
これで動作確認は完了です。
direnvが正しく動作していれば、ディレクトリに入ると環境変数が設定され、出ると解除されるはずです。
実際の使用例
一番シンプルな使い方は次の通りです。
(私の場合はterraformを実行するときに、この方法を使用しています。)
プロジェクトのルートディレクトリに、.envrcファイルを作成します。
touch .envrc
.envrcファイルに以下接続情報を記載します。
(それぞれのディレクトリにあった接続情報を間違えずに記載します。)
export AWS_ACCESS_KEY_ID="xxx..."
export AWS_SECRET_ACCESS_KEY="xxxx..."
export AWS_REGION="xxx..."
.envrcファイルを作成(または変更)したため、direnvの許可を与えます。
direnv allow
.envrcを作成する方法は、以下のようにいくつか方法があります。
touch .envrc
echo 'export AWS_PROFILE=development' > .envrc
direnv edit .
direnv edit .
を使用する場合は、作成や編集・許可までを一貫して行なってくれるため、direnvの開発元が推奨している方法です。
touchやechoでリダイレクトする方法で作成を行った場合、direnv allow
で許可を行う必要があるといった違いがあります。
使いやすい方法で問題ありません。
ディレクトリ構造
私の環境だと、以下のような構造となっています。
project-aディレクトリに入った際には、project-a用の設定が読み込まれ、project-bディレクトリに入った際にはproject-b用の設定が読み込まれ…という状態となります。
この状態を作り上げてしまえば、かなりオートマチックになりますね。
~/projects/
├── project-a/
│ ├── .envrc (project-a用の設定)
│ └── ...その他のファイル
│
├── project-b/
│ ├── .envrc (project-b用の設定)
│ └── ...その他のファイル
│
└── project-c/
├── .envrc (project-c用の設定)
└── ...その他のファイル
注意点
環境変数にシークレット情報を設定する際は、セキュリティに注意が必要です。.envrc
ファイルは、Gitに含めないようにしましょう。
# .gitignoreに追加
.envrc
まとめ
direnvを活用することで、以下メリットがあります。
自動化による効率化
- ディレクトリ移動だけで適切な環境設定が適用される
- 手動での環境変数設定やプロファイル指定が不要になる
ミスの防止
- 環境設定の切り替え忘れを防止できる
- 常に適切なAWSアカウントで作業できる
環境の分離
- プロジェクトごとに完全に分離された環境を維持できる
- グローバル環境を汚染することなく、必要な設定だけを適用できる
改めて、かなり作業効率を上げてくれるツールだと思います。
最後に
direnvとはなにか・導入方法・簡単な使い方について説明をさせていただきました。
今回は導入方法と導入メリットについての説明を主としているため、シンプルな活用方法のご紹介となっています。
direnvをより工夫した活用もできますので、また機会があれば紹介したいなと思っています。
少々長くなっていしまいましたが、最後までお付き合いいただきありがとうございました。
それではまた!
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!