Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
如何使用 CodePipeline 在不同 AWS 帳戶部署成品至 Amazon S3?
我想部署成品至不同帳戶的 Amazon Simple Storage Service (Amazon S3) 儲存貯體。我也想使用 AWS CodePipeline 搭配 Amazon S3 部署動作供應相,將目標帳戶設定為物件擁有者。
解決方法
**注意:**下列程序範例假設如下:
- 您擁有兩個帳戶:開發帳戶與生產帳戶。
- 開發帳戶的輸入儲存貯體命名為 codepipeline-input-bucket (啟用版本控制)。
- 開發帳戶的預設成品儲存貯體命名為 codepipeline-us-east-1-0123456789。
- 生產帳戶的輸出儲存貯體命名為 codepipeline-output-bucket。
- 您正在部署開發帳戶的成品至生產帳戶的 S3 儲存貯體。
- 您擔任生產帳戶所建立的跨帳戶角色來部署成品。此角色會讓生產帳戶成為物件擁有者,而非開發帳戶。若要讓生產帳戶儲存貯體擁有者能存取開發帳戶所擁有的物件,請參閱下列文章: 如何使用 CodePipeline 與固定的 ACL 在不同 AWS 帳戶部署成品至 Amazon S3?
建立 AWS KMS key,以便在開發帳戶與 CodePipeline 搭配使用
**重要事項:**您必須使用 AWS Key Management Service (KMS) 客戶受管金鑰進行跨帳戶部署。如未設定金鑰,則 CodePipeline 會利用預設加密來加密物件,目的地帳戶的角色無法將其解密。
1. 在開發帳戶開啟 AWS KMS 主控台。
2. 從導覽窗格選擇客戶受管金鑰。
3. 選擇建立金鑰。
4. 對於金鑰類型,選擇對稱金鑰。
5. 展開進階選項。
6. 對於金鑰材料來源,選擇 KMS。然後選擇下一步。
7. 對於別名,輸入金鑰別名。例如:s3deploykey。
8. 選擇下一步。定義金鑰管理權限頁面隨即開啟。
9. 在 Key administrators (金鑰管理員) 區段,選取 AWS Identity and Access Management (IAM) 使用者或角色作為金鑰管理員。
10.選擇 Next (下一步)。定義金鑰使用權限頁面隨即開啟。
11. 在其他 AWS 帳戶區段,選擇新增其他 AWS 帳戶。
12. 在出現的文字方塊,新增生產帳戶的帳戶 ID。然後選擇下一步。
注意:您也可在此帳戶區段選取現有服務角色。如您選取現有服務角色,請略過更新開發帳戶 KMS 使用政策區段的步驟。
13. 檢閱金鑰政策。然後,選擇完成。
在開發帳戶建立 CodePipeline
1. 開啟 CodePipeline 主控台。然後,選擇建立管道。
2. 對於管道名稱,輸入管道名稱。例如:crossaccountdeploy。
注意:****角色名稱文字方塊會自動填入服務角色名稱 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy。您也可選擇具 KMS 金鑰存取權的其他現有服務角色。
3. 展開進階設定區段。
4. 對於成品存放區,選取預設位置。
注意:如果您的使用案例需要,您可選取自訂位置。
5. 對於加密金鑰,選取客戶受管金鑰。
6. 對於 KMS 客戶受管金鑰,從清單選取金鑰別名 (在此範例為 s3deploykey)。然後選擇下一步。Add source stage (新增來源階段) 頁面隨即開啟。
7.對於 Source provider (來源供應商),選擇 Amazon S3。
8. 對於儲存貯體,輸入開發輸入 S3 儲存貯體的名稱。例如:codepipeline-input-bucket。
**重要事項:**輸入儲存貯體必須啟用版本控制才能與 CodePipeline 搭配使用。
9. 對於 S3 物件金鑰,輸入 sample-website.zip。
重要事項:若要使用 AWS 網站範例而非您自己的網站,請參閱教學課程: 建立使用 Amazon S3 作為部署供應商的管道。然後,在 1 的先決條件搜尋「靜態網站範例」: 部署靜態網站檔案至 Amazon S3 區段。
10. 對於變更偵測選項,請選擇 Amazon CloudWatch Events (建議)。然後選擇下一步。
11. 在新增建置階段頁面,選擇略過建置階段。然後,選擇略過。
12. 在新增部署階段頁面,對於部署供應商,選擇 Amazon S3。
13. 對於區域,選擇生產輸出 S3 儲存貯體所在的 AWS 區域。例如: 美國東部 (維吉尼亞北部)。
**重要事項:**如果生產輸出儲存貯體的區域與管道的區域不同,則您還必須驗證以下內容:
- 您正在使用具多個複本的 AWS KMS 多區域金鑰。
- 您的管道在兩個區域都具成品存放區。
14. 在儲存貯體,輸入生產輸出 S3 儲存貯體名稱。例如:codepipeline-output-bucket。
15. 選取在部署之前解壓縮檔案核取方塊。
注意:如需要,請輸入部署路徑的路徑。
16. 選擇下一步。
17. 選擇建立管道。管道會執行,但來源階段失敗。會出現下列錯誤訊息: 「具 'sample-website.zip' 金鑰的物件不存在。」
本文的上傳網站範例至輸入儲存貯體區段說明如何解決此錯誤。
更新開發帳戶的 KMS 使用政策
**重要事項:**如您正在使用現有 CodePipeline 服務角色,請略過本區段。
1. 在開發帳戶開啟 AWS KMS 主控台。
2. 選取金鑰別名 (在此範例為 s3deploykey)。
3. 在金鑰使用者 區段,選擇新增。
4. 在搜尋方塊輸入服務角色 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy。
5. 選擇新增。
在生產帳戶設定跨帳戶角色
為角色建立 IAM 政策,以便授予 Amazon S3 權限至生產輸出 S3 儲存貯體
1. 在生產帳戶開啟 IAM 主控台。
2. 在瀏覽窗格選擇政策。然後,選擇建立政策。
3. 選擇 JSON 索引標籤。然後,在 JSON 編輯器輸入以下政策:
**重要事項:**將生產輸出 S3 儲存貯體名稱取代 codepipeline-output-bucket。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Put*" ], "Resource": [ "arn:aws:s3:::codepipeline-output-bucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-output-bucket" ] } ] }
4. 選擇檢閱政策。
5. 對於名稱,輸入政策名稱。例如:outputbucketdeployaccess。
6. 選擇建立政策。
為角色建立 IAM 政策,以便授予所需 KMS 權限
1. 在 IAM 主控台,選擇建立政策。
2. 選擇 JSON 索引標籤。然後,在 JSON 編輯器輸入以下政策:
**注意:**取待您所建立的 KMS 金鑰的 ARN。將開發帳戶的成品儲存貯體名稱取代 codepipeline-us-east-1-0123456789。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:<dev-account-id>:key/<key id>" ] }, { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-1-0123456789/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-1-0123456789" ] } ] }
3. 選擇檢閱政策。
4. 對於名稱,輸入政策名稱。例如:devkmss3access。
5. 選擇建立政策。
建立跨帳戶角色,以便開發帳戶可擔任該角色部署成品
1. 在生產帳戶開啟 IAM 主控台。
2. 在瀏覽窗格選擇角色。然後,選擇建立角色。
3. 選擇其他 AWS 帳戶。
4. 對於帳戶 ID,輸入開發帳戶 AWS 帳戶 ID。
5. 選擇下一步: 許可。
6. 從政策清單選取 outputbucketdeployaccess 與 devkmss3access。
7. 選擇下一步: 標籤。
8. (選用) 新增標籤,然後選擇下一步: 檢閱。
9. 對於角色名稱,輸入 prods3role。
10. 選擇建立角色。
11. 從角色清單選擇 prods3role。
12. 選擇信任關係。然後,選擇編輯信任關係。
13. 在政策文件編輯器,輸入下列政策:
**重要事項:**將開發帳戶的 AWS 帳戶 ID 取代 dev-account-id。將管道的服務角色名稱取代 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<dev-account-id>:role/service-role/AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
14. 選擇更新信任政策。
針對開發帳戶 CodePipeline 成品儲存貯體更新其儲存貯體政策
1. 在開發帳戶開啟 Amazon S3 主控台。
2. 在儲存貯體名稱清單,選擇開發帳戶的成品儲存貯體名稱 (在此範例為 codepipeline-us-east-1-0123456789)。
3. 選擇權限。選擇儲存貯體政策。
4. 在文字編輯器,更新現有政策並包含下列政策陳述式:
**重要事項:**若要與適當 JSON 格式保持一致,請在現有陳述式之後加上逗號。將生產帳戶的 AWS 帳戶 ID 取代 prod-account-id。將成品儲存貯體名稱取代 codepipeline-us-east-1-0123456789。
{ "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<prod-account-id>:root" }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<prod-account-id>:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789" }
5. 選擇儲存。
連接政策至開發帳戶的 CodePipeline 服務角色,以允許其擔任您所建立的跨帳戶角色
1. 在開發帳戶開啟 IAM 主控台。
2. 在瀏覽窗格選擇政策。然後,選擇建立政策。
3. 選擇 JSON 索引標籤。然後,在 JSON 編輯器輸入以下政策:
**重要事項:**將生產帳戶的 AWS 帳戶 ID 取代 prod-account-id。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::<prod-account-id>:role/prods3role" ] } }
4. 選擇檢閱政策。
5. 對於名稱,輸入 assumeprods3role。
6. 選擇建立政策。
7. 在瀏覽窗格選擇角色。然後,選擇管道的服務角色名稱 (在此範例為 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy)。
8. 選擇連接政策。然後,選擇 assumeprods3role。
9. 選擇連接政策。
更新管道以便在開發帳戶中使用跨帳戶角色
**注意:**如您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確認您採用的是最新版本 AWS CLI。
1. 執行下列 AWS CLI 命令,擷取管道定義做為名為 codepipeline.json 的檔案:
**重要事項:**將管道名稱取代 crossaccountdeploy。
aws codepipeline get-pipeline --name crossaccountdeploy > codepipeline.json
2. 新增跨帳戶 IAM 角色 ARN (roleArn) 至 codepipeline.json 檔案的部署動作區段。如需詳細資訊,請參閱 CodePipeline 使用者指南的 CodePipeline 管道結構參考。
跨帳戶 IAM roleArn 範例
"roleArn": "arn:aws:iam::your-prod-account id:role/prods3role",
部署動作範例,其中包含跨帳戶 IAM 角色 ARN
**重要事項:**將生產帳戶的 AWS 帳戶 ID 取代 prod-account-id。
{ "name": "Deploy", "actions": [ { "name": "Deploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "provider": "S3", "version": "1" }, "runOrder": 1, "configuration": { "BucketName": "codepipeline-output-bucket", "Extract": "true" }, "outputArtifacts": [], "inputArtifacts": [ { "name": "SourceArtifact" } ], "roleArn": "arn:aws:iam::<prod-account-id>:role/prods3role", "region": "us-east-1", "namespace": "DeployVariables" } ] }
3. 移除 codepipeline.json 檔案結尾的中繼資料區段。
**重要事項:**確保一併移除中繼資料區段之前的逗號。
中繼資料區段範例
"metadata": { "pipelineArn": "arn:aws:codepipeline:us-east-1:<dev-account-id>:crossaccountdeploy", "created": 1587527378.629, "updated": 1587534327.983 }
4. 執行下列命令更新管道:
aws codepipeline update-pipeline --cli-input-json file://codepipeline.json
上傳網站範例至輸入儲存貯體
1. 在開發帳戶開啟 Amazon S3 主控台。
2. 在儲存貯體名稱清單,選擇開發輸入 S3 儲存貯體。例如:codepipeline-input-bucket。
3. 選擇上傳。然後,選擇新增文件。
4. 選取之前下載的 sample-website.zip 檔案。
5. 選擇上傳並執行管道。當執行管道時,會發生下列情況:
- 來源動作會從開發輸入 S3 儲存貯體 (codepipeline-input-bucket) 選取 sample-website.zip。然後,來源動作會將 zip 檔案做為來源成品放在開發帳戶的成品儲存貯體內 (codepipeline-us-east-1-0123456789)。
- 在部署動作,CodePipeline 服務角色 (AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy) 會在生產帳戶擔任跨帳戶角色 (prods3role)。
- CodePipeline 會使用跨帳戶角色 (prods3role) 存取開發帳戶的 KMS 金鑰與成品儲存貯體。然後,CodePipeline 會部署擷取檔案至生產帳戶的生產輸出 S3 儲存貯體 (codepipeline-output-bucket)。
**注意:**生產帳戶是生產輸出 S3 儲存貯體 (codepipeline-output-bucket) 的擷取物件擁有者。

相關內容
- 已提問 5 個月前lg...
- 已提問 9 個月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 4 年前
- AWS 官方已更新 1 年前