AWS_CONFIG_FILEをdirenvで上書きするとprofileがディレクトリ単位に分離できる

  • AWS
  • direnv

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

direnvを使うと、ディレクトリにcdした瞬間にAWSの認証情報の参照先を切り替えられる。受託みたいに案件ごとにAWSアカウントが分かれてると地味に便利。

やりたいこと

  • 案件ディレクトリごとに.aws/configと.aws/credentialsを持たせる
  • そのディレクトリに入った時だけ、そのプロジェクトのAWS認証情報が有効になるようにする
  • ~/.aws/config(グローバル)は汚さない

設定

プロジェクト直下の.envrcに以下を書く。

export AWS_SHARED_CREDENTIALS_FILE=`pwd`/.aws/credentials
export AWS_CONFIG_FILE=`pwd`/.aws/config

`pwd`はサブシェル展開なので、$PWDでも同じ意味になる。direnvがこの.envrcを検知して、ディレクトリに入るタイミングで環境変数を切り替えてくれる仕組み。初回はdirenv allow .を叩く必要がある。

確認

aws configure list --profile sandboxで参照先を見てみる。

$ aws configure list --profile sandbox
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************ABCD config_file /path/example/.aws/config
secret_key ****************ABCD config_file /path/example/.aws/config
region us-west-2 env AWS_DEFAULT_REGION

access_key・secret_keyのTypeがconfig_fileになっていて、Locationもプロジェクト内の.aws/configを指している。狙い通りプロジェクトローカルのファイルが読まれている。

流れ

flowchart LR
  A[ディレクトリにcd] --> B[direnvが.envrcを検知]
  B --> C[AWS_CONFIG_FILE / AWS_SHARED_CREDENTIALS_FILEを上書き]
  C --> D[aws cliがプロジェクトローカルのconfig/credentialsを参照]

気になった点

  • profileが<not set>のまま。AWS_PROFILEは.envrc側でセットしていないので、コマンド実行のたびに--profile sandboxを明示する必要がある。.envrcにexport AWS_PROFILE=sandboxも足せば省略できるはずだが未確認。
  • regionだけTypeがenv(AWS_DEFAULT_REGION)になっていて、profile定義の情報源(config_file)とバラけている。.aws/configの[profile sandbox]にregionを書けば1箇所にまとまりそうだが、これも未確認。
  • プロジェクト内に.aws/credentialsを置く構成なので、.gitignoreに.aws/credentials(場合によっては.aws/configも)を入れておかないと誤コミットの事故につながる。