上一篇比較了兩種跨帳號存取方式:
使用 Resource-based Policy,讓來源帳號的 Role 直接存取目標資源。
使用 AssumeRole,先取得目標帳號中的暫時身分,再操作資源。
接下來會分成上、中、下三篇,沿用相同情境,實際設定這兩種做法,觀察請求成功後使用的身分有什麼不同,今天先準備 S3 Bucket、IAM Role 與 EC2,並透過 Session Manager 連線測試主機。
本文使用以下測試環境(帳號 ID 與 Bucket 名稱都是範例,實作時需要換成自己的值):
| 項目 | Account A:存取方 | Account B:資源擁有方 |
|---|---|---|
| Account ID | 假設為111122223333 |
假設為444455556666 |
| 來源 Role | OrderApiRole |
— |
| 目標 Role | — | ProductDataReadRole |
| S3 Bucket | — | shared-product-data-prod |
| Region | ap-northeast-1 |
ap-northeast-1 |
整篇會依序驗證三件事:
OrderApiRole,直接讀取 Account B 的 S3 Bucket。OrderApiRole 先 Assume Account B 的 ProductDataReadRole,再讀取同一個 Bucket。登入 Account B,進入 S3 → General purpose buckets → Create bucket:
shared-product-data-prod
ap-northeast-1
Bucket owner enforced
SSE-S3



建立 Bucket 後,點選 Upload → Add files 上傳測試物件。
OrderApiRole接著登入 Account A,進入 IAM → Roles → Create role:
AmazonSSMManagedInstanceCore。OrderApiRole。



因為這個 Role 要交給 EC2 使用,所以信任的實體要選 AWS service → EC2,建立後的 Trust Policy 會包含:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
這份 Trust Policy 只回答「誰可以使用這個 Role」,至於 EC2 使用 Role 之後能做什麼,還要由 Permissions Policy 決定。
在 Account A 進入 EC2 → Instances → Launch instances:
order-api-cross-account-test
t3.micro
OrderApiRole
本次使用 Session Manager,是因為不需要開放 SSH 22,也不用管理 SSH Key,就能直接從瀏覽器進入 EC2,它只是這次實作的連線方式,不影響後續 Bucket Policy 與 AssumeRole 的設定。
AWS 提供的 Amazon Linux 2023 AMI 通常已預裝 SSM Agent,因此一般不需要另外手動安裝。若無法透過 Session Manager 連線,仍需確認 Agent 是否正常運行。參考:AWS 官方文件


本次測試使用公有子網,讓 EC2 可以連到 Systems Manager,以及後續需要的 S3、STS:
0.0.0.0/0 → Internet Gateway 的公有子網。
往下展開 Advanced details,找到 IAM instance profile,選擇剛才建立的 OrderApiRole。
確認設定後,選擇 Launch instance。

如果 EC2 已經建立,仍可透過 Instances → 選擇主機 → Actions → Security → Modify IAM role,選取
OrderApiRole,再按 Update IAM role,不需要重建主機。
等待主機完成初始化後,進入:
EC2 → Instances → 選擇 order-api-cross-account-test → Connect → SSM Session Manager → Connect

連線成功後,在開啟的 EC2 終端機執行:
aws sts get-caller-identity
預期 ARN 類似:
arn:aws:sts::111122223333:assumed-role/OrderApiRole/i-0123456789abcdef0
這代表 AWS CLI 正在使用 EC2 上的 OrderApiRole,不需要另外輸入 Access Key。
測試環境準備完成後,下一篇會設定 Bucket Policy,讓 Account A 的 EC2 直接讀取 Account B 的 S3 物件,再加入 KMS 加密,觀察授權結果的差異。