iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0
AWS 完成了需要的設定,但 GitHub 還沒做好準備啊!

登入設定完成只是開頭,完整流程還沒串起來呢 ↓

GitHub Push → GitHub Actions 觸發 → OIDC 驗證 → Assume Role → Deploy Lambda

前篇已經完成 AWS OIDC 的設定,並建立了一個提供 Web 登入的 IAM Role。
這兩個步驟看似不連貫,其實都是為後續的自動化部署做準備。

  • AWS OIDC:允許 GitHub Actions 登入 AWS
  • AWS IAM Role:定義 GitHub Actions 登入後可扮演的角色
    (相當於定義登入後的 token 擁有哪些權限)

開始前整理一下之前都定義了些什麼

在建立 IAM Role 的時候,信任政策(Trust Policy)中有一段內容對「誰可以取用這個 Role」做了限制:

"StringLike": {
    "token.actions.githubusercontent.com:sub": [
        "repo:MinxSu/ITHome-ironman-2025:ref:refs/heads/develop"
    ]
}

專案:MinxSu
Repository:ITHome-ironman-2025
分支:develop

如果沒有完全符合以上條件,是無法使用這個 Role 的。
所以...


準備好 GitHub 專案 & 對應分支

https://ithelp.ithome.com.tw/upload/images/20251011/20168437iAP5Y6w2e5.png

  • 在專案中加入 .github/workflows/ 資料夾,這是 GitHub 提供的 CI/CD 工作流程定義檔路徑。
    專案結構會變得類似這樣:
    ITHome-ironman-2025/        # 專案資料夾
    ├── lambda_function.py      # 程式碼
    ├── bedrock_service.py      
    ├── ....py
    ├── requirements.txt        # 引入套件清單
    └── .github/                # GitHub 用設定檔路徑
        └── workflows/          # GitHub Actions workflow 的預設讀取路徑
            └── oidc-test.yml   # yaml 設定檔案,檔名無預設可自行設定
    
    • .github/:放 GitHub 專用的設定(issue 模板、PR 規範、actions 等)
    • .github/workflows/:放 GitHub Actions workflow 定義檔
    • deploy.yml:每個 .yml 檔就是一個「自動化工作流程(workflow)」

撰寫 yaml 設定檔案

  • 佈署前先測試看看 OIDC 能否取得 AWS 暫時性憑證
name: OIDC Test

on:
  workflow_dispatch:   # 這代表手動觸發測試

jobs:
  aws-test:
    runs-on: ubuntu-latest

    permissions:
      id-token: write   # 必要,才能用 OIDC 跟 AWS 交換暫時憑證
      contents: read

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4

      - name: Configure AWS credentials from OIDC
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Test AWS CLI
        run: |
          aws sts get-caller-identity

在這段 yaml 語法中,有兩個設定值不是直接寫在語法中,而是設定在 GitHub 的 secrets

GitHub Secrets 是 GitHub 提供的加密變數機制
可安全儲存敏感資訊(像 API 金鑰、密碼、權杖),並可被 GitHub 本身的自動化功能(如 Actions、Dependabot、Codespaces)使用。
不同功能的 Secrets 是各自獨立的,互不共用。
設定完成後無法從 GitHub 網站上檢視設定值,只能重新設定。

  • 設定 GitHub Secrets
    設定位置:Settings 分頁 > Secrets and variables > Actions > New repository secret
    https://ithelp.ithome.com.tw/upload/images/20251011/20168437sNExKFAhFX.png

  • 建立自動佈署要用到的設定值

    • AWS_ROLE_ARN:arn:aws:iam::<ACCOUNT_ID>:role/<ROLE_NAME>
    • AWS_REGION:ap-northeast-1(這邊要填入的是 lambda 所在的區域)

AWS_ROLE_ARN 不確定的話可以直接到 AWS console 上看設定值:
https://ithelp.ithome.com.tw/upload/images/20251011/20168437zvhVnUiknD.png


測試登入

建完 GitHub Secrets,就可以開始測試自動化工作流程啦!

  • 切換到 Actions 分頁 > Run workflow > 選擇 branch > 按下 「Run workflow」
    https://ithelp.ithome.com.tw/upload/images/20251011/20168437owb7ko4gDs.png
⚠️ 如果在 IAM Role 定義的信任政策有限制可用分支,這裡選擇的 branch 就必須要符合設定範圍喔!
  • 執行中
    https://ithelp.ithome.com.tw/upload/images/20251011/20168437zvRlz6L2Hd.png
  • 執行完成
    https://ithelp.ithome.com.tw/upload/images/20251011/20168437XBKclM2lwr.png
  • 點進去可以看到每個步驟的 Log
    https://ithelp.ithome.com.tw/upload/images/20251011/20168437cNGymxUt6q.png

看到 AWS CLI 執行成功,代表 GitHub Actions 已能透過 OIDC 成功登入 AWS。


資訊補充

GitHub 上只有指定要使用哪一個 Role,那是不是有機會透過 OIDC 去 Assume 很多不同的 Role?

可以的!
OIDC 只是為 GitHub Actions 開通一條可以登入 AWS 的通道,並不能決定登入後可以使用哪些角色。

這樣不會很不安全嗎?
要是 GitHub 裡設定了其他 Role 的 ARN 是不是就會拿到不該有的操作權限?

不會!
可以回頭檢視一下設定 IAM Role 時定義的 信任政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Principal": {
                "Federated": "arn:aws:iam::590184072539:oidc-provider/token.actions.githubusercontent.com"
            },
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": [
                        "sts.amazonaws.com"
                    ]
                },
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": [
                        "repo:MinxSu/ITHome-ironman-2025:ref:refs/heads/develop"
                    ]
                }
            }
        }
    ]
}

其中 "Action": "sts:AssumeRoleWithWebIdentity" 就是在定義這個 Role 允許透過 Web Identity 取用。
Condition" 區塊則明確限制了:

  1. OIDC Token 的 aud 必須是 sts.amazonaws.com
  2. Token 的 sub 必須來自特定的 repo 與 branch
    如果這些條件不符合,就算知道 Role ARN 也無法成功 Assume。
    當然,要是 Role 本身沒有這條信任政策,透過 OIDC 嘗試 Assume 同樣會被 AWS 拒絕。

所以並不是透過 OIDC 就能隨意 Assume 任何 Role 喔!


上一篇
Day 26. 一直複製貼上也不是辦法
下一篇
Day 28. 邊寫邊調整的開發日常
系列文
科學的盡頭是玄學?AI占卜小助手與知識庫驗證28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言