概要
アカウント1のEC2から、VPCピアリング越しにアカウント2のVPCエンドポイントを経由して、クロスアカウントAssumeRole → S3アクセスする検証を行った。
構成
フローは下記の通り。
- アカウント1のEC2がVPCピアリング経由でアカウント2のSTS VPCエンドポイントに到達する
- STS VPCエンドポイント経由で
sts:AssumeRoleを実行する(対象:アカウント2のIAMロール) - STSがアカウント2のIAMロールの信頼ポリシーを検証し、アカウント1のロールが許可されていることを確認する
- 検証成功後、アカウント2のIAMロールの権限で一時クレデンシャルが発行される
- 取得した一時クレデンシャルを使ってS3 VPCエンドポイント経由でアカウント2のS3バケットにアクセスする
ポイントとして、S3にアクセスしているのはアカウント1のEC2ですが、使っている権限はアカウント2のIAMロールのものです。
環境構築
IAMロール(アカウント1)
EC2にアタッチするロールを作成する。
- ARN:
arn:aws:iam::<アカウント1ID>:role/ec2-test-role - 許可ポリシー:AdministratorAccess
- 信頼ポリシー:下記の通り
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
VPCピアリング・ルートテーブル
| アカウント | 宛先 | ターゲット |
|---|---|---|
| アカウント1 | 172.18.0.0/16 | pcx-xxxxxx |
| アカウント2 | 192.168.1.0/24 | pcx-xxxxxx |
IAMロール(アカウント2)
クロスアカウントAssumeRole用のロールを作成する。信頼ポリシーでアカウント1のロールからのAssumeRoleを許可する。
- ARN:
arn:aws:iam::<アカウント2ID>:role/test2-role - 許可ポリシー:AmazonS3FullAccess
- 信頼ポリシー:下記の通り
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウント1ID>:role/ec2-test-role"
},
"Action": "sts:AssumeRole"
}
]
}
セキュリティグループ(アカウント2:エンドポイント用)
| 方向 | タイプ | プロトコル | ポート | ソース |
|---|---|---|---|---|
| インバウンド | HTTPS | TCP | 443 | 192.168.1.0/24 |
| アウトバウンド | すべてのトラフィック | All | All | 0.0.0.0/0 |
VPCエンドポイント(アカウント2)
Interface型で作成する。Gateway型だとVPCピアリング越しのアクセスが到達しない。
| Name | エンドポイントID | タイプ | サービス名 |
|---|---|---|---|
| s3-test | vpce-xxxxxxxxxxxxxxxxx | Interface | com.amazonaws.ap-northeast-1.s3 |
| sts-test | vpce-xxxxxxxxxxxxxxxxx | Interface | com.amazonaws.ap-northeast-1.sts |
S3バケット(アカウント2)
S3バケットを作成し、テストファイルをアップロードする。
s3://test20260701test/test20260701.txt
検証
アカウント1のEC2(Windows)にRDPでログインし、コマンドプロンプトで実行する。
現在のロール確認
aws sts get-caller-identity
{
"Account": "<アカウント1ID>",
"Arn": "arn:aws:sts::<アカウント1ID>:assumed-role/ec2-test-role/i-xxxxxxxxxxxxxxxxx"
}
AssumeRole実行
aws sts assume-role --role-arn arn:aws:iam::<アカウント2ID>:role/test2-role --role-session-name test-session --endpoint-url https://sts.ap-northeast-1.amazonaws.com
{
"Credentials": {
"AccessKeyId": "ASIAXXXXXXXXXXXXXXXX",
"SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"SessionToken": "xxxxxxxx......xxxxxxxx",
"Expiration": "2026-07-01T09:00:00+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "AROAXXXXXXXXXXXXXXXXX:test-session",
"Arn": "arn:aws:sts::<アカウント2ID>:assumed-role/test2-role/test-session"
}
}
一時クレデンシャルを環境変数にセット
set AWS_ACCESS_KEY_ID=ASIAXXXXXXXXXXXXXXXX
set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
set AWS_SESSION_TOKEN=xxxxxxxx......xxxxxxxx
ロール切り替えの確認
aws sts get-caller-identity
{
"Account": "<アカウント2ID>",
"Arn": "arn:aws:sts::<アカウント2ID>:assumed-role/test2-role/test-session"
}
アカウント2のロールに切り替わった。
S3アクセス
aws s3 ls s3://test20260701test/
2026-07-01 07:10:00 14 test20260701.txt
aws s3 cp s3://test20260701test/test20260701.txt C:\Users\Administrator\Desktop\test.txt
download: s3://test20260701test/test20260701.txt to C:\Users\Administrator\Desktop\test.txt
アカウント2のS3からファイルを取得できた。
