「Switch Role(ロールの切り替え)」とは、別のIAMロールに一時的に切り替えて、そのロールの権限で操作を行う機能のことです。
これにより、ユーザーは1つのアカウントにログインしたまま、別の権限やアカウントの操作を安全に実行できます。
企業では、開発用アカウント・本番用アカウント・監査用アカウントなどを分けるのが一般的です。
Switch Roleを使うと、一度ログインするだけで他アカウントの操作ができるようになります。
社員が増えたり、減ったりしますが、1環境のみユーザを作ればよく、各アカウントごとにユーザを作る必要がなくなります。
普段は権限の少ないユーザーとして動き、必要なときだけ管理者ロールに切り替えることでセキュリティを向上できます。
特定のIAMロールにだけ操作権限を持たせ、通常のユーザーはそのロールにスイッチして操作します。
例:S3フルアクセスは特定のロールでのみ可能にする。
「Assume Roleアクション」は他者にAWSアカウントの権限を委譲する仕組みです。
他者にスイッチロールができるようになります。
設定は、各ロールで「信頼関係」を設定することで、権限を付与することができます。
スイッチロールするときに、
AWS STS(Security Token Service)のAssume Roleアクションによって、IAMロールから一時的認証情報(アクセスキーID、シークレットアクセスキー、セッショントークン)を取得して使用します。
スイッチロールするポリシーを作成し、それをユーザに割り当てましょう。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole"
"Resource": "*"
}
}
1234567890の誰にでもスイッチロールできる。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole"
"Resource": "arn:aws:iam::1234567890:role/*"
}
}
1234567890のsw-admin-writeロールにスイッチロールできる。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole"
"Resource": [
"arn:aws:iam::1234567890:role/sw-admin-write",
"arn:aws:iam::9988776655:role/sw-admin-write"
]
}
}
特定 IP のみ特権ロールの AssumeRole を許可する。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAssumeRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::xxxxxxxxxx:role/AssumedAdministratorAccessRole"
},
{
"Sid": "SourceIPRestriction",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"xxx.xxx.xxx.xxx/32"
]
}
}
}
]
}
他のアカウントが利用できるロールを作成して、どこからスイッチロールを許可するかの信頼関係と操作できるロールの設定する
スイッチロールされるロールの「信頼関係」で、許可するユーザを追加します。
特定 IP からのみIAM ユーザーがこのロールを引き受けられるように設定します。
スイッチロールされるロールの「信頼関係」に以下のように設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::xxxxxxxxxxxxxxx:user/xxxxxxxxx",
"arn:aws:iam::xxxxxxxxxxxxxxx:user/xxxxxxxxx",
"arn:aws:iam::xxxxxxxxxxxxxxx:user/xxxxxxxxx",
"arn:aws:iam::xxxxxxxxxxxxxxx:user/xxxxxxxxx"
]
},
"Action": "sts:AssumeRole"
"Condition": {
"IpAddress": {
"aws:SourceIp": "x.x.x.x/32"
}
}
}
]
}
スイッチロールされるロールの「信頼関係」に以下のように設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::aaaaaaaa:root"
},
"Action": "sts:AssumeRole"
"Condition": {
"ArnLike": {
"aws:PrincipalArn": "arn:aws:iam::aaaaaaaaaa:user/*_infra"
}
}
}
]
}
スイッチロールされるロールの「信頼関係」に以下のように設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole"
}
]
}
SwichRoleのIAMを変更したら、ログアウト、ログインして確認しましょう。
そのままスイッチロールだけ確認すると、ログインできたり、できなかったりおかしい状態になります。
(1)右上のアカウント名をクリックし、「ロールの切り替え」を選択します。
(2)以下を入力し、「ロールの切り替え」をクリックします。
| 項目 | 設定 | 説明 |
|---|---|---|
| アカウント | 12345678901 | スイッチロール先のアカウント |
| ロール | sw-service1-infra | スイッチロール先のロール名 大文字小文字注意 |
| 表示名 | オプション | |
| 色 | オプション |
aws sts assume-role --role-arn "arn:aws:iam::12345678901:role/sw-service1-infra" --role-session-name sw-service1-infraSession # 環境変数を設定 export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxx export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxx export AWS_SESSION_TOKEN=xxxxxxxxxxxxxxxxx # 確認 aws sts get-caller-identity # 環境変数を削除 unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
credential_source=Ec2InstanceMetadata (よく利用する方法)
$HOME/.aws/credential
[dst-role] role_arn = arn:aws:iam::123456789012:role/some-role credential_source=Ec2InstanceMetadata
Ec2InstanceMetadata : EC2 インスタンスプロファイルを利用
$ aws s3 ls --profile dst-role
参考:AWS CLIでインスタンスプロファイルからのAssumeRoleが簡単になりました | DevelopersIO
source_profileでdummyのIAMクレデンシャルを利用する
$HOME/.aws/config
[profile dev] region = ap-northeast-1 output = json [profile prod-readonly] role_arn = arn:aws:iam::222222222222:role/ReadOnlyFromDev source_profile = dev region = ap-northeast-1
$HOME/.aws/credential
[dev] aws_access_key_id = AKIAxxxxxxxxxxxxxxxx aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxx
開発用クレデンシャルを使って自動的に本番アカウントのロールにスイッチして、その権限でコマンドが実行されます。
$ aws s3 ls --profile prod-readonly
$HOME/.aws/credential
[operator] aws_access_key_id = dummy_access_key aws_secret_access_key = dummy_secret_key [dst-role] role_arn = arn:aws:iam::123456789012:role/some-role source_profile = operator
$ aws s3 ls --profile dst-role
参考:AWS CLIでインスタンスプロファイルからのAssumeRoleが簡単になりました | DevelopersIO
一般向けサイト
ITエンジニア向けサイト
英語サイト
Portfolio
Copyright (c) 2025 クラウドのインフラ技術 All Rights Reserved.