Help us understand the problem. What is going on with this article?

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_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以上には設定できないようです。

https://github.com/99designs/aws-vault/blob/6ef054e6e714994fbd110d30f118bddceee65aa1/USAGE.md#assuming-a-role-for-more-than-1h

ちなみにセッションの残り時間などは aws-vault exec するときに --debug オプションを付けると見えます。

以上。

crowdworks
21世紀の新しいワークスタイルを提供する日本最大級のクラウドソーシング「クラウドワークス」のエンジニアチームです!
https://crowdworks.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした