CLIでロールのセッション期間を設定するとはまりやすいポイント
こんにちは!ハンと申します。今回が初のブログになりますが、どうぞよろしくお願いします!
さて、今回はAWS CLIでIAMロールを引き受ける(AssumeRole)際に、セッションの有効期間を設定するとアクセス拒否(AccessDenied)が発生することがあります。本投稿では、その原因と解決策について解説します。
背景:AWS CLIでIAMロールを引き受ける
AWS CLIでIAMロールを引き受ける場合は、通常は下記のようなコマンドを実行します。
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/MyRole --role-session-name botocore-session-1234567890
このコマンドを実行すると、一時的なセキュリティ認証情報が発行され、ロールの権限を使用して、AWSリソースにアクセスできます。
デフォルトではセッションの有効期間は1時間(3600秒)ですが、duration-secondsオプションを指定することで、最大12時間(43200秒)まで延長できます。
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/MyRole --role-session-name botocore-session-1234567890 --duration-seconds 43200
しかし、このコマンドを実行すると、アクセス拒否(AccessDenied)のエラーが発生することがあります。
はまったこと:ロールのセッション期間を設定するとアクセス拒否が発生する
ロールのセッション期間を延長しようとしたら、下記のようなエラーメッセージが出ることがあります。
An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::111111111111:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/MyRole
原因:MFA(多要素認証)が必須のロールにはtoken-codeオプションが必要
IAMロールの設定により、ロールを引き受ける時にMFA(多要素認証)が必須になっている場合があります。
MFAが有効な場合は、token-codeオプションを指定しないとsts:AssumeRoleの権限が拒否されてしまいます。
解決策:token-codeオプションを指定する
アクセス拒否を解消し、長時間のセッションを確保するには、MFAのワンタイムパスコードを取得し、token-codeオプションを指定してコマンドを実行する必要があります。
1.MFAデバイスのシリアル番号を確認する
まず、IAMユーザーのMFAデバイスのarnを確認します。
aws iam list-mfa-devices --user-name MyUser
出力例:
{
"MFADevices": [
{
"UserName": "MyUser",
"SerialNumber": "arn:aws:iam::111111111111:mfa/MyAuthenticator",
"EnableDate": "2025-01-01T09:07:44+00:00"
}
]
}
このSerialNumberをメモしておきます。
2.MFAのワンタイムパスコードを取得する
MFAデバイスの6桁のワンタイムパスコードを確認します。
3.token-codeオプションを指定してロールを引き受ける
取得したMFAのワンタイムパスコードをtoken-codeオプションに指定し、aws sts assume-roleを実行します。
注意:MFAのパスコードの有効期間がかなり短いため、期限が切れる前に急いで実行する必要があります。
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/MyRole \
--role-session-name botocore-session-1234567890 \
--duration-seconds 43200 \
--serial-number arn:aws:iam::111111111111:mfa/MyAuthenticator \
--token-code 123456
出力例:
{
"Credentials": {
"AccessKeyId": "AAAAAAAA7ZG6OQVOSALE",
"SecretAccessKey": "IIIIIIIIIrRFFMpibD86sbSLIs6Qz8ZdKlr2haLv",
"SessionToken": "IQoJb3JpZ2luX2VjjjjjjjjjLW5vcnRoZWFzdC0xIkcwRQIgLG3QiKxA3Y8X+Hy8bgws3ieuXeCzrA9CEtERmIAwsC8CIQCYpcIgVS1LBtxEzaEwDsrlOZbGS9j8eXjDGCeLznO77iqpAggnEAAaDDY1MTcwNjc0NzMyNCIMWBMTUU+9jY1ZP4U4KoYCphdakJJvURtsXk1J5jLFh9RfNzASRJj+0214nBI/g2jbb53WQonDoMmupXkOQO0g4askNOZ0CfJmG3zDeCjJviB7VsBn9EILosbUU4ztXTyOF6ZGlffdKFAaJmNtXfna3ynjekiFagtPu79gCg5yCS8M3OKwgNB46ayuQxAr74adWXTJNKZatynIP/MRUrsqnOFF5yVnhZzVbfHaS1bKQrBjp5kg+HOJrr1DQwvST+ifzdGErpjeUQifDxNxI3k9fBtIMlNHe0igeseBLQTn08m5YwkCsYa3ESEpnjfOq+/Cit6EFqVz9N35PpVN2ztfu5sfKKP1RCl7TklNFgROz4USEnjspzCF14a9BjqdAU9NPc5JTPvkE2Lw58HGKEoIuVr3xyxDRN6FUKjm/gwpKU2T/AUaDKaQwVPR+O7yRDb1m24etGbx5OTRMnRDnfXoNrvNonlyI3X1b7Fsx5CnbYGtQDN6RatcOyEKeVOUvule+xRDFnEivz7bHYN1WvzcpBnbFrlCZhbJNB6WPB9bQFisQ4riB9I1p1g7fjLLlvVodIsbi2Ul/eyJ9QY=",
"Expiration": "2025-02-04T17:54:13+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "AROAZPPF7ZG6HIPEAANTH:botocore-session-1234567890",
"Arn": "arn:aws:sts::123456789012:assumed-role/MyRole/botocore-session-1234567890"
}
}
設定したセッション期間を出力のExpirationから確認できます。Expirationは現在の認証情報の有効期限が切れる日時を示します。
まとめ
AWS CLIでロールのセッション期間を設定すると、MFA(多要素認証)が有効な場合、アクセス拒否(AccessDenied)が発生することがあるので、注意が必要です。MFAデバイスのワンタイムパスコードを取得し、token-codeオプションを指定し、ロールを引き受けます。
AWSのセキュリティ設定は細かいですが、意図しないアクセス拒否にあったら、IAMロールのMFAやポリシーをチェックするのが重要ですね。「IAMロールの引き受けが拒否された!」と困っている方は、ぜひ試してみてください。
投稿者プロフィール

- 中国出身。AWSの構築・運用を経験し、一人前のエンジニアを目指しています。学びと挑戦を楽しみながら前進中!好きなことはお寿司や天ぷらを食べまくること、そして気ままな散歩です。
最新の投稿
AWS2025年2月7日CLIでロールのセッション期間を設定するとはまりやすいポイント