AWS CLIでインスタンスプロファイルからのAssumeRoleが簡単になりました
複数のAWSアカウントを切り替えたオペレーションを楽にする地味なアップデートが AWS CLI にきました。
tl;dr
1 2 3 | [dst-role]role_arn = arn:aws:iam::123456789012:role/some-rolecredential_source=Ec2InstanceMetadata |
というようにクレデンシャル設定($HOME/.aws/credentials)の credential_source に Ec2InstanceMetadata を指定するだけで、インスタンスプロファイルから対象アカウントの IAM Role を assume 出来るようになりました。
ユースケース
特定のサーバーから複数のAWSアカウントのリソースを操作する事を考えます。
操作先の各 AWS アカウントに IAM クレデンシャルを発行すると、アカウントが増えた時のクレデンシャル発行・配布やクレデンシャルが漏れた場合など、クレデンシャルの管理が厄介です。
そのため、操作先の AWS アカウントに IAM Role を作成し、そのロールを assume して操作することが多いかと思います。
AWS CLI からどうやって各ロールに assume するればよいでしょうか?
ソースが IAM クレデンシャルの場合
assume 元が IAM クレデンシャルの場合
1 2 3 4 5 6 7 | [operator]aws_access_key_id = dummy_access_keyaws_secret_access_key = dummy_secret_key[dst-role]role_arn = arn:aws:iam::123456789012:role/some-rolesource_profile = operator |
というように $HOME/.aws/credentials で記述しておけば
1 | $ aws s3 ls --profile dst-role |
とするだけで AWS アカウント 123456789012 のロール some-role を assume できます。
ソースがインスタンスプロファイルの場合
問題は assume 元がインスタンスプロファイルの場合です。
インスタンスプロファイルが設定された EC2 から自アカウントを操作する場合、 クレデンシャル設定が見つからなかった場合は、インスタンスプロファイルにフォールバックするため、クレデンシャルの特別な設定は不要です。
1 2 | $ aws s3 ls --region ap-northeast-1... |
インスタンスプロファイルが設定された EC2 から他アカウントの IAM ロールをassume する場合、クレデンシャル設定から source_profile を削除した
1 2 | [dst-role]role_arn = arn:aws:iam::123456789012:role/some-role |
のような設定でコマンドを実行出来ると良いのですが、エラーが発生します。
1 2 3 | $ aws s3 ls --profile dst-rolePartial credentials found in assume-role, missing: 'source_profile' |
そのため、自アカウントで一時クレデンシャルを払い出し($ aws sts assume-role --role-arn=ARN_OF_INSTANCE_PROFILE_ROLE ...)、一時クレデンシャルを環境変数に設定して、他アカウントの IAM ロールを assume するなどといった、回りくどリワークアラウンドが行われてきました。
今回の AWS CLI の機能追加により
1 2 3 | [dst-role]role_arn = arn:aws:iam::123456789012:role/some-rolecredential_source=Ec2InstanceMetadata |
というようにクレデンシャル設定の credential_source に Ec2InstanceMetadata を指定するだけで、対象アカウントの IAM Role を assume 出来るようになりました。
1 | $ aws s3 ls --profile dst-role |
assume 元に インスタンスプロファイル以外を利用する場合
credential_source には Ec2InstanceMetadata 以外も利用可能です。
Ec2InstanceMetadata: EC2 インスタンスプロファイルを利用。今回紹介Environment: 環境変数を利用EcsContainer: ECS のコンテナクレデンシャルを利用
対応バージョン
この機能は 2017/11/23 にリリースされた botocore 1.8.1 以上で利用可能です。
1 2 | $ aws --versionaws-cli/1.12.1 Python/2.7.12 Linux/4.9.38-16.33.amzn1.x86_64 botocore/1.8.1 |
バージョンが古い場合は $ pip install -U awscli でアップデートして下さい。
Python SDK の Boto3 から使う
botocore ライブラリで機能追加されているため、 AWS CLI だけでなく、Python SDK(Boto3)からも利用可能です。
1 2 3 4 | >>> import boto3>>> session = boto3.Session(profile_name='dst-profile')>>> session.client('s3').list_buckets()... |
aws configure list の出力の違い
参考までに
- IAM クレデンシャル
- インスタンスプロファイル
- インスタンスプロファイルからの assume role
それぞれで $ aws configure list の出力にどのような違いがあるのか確認します。
IAM クレデンシャル
Type が shared-credentials-file となっています。
1 2 3 4 5 6 7 | $ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None Noneaccess_key ****************XXXX shared-credentials-filesecret_key ****************XXXX shared-credentials-file region ap-northeast-1 config-file ~/.aws/config |
インスタンスプロファイル
Type が iam-role となっています。
1 2 3 4 5 6 7 | $ aws configure list Name Value Type Location ---- ----- ---- -------- profile <not set> None Noneaccess_key ****************XXXX iam-rolesecret_key ****************XXXX iam-role region ap-northeast-1 config-file ~/.aws/config |
インスタンスプロファイルからの assume role
Type が assume-role となっています。
1 2 3 4 5 6 7 | $ aws configure list --profile foo-bar Name Value Type Location ---- ----- ---- -------- profile foo-bar manual --profileaccess_key ****************XXXX assume-rolesecret_key ****************XXXX assume-role region <not set> None None |
まとめ
AWS CLI の地味なアップデートにより、インスタンスプロファイルからのクロスアカウント操作時のクレデンシャル操作がシンプルになりました。 この機能を活用すると、運用系スクリプトの認証周りの処理がスッキリするかもしれません。