はじめに
最近 aws-vault 使い始めたのですが、 direnv と組み合わせる方法が分からなくて調べたメモ。
環境
- macOS 10.14 (Mojave)
- aws-vault v4.6.4
- direnv v2.20.1
やりたいこと
ディレクトリにcdしたしたタイミングでAWSのアクセスキーの環境変数を切り替えたりするのにdirenvを使ってたのですが、aws-vaultのヘルプを見たかんじ、直接的に現在のシェルに環境変数をexportする機能がありませんでした。
例えばTerraformでprodとdevでAWSアカウントを分けて、ディレクトリでtfstateを分けるみたいな使い方をしてると、このようなことがしたくなります。
解決方法
最初 aws-vault exec <profile_name> -j
でセッションの生データがJSONとして取れるので、これをjqなどでパースしてやればよいんでわ?って思ったんですが、よく考えると、envコマンドでAWS関連の環境変数をgrepで引っこ抜いてきたら、ほぼほぼやりたいことが達成できました。
一点だけ考慮ポイントとして、 aws-vaultは AWS_VAULT
環境変数が残ってるとネストしたセッションとみなしてエラーになるので、これだけ取り除きます。
つまり
$ export $(aws-vault exec <profile_name> -- env | grep AWS_ | grep -v AWS_VAULT)
これをディレクトリcdしたタイミングで発動させればよさそうです。
~/.direnvrc
に以下の関数を定義しておきます。
汎用性を高めるために引数としてAWSのプロファイル名を受け取れるようにしておきます。
use_aws_profile(){
profile_name=$1
export $(aws-vault exec $profile_name -- env | grep AWS_ | grep -v AWS_VAULT)
}
で、読み込みたいディレクトリに以下のような .envrc
を作成します。
例えばAWSのプロファイル名がdevの場合は、以下のように設定すればOKです。
use aws_profile dev
これでディレクトリをcdしただけでaws-vault経由で環境変数がexportされた状態になります。
おまけ
aws-vault exec の --assume-role-ttl
のデフォルトのタイムアウトが15mで微妙に短いです。これは環境変数 AWS_ASSUME_ROLE_TTL
で上書き可能です。例えば1hに設定したい場合は以下のとおり設定します。
use_aws_profile(){
profile_name=$1
export AWS_ASSUME_ROLE_TTL=1h
export $(aws-vault exec $profile_name -- env | grep AWS_ | grep -v AWS_VAULT)
}
1h以上にしたい場合は、Assume Roleの設定で、12hまでは伸ばせそうに見えます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use.html
が、role chainingしていると1h以上には設定できないようです。
ちなみにセッションの残り時間などは aws-vault exec
するときに --debug
オプションを付けると見えます。
以上。