LoginSignup
15
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-12

はじめに

最近 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 オプションを付けると見えます。

以上。

15
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
6