Edited at

aws-vaultをdirenvと組み合わせて使う


はじめに

最近 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-vault exec $profile_name -- env | grep AWS_ | grep -v AWS_VAULT)
export AWS_ASSUME_ROLE_TTL=1h
}

1h以上にしたい場合は、Assume Roleの設定で、12hまでは伸ばせそうに見えます。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use.html

以上。