在上一篇文章中,我們第一次動手建立了一個 GitHub Actions Workflow,讓程式碼 Push 到 Repo 時就能觸發自動化流程,並且跑出一個最基礎的 CDK Deploy 範例。
不過,,在昨天中我們沒有真正的部署任何資源到 AWS 上
於是我們今天的目標就是讓我們的 GitHub Actions Workflow 「安全地」取得 AWS 權限來執行部署
還記得我們在 Day4 使用 CLI 介面與 AWS 互動時時創建了 IAM User,當時使用了Access Key 和 Secret Key才使得我們的終端取得了調用 AWS 資源的權限
那麼,在 CI/CD 的情境下,我們是不是也能直接把這組金鑰放進 GitHub Secrets 裡,讓 Workflow 在執行時讀取憑證呢?
這其實是最直覺、也是很多人第一時間會想到的做法。:
但這個做法其實還是有它的缺點,因為 IAM User 是一組長期有效的金鑰,一旦外洩,等於把你 AWS 帳號的鑰匙交給別人。而為了避免這樣的風險,我們就需要一個更安全、更彈性的方式 —— 這就是 IAM Role + OIDC Provider 的登場時機。
在今天的內容裡,我們會:
1.建立一個 IAM Role,專門給 GitHub Actions 使用
2.透過 OIDC Provider 讓 AWS 信任 GitHub,讓 Workflow 能在執行時自動「臨時換取憑證」,而不是使用長期金鑰。
OIDC (OpenID Connect) 聽起來很陌生,但其實每天都會用到。
當你註冊一個新網站時,應該都看過這樣的按鈕:
這些就是 OIDC( OpenID Connect) 在你生活中的應用。
它的運作方式大概是這樣:
這樣一來,你不用每個網站都記一堆密碼,也不用擔心帳號外洩,因為 驗證交給可信任的身份提供者 (Identity Provider, IdP)。
把剛剛的例子換成我們的 CI/CD 流程:
流程大概是這樣:
my-org/my-repo
,這是它的身份票券。」所以回到我們的目標,你大概會發現我們需要先創建一個 IAM Role 並設定他的 Trust Policy
**Permission Policy & Trust Policy
在之前的文章中 我們提及了 IAM 中權限的基礎Policy和Statement。但其實,在 IAM Role中,Policy還能夠再細分為 Trust Policy 以及 Permission Policy。
關於 AWS 與 Github Actions 的 OIDC 設定,Github 很貼心的推出了官方 Document 來教你怎麼樣串接,三大雲服務商皆有,有興趣的可以看一下,而接下來我將會帶你走過在 AWS 上串接 OIDC 的流程。
根據 GitHub 官方文件 與 AWS 安全最佳實踐,以下是設定 GitHub Actions 使用 AWS OIDC 身份聯盟(OIDC) 的推薦步驟:
在 AWS Console → IAM → 身分供應商 (Identity Provider) → 新增供應商 (Provider):
https://token.actions.githubusercontent.com
sts.amazonaws.com
這樣 AWS 就能信任由 GitHub Actions 簽發的 OIDC Token。
建立一個專屬的 IAM Role,允許 GitHub Actions 透過 OIDC 來 AssumeRole:
在下方選單中選擇剛剛創建的 OIDC Identity Provider,並填入你的Github Repo的相關資訊
最佳實務而言,我們應該為這個 Role 授予 最小權限(Principle of Least Privilege),例如:
但為了快速學習,我們這裡先將權限開到最大確保他動得起來XD
基於我們之前創建的 Workflow 中加入下面的permission和steps:
permissions:
id-token: write # 必須開啟,才能請求 OIDC Token
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/YourRoleName
aws-region: ap-east-1
- name: CDK Deploy
run: cdk deploy --require-approval never
arn號碼是AWS中用於辨識服務實體的編號,在這裡是指我們剛剛創建的 IAM Role
你可以在Console中點入你的Role的名稱來找到arn號碼,複製貼上於role-to-assume就對了!
當workflow執行時,可以看到Github Acitons成功執行了cdk deploy 只不過因為先前創建的L2 Bucket無法透過cdk來刪除,所以礙於s3 bucket的命名唯一性在L2 bucket的部分失敗了XD
當我們修改CDK的內容並重新commit至Github後
可以看到我們的自動化部署正式成功了!
可以在CloudFormation上看到我們部署的結果
最後我們來比較一下傳統常用的GitHub Secrets 金鑰管理方式和今天所介紹的 OIDC + IAM ROLE 的優劣勢!
方法 | GitHub Secrets(Access Key & Secret Key) | OIDC + IAM Role |
---|---|---|
安全性 | 長期金鑰,外洩風險大 | 無長期金鑰,臨時憑證,自動過期 |
權限管理 | 靠 IAM User | IAM Role,權限控制方便 |
維護成本 | 需要手動輪替金鑰 | 無需輪替,AWS 自動處理 |
最佳實踐 | ❌ 不建議 | ✅ 官方推薦 |
今天就正式完成了自動化部署的 Pipeline 建置!,從一開始只會 Console 點點到現在撰寫 IaC 並用 CI/CD 工具自動化部署流程是一段感人的旅程,希望各位對於今天的內容滿意!