はじめに
AssumeRoleを初めて使ったので整理してみました
AssumeRoleとは
AssumeRoleとは、IAMロールの権限を一時的に借りる仕組みです。
AssumeRoleのフロー
同一のAWSアカウント内でもAssumeRoleを使用可能ですが、多くはクロスアカウントで利用されます。
一時的な認証情報は、AWS STS(Security Token Service)によって発行されます。
AWS STSはAWSが提供・管理しているサービスです。 通常はAWS SDKやCLI経由で利用するため、利用者がSTSサーバー自体を管理・設定することはありません。
AssumeRoleを実行するための条件
- リクエスト元に
sts:AssumeRoleの実行権限がある - 借りる対象ロールの信頼ポリシーが、リクエスト元を許可している
- 信頼ポリシーに条件がある場合、その条件も満たしている
1 リクエスト元に sts:AssumeRole の実行権限がある
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::555666777888:role/general-role"
}
2 借りる対象ロールの信頼ポリシーが、リクエスト元を許可している
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111222333444:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<External ID>"
}
}
}
※ "AWS": "...:root": アカウント111222333444を信頼先として指定
「rootユーザーではなくアカウント全体を指す」
3 信頼ポリシーに条件がある場合、その条件も満たしている (externalIDの指定など)
{
"Condition": {
"StringEquals": {
"sts:ExternalId": "<External ID>"
}
}
}
※ AssumeRole後に実行できる操作は、借りたIAMロールにアタッチされている権限ポリシーで許可された操作のみです。
AssumeRole実行方法
AssumeRoleは、「AWS CLI」や「AWS SDK」などを利用して、AWS STSのAssumeRole APIを呼び出すことで実行します。
AWS CLI
aws sts assume-role \
--role-arn arn:aws:iam::555666777888:role/general-role \
--role-session-name general-session \
--external-id "<External ID>" \
--profile kandalog
555666777888アカウントのgeneral-roleを、general-sessionというセッション名で、External IDを提示して一時的に引き受ける
借りたいRole: general-role
AssumeRoleの実行元プロファイル: kandalog
セッション名: general-session
| args | 役割 | 備考 |
|---|---|---|
| --role-arn | 引き受ける対象のIAMロールを指定する | AWSアカウント555666777888のgeneral-roleをAssumeRoleする |
| --role-session-name | AssumeRoleによって作成されるセッション名を指定する | セッションARNやCloudTrailなどの監査ログに記録される識別子 例: arn:aws:sts::555666777888:assumed-role/general-role/general-session
|
| --external-id | Trust Policyで要求される追加の認証情報を指定する | IAMロールのTrust Policyでsts:ExternalIdが設定されている場合のみ必要 |
| --profile | AssumeRoleを実行する際に利用するAWS CLIプロファイルを指定する | 省略した場合はdefaultプロファイル(または認証情報探索ルールに従って見つかった認証情報)が利用される~/.aws/credentials または ~/.aws/config に定義された kandalog プロファイル |
返却値の例
Credentialsの情報を使って有効期限内はリソースの操作が可能
{
"Credentials": {
"AccessKeyId": "ASIAEXAMPLE123456789",
"SecretAccessKey": "exampleSecretAccessKey1234567890",
"SessionToken": "exampleSessionToken1234567890...",
"Expiration": "2026-07-27T12:00:00+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "AROAXAMPLE123456789:general-session",
"Arn": "arn:aws:sts::555666777888:assumed-role/general-role/general-session"
}
}
SDKからの実行 (Ruby)
SDKを使用する場合、Lambda、EC2、ECSなどの実行環境に付与されたIAMロールの認証情報を、AWS SDKが認証情報プロバイダーチェーンから自動的に取得する
本番環境では通常、プロファイルを明示的に指定する必要はない
sts = Aws::STS::Client.new
response = sts.assume_role(
role_arn: "arn:aws:iam::555666777888:role/general-role",
role_session_name: "general-session",
external_id: "<External ID>"
)
credentials = response.credentials
※ ローカル環境では、環境変数や~/.aws/credentialsのプロファイルが使われることもある
※ AWS SDK for Rubyは、複数の候補から利用可能な認証情報を順番に探索する