iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0
IT Operation

AWS 架構為什麼這樣選?30 天拆解服務選型與設計取捨系列 第 7 篇

Day 7|跨帳號存取實作:用 Bucket Policy 、 AssumeRole 讀取 S3(上)

  • 分享至 

  • xImage
  •  

上一篇比較了兩種跨帳號存取方式:

  • 使用 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

整篇會依序驗證三件事:

  1. EC2 使用 Account A 的 OrderApiRole,直接讀取 Account B 的 S3 Bucket。
  2. OrderApiRole 先 Assume Account B 的 ProductDataReadRole,再讀取同一個 Bucket。
  3. 改用 SSE-KMS 加密物件,分別測試 AWS managed key 與 customer managed key。

共用準備:建立 Bucket、Role 與 EC2

在 Account B 建立 S3 Bucket

登入 Account B,進入 S3 → General purpose buckets → Create bucket:

  • Bucket name:shared-product-data-prod
  • AWS Region:ap-northeast-1
  • Object Ownership:Bucket owner enforced
  • Block Public Access:全部維持啟用
  • Default encryption:先使用 SSE-S3

https://ithelp.ithome.com.tw/upload/images/20260921/20183052MuA5Uaolj1.png

https://ithelp.ithome.com.tw/upload/images/20260921/20183052qgs6hyvG7b.png

https://ithelp.ithome.com.tw/upload/images/20260921/20183052hGKoiuq8Jg.png

建立 Bucket 後,點選 Upload → Add files 上傳測試物件。

在 Account A 建立 OrderApiRole

接著登入 Account A,進入 IAM → Roles → Create role:

  1. Trusted entity type 選擇 AWS service。
  2. Service or use case 選擇 EC2。
  3. 本次實作使用 Session Manager 連線 EC2,附加 AmazonSSMManagedInstanceCore。
  4. Role name 輸入 OrderApiRole。

https://ithelp.ithome.com.tw/upload/images/20260921/20183052RGEVNqQZjR.png

https://ithelp.ithome.com.tw/upload/images/20260921/20183052vooMojQb3m.png

https://ithelp.ithome.com.tw/upload/images/20260921/20183052u26RWCveKS.png

https://ithelp.ithome.com.tw/upload/images/20260921/201830529tHegt4aoG.png

因為這個 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 決定。

建立測試 EC2

在 Account A 進入 EC2 → Instances → Launch instances:

  • Name:order-api-cross-account-test
  • AMI:AWS 提供的 Amazon Linux 2023
  • Instance type:測試環境可選擇小型規格,例如t3.micro
  • IAM instance profile:OrderApiRole
  • Key pair:本次使用 Session Manager,這邊選擇自己的金鑰對,或可選擇 Proceed without a key pair

本次使用 Session Manager,是因為不需要開放 SSH 22,也不用管理 SSH Key,就能直接從瀏覽器進入 EC2,它只是這次實作的連線方式,不影響後續 Bucket Policy 與 AssumeRole 的設定。

AWS 提供的 Amazon Linux 2023 AMI 通常已預裝 SSM Agent,因此一般不需要另外手動安裝。若無法透過 Session Manager 連線,仍需確認 Agent 是否正常運行。參考:AWS 官方文件

https://ithelp.ithome.com.tw/upload/images/20260921/20183052OR5Ul7ip1d.png

https://ithelp.ithome.com.tw/upload/images/20260921/20183052tu4H7Tm4iB.png

設定網路

本次測試使用公有子網,讓 EC2 可以連到 Systems Manager,以及後續需要的 S3、STS:

  • VPC:選擇預設 VPC 即可。
  • Subnet:選擇路由表具有 0.0.0.0/0 → Internet Gateway 的公有子網。
  • Auto-assign public IP:選擇 Enable。
  • Security Group:取消預設的 SSH 開放選項。
  • Outbound rules:保留允許對外連線的規則,確保 EC2 可以透過 HTTPS 443 連線至 AWS 服務。

https://ithelp.ithome.com.tw/upload/images/20260921/20183052qXhmQlE3L2.png

在 Advanced details 綁定 Role

往下展開 Advanced details,找到 IAM instance profile,選擇剛才建立的 OrderApiRole。

確認設定後,選擇 Launch instance。

https://ithelp.ithome.com.tw/upload/images/20260921/20183052zJlKUCieX5.png

如果 EC2 已經建立,仍可透過 Instances → 選擇主機 → Actions → Security → Modify IAM role,選取 OrderApiRole,再按 Update IAM role,不需要重建主機。

使用 Session Manager 連線

等待主機完成初始化後,進入:

EC2 → Instances → 選擇 order-api-cross-account-test → Connect → SSM Session Manager → Connect

https://ithelp.ithome.com.tw/upload/images/20260921/20183052AIWwcvt2AK.png

連線成功後,在開啟的 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 加密,觀察授權結果的差異。


上一篇
Day 6|跨帳號存取,該用 AssumeRole 還是 Resource-based Policy?
下一篇
Day 8|跨帳號存取實作:用 Bucket Policy 、 AssumeRole 讀取 S3(中)
系列文
AWS 架構為什麼這樣選?30 天拆解服務選型與設計取捨 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言