AWS CLIがAssumeRoleする際のセッション名を指定する

こんにちは。サービスグループの武田です。AWS CLIでIAMロールを使用してコマンド実行する場合、プロファイルにrole_session_nameを設定すると幸せになれるよ、というお話です。
2020.10.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

AWS CLIは好きですか?(挨拶)

AWSの操作はマネジメントコンソールを利用してぽちぽちする方法も楽ですが、自動化などしたい場合にはAWS CLIも便利です。またAWS CLIにはプロファイルにIAMロールを設定しておくだけで自動的にAssumeRole(スイッチロール)してコマンドを実行してくれる機能もあります。

さてAssumeRoleをして一時的なクレデンシャルを取得する際にはセッション名の指定が必要です。次のようにassume-roleコマンドのリファレンスでも--role-session-nameが必須パラメーターとなっています。

  assume-role
--role-arn <value>
--role-session-name <value>

AWS CLIがプロファイルの設定から自動的にAssumeRoleする際には、セッション名はbotocore-session-1609426800のような名前が自動的に与えられます。

実はこのセッション名というのは、APIコールしたユーザー名としてAWS CloudTrailに記録されます。一人しか使用しないロールであれば問題ないのですが、複数人が使用するロールの場合、上記のようなデフォルトのセッション名では「誰がそのロールを使用してAPIコールをしたのか」の追跡が困難になります。そういうわけで、責任追跡性(Accountability)を担保する必要がある場合、プロファイルにrole_session_nameを設定すると幸せになれるよ、というお話です。

role_session_nameの指定をして比較してみる

それではrole_session_nameを指定した場合としなかった場合を比較してみましょう。スイッチ用のロール(ここではblog-test-role)はあるものとして、次のように2種類の設定をプロファイルに追加します。

~/.aws/config

[profile test-src-role]
role_arn = arn:aws:iam::123456789012:role/blog-test-role
source_profile = default

[profile test-src-role-with-name]
role_arn = arn:aws:iam::123456789012:role/blog-test-role
role_session_name = cm-takeda.takashi
source_profile = default

role_arn = arn:aws:iam::123456789012:role/blog-test-roleはスイッチ先のロールARNを指定します。source_profile = defaultはスイッチ元のプロファイル名です。違いはrole_session_nameの有無だけですね。

それではrole_session_nameを指定していないプロファイルでAPIコールをします。

$ rm -rf .aws/cli/cache/
$ aws ec2 describe-vpc-endpoints --profile test-src-role --region ap-northeast-1
{
    "VpcEndpoints": []
}

CloudTrailには次のように記録されています。

同様に、role_session_nameを指定しているプロファイルでも試してみます。

$ rm -rf .aws/cli/cache/
$ aws ec2 describe-vpc-endpoints --profile test-src-role-with-name --region ap-northeast-1{
    "VpcEndpoints": []
}

CloudTrailで名前が確認できますね!

まとめ

セッション名のルールをチーム内で決めておけば、誰がAPIコールをしたのか簡単に判断できますね。複数人でIAMロールを共有して使用する場合は、ぜひrole_session_nameの指定をお忘れなく。

合わせて読みたい