Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何使用 CodePipeline 在不同帳戶部署 AWS CloudFormation 堆疊?
我想使用 AWS CodePipeline 在不同 AWS 帳戶部署 AWS CloudFormation 堆疊。
簡短說明
若要使用 CodePipeline 在不同 AWS 帳戶部署 CloudFormation 堆疊,請執行下列步驟:
**注意:需使用兩個帳戶來建立管道並部署 CloudFormation 堆疊。帳戶 1 用於建立管道,而帳戶 2 **用於部署 CloudFormation 堆疊。
1. (帳戶 1) 建立客戶受管 AWS Key Management Service (KMS) 金鑰,並向下列項目授予金鑰使用權限:
- 帳戶 1 CodePipeline 服務角色
- 帳戶 2
2. (帳戶 1) 使用儲存貯體政策建立 Amazon Simple Storage Service (Amazon S3) 儲存貯體,以便授予帳戶 2 儲存貯體存取權限。
3. (帳戶 2) 建立跨帳戶 AWS Identity and Access Management (IAM) 角色,以允許下列內容:
- CloudFormation API 動作
- 存取帳戶 1 的 Amazon S3 儲存貯體
- 利用帳戶 1 的客戶受管 AWS KMS key 進行解密
4. (帳戶 1) 為帳戶 1 CodePipeline 服務角色新增 AssumeRole 權限,以便允許其擔任帳戶 2 的跨帳戶角色。
5. (帳戶 2) 為 CloudFormation 堆疊建立服務角色,其中包含堆疊部署的服務所需權限。
6. (帳戶 1) 更新帳戶 1 的 CodePipeline 組態,以便包含與帳戶 2 相關聯的資源。
解決方法
(帳戶 1) 建立客戶受管 AWS KMS key,並向帳戶 1 的 CodePipeline 服務角色與帳戶 2 授予使用權限
1. 在帳戶 1,開啟 AWS KMS 主控台。
2. 從導覽窗格選擇客戶受管金鑰。
3. 選擇建立金鑰。接著選擇對稱。
注意:在進階選項區段保留 KMS 作為來源。
4. 針對別名,請輸入金鑰名稱。
5. (選用) 根據使用案例新增標籤。然後選擇下一步。
6. 在定義金鑰管理權限頁面中,針對金鑰管理員,選擇 AWS Identity and Access Management (IAM) 使用者。也可新增其他您欲擔任金鑰管理員的使用者或群組。然後選擇下一步。
7. 在定義金鑰使用權限頁面,針對此帳戶新增您欲擁有金鑰存取權的 IAM 身分。例如: CodePipeline 服務角色。
8. 在其他 AWS 帳戶區段,選擇新增其他 AWS 帳戶。接著在帳戶 2 輸入 IAM 角色的 Amazon Resource Name (ARN)。
9. 選擇下一步。接著選擇完成。
10. 在客戶受管金鑰區段,選擇您剛建立的金鑰。接著複製金鑰 ARN。
**重要事項:**在更新管道及設定 IAM 政策時必須擁有 AWS KMS key 的 ARN。
(帳戶 1) 利用儲存貯體政策建立 Amazon S3 儲存貯體,以便向帳戶 2 授予儲存貯體存取權
1. 在帳戶 1,開啟 Amazon S3 主控台。
2. 選擇現有 Amazon S3 儲存貯體或建立新 S3 儲存貯體,以便作為 CodePipeline 的ArtifactStore。
**注意:**成品可包含堆疊範本檔案、範本組態檔案或兩者。CodePipeline 會使用這些成品來處理 CloudFormation 堆疊與變更集。在範本組態檔案中,您必須指定範本參數值、堆疊政策與標籤。
3. 在儲存貯體的 Amazon S3 詳細資料頁面選擇授權。
4. 選擇儲存貯體政策。
5. 在儲存貯體政策編輯器,輸入下列政策:
重要事項:以 CodePipeline 的SourceArtifact 儲存貯體名稱取代 codepipeline-source-artifact。以帳戶 2 的帳號取代 ACCOUNT_B_NO。
{ "Id": "Policy1553183091390", "Version": "2012-10-17", "Statement": [{ "Sid": "", "Action": [ "s3:Get*", "s3:Put*" ], "Effect": "Allow", "Resource": "arn:aws:s3:::codepipeline-source-artifact/*", "Principal": { "AWS": [ "arn:aws:iam::ACCOUNT_B_NO:root" ] } }, { "Sid": "", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": "arn:aws:s3:::codepipeline-source-artifact", "Principal": { "AWS": [ "arn:aws:iam::ACCOUNT_B_NO:root" ] } } ] }
6. 選擇儲存。
(帳戶 2) 建立跨帳戶 IAM 角色
建立允許下列項目的 IAM 政策:
- 以帳戶 1 的管道擔任帳戶 2 的跨帳戶 IAM 角色
- CloudFormation API 動作
- 與 SourceArtifact 相關聯的 Amazon S3 API 動作
1. 在帳戶 2,開啟 IAM 主控台。
2. 在瀏覽窗格選擇政策。接著選擇建立政策。
3. 選擇 JSON 索引標籤。接著在 JSON 編輯器輸入以下政策:
**重要事項:**以管道成品存放區的儲存貯體名稱取代 codepipeline-source-artifact。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "cloudformation:*", "iam:PassRole" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:Put*", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-source-artifact/*" ] } ] }
4. 選擇檢閱政策。
5. 對於名稱,輸入政策名稱。
6. 選擇建立政策。
建立第二個 IAM 政策,以允許 AWS KMS API 動作
1. 在帳戶 2,開啟 IAM 主控台。
2. 在瀏覽窗格選擇政策。接著選擇建立政策。
3. 選擇 JSON 索引標籤。接著在 JSON 編輯器輸入以下政策:
**重要事項:**以先前複製的 AWS KMS key 的 ARN 取代 arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id" ] }] }
4. 選擇檢閱政策。
5. 對於名稱,輸入政策名稱。
6. 選擇建立政策。
使用建立的政策來建立跨帳戶 IAM 角色
1. 在帳戶 2,開啟 IAM 主控台。
2. 在瀏覽窗格選擇角色。
3. 選擇建立角色。
4. 選擇其他 AWS 帳戶。
5. 對於帳戶 ID,輸入帳戶 1 帳戶 ID。
6. 選擇下一步: 權限。接著完成建立 IAM 角色的步驟。
7. 將跨帳戶角色政策與 KMS 金鑰政策連接至您建立的角色。如需說明,請參閱新增及移除 IAM 身分授權。
(帳戶 1) 新增 AssumeRole 權限至帳戶 1 CodePipeline 服務角色,以允許其擔任帳戶 2 的跨帳戶角色
1. 在帳戶 1,開啟 IAM 主控台。
2. 在瀏覽窗格選擇角色。
3. 選擇用於 CodePipeline 的 IAM 服務角色。
4. 選擇新增內嵌政策。
5. 選擇 JSON 索引標籤。接著在 JSON 編輯器輸入以下政策:
重要事項:以帳戶 2 的帳號取代 ACCOUNT_B_NO。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::ACCOUNT_B_NO:role/*" ] } }
6. 選擇檢閱政策,然後建立政策。
(帳戶 2) 為 CloudFormation 堆疊建立服務角色,其中包含堆疊部署的服務所需權限
**注意:**此服務角色可直接於帳戶 2 的 CloudFormation 堆疊加以設定。角色必須包含權限以供堆疊部署的服務使用。
1. 在帳戶 2,開啟 IAM 主控台。
2. 在瀏覽窗格選擇角色。
3. 為 AWS CloudFormation 建立角色,以便代表您啟動服務時使用。
4. 根據使用案例,套用權限至角色。
**重要事項:**請確認信任政策適用於 AWS CloudFormation,且角色具權限可存取堆疊部署的服務。
(帳戶 1) 更新 CodePipeline 組態,以便包含與帳戶 2 相關聯的資源
**注意:**如執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確認您執行的是最新版本 AWS CLI。
若管道使用與其他帳戶相關聯的資源,則無法使用 CodePipeline 主控台建立或編輯該管道。然而,您可使用主控台建立管道的一般結構。接著您可使用 AWS CLI 編輯管道,並新增與其他帳戶相關聯的資源。或者,您可利用新管道的資源更新目前管道。如需詳細資訊,請參閱在 CodePipeline 建立管道。
1. 執行下列 AWS CLI 命令,取得管道 JSON 結構:
aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json
2. 在本機 pipeline.json 檔案,確認 artifactStore 的 encryptionKey ID 包含 AWS KMS key 的 ARN ID。
**注意:**如需管道結構詳細資訊,請參閱 AWS CLI 命令參考的 create-pipeline。
3. 在 pipeline.json 檔案中,更新 AWS CloudFormation 動作組態。
**注意:**管道動作組態 JSON 結構之内的 RoleArn 是 CloudFormation 堆疊角色 (CFN_STACK_ROLE)。動作組態 JSON 結構之外的 roleArn 是跨帳戶角色,而管道擔任該角色以運作 CloudFormation 堆疊 (CROSS_ACCOUNT_ROLE)。
4. 確認角色已針對下列兩項更新:
- 管道動作組態 JSON 結構之內的 RoleArn。
- 管道動作組態 JSON 結構之外的 roleArn。
**注意:**在下列程式碼範例之中,RoleArn 作為向 AWS CloudFormation 傳遞的角色以啟動堆疊。CodePipeline 使用 roleArn 操作 AWS CloudFormation 堆疊。
{ "name": "Prod_Deploy", "actions": [{ "inputArtifacts": [{ "name": "MyApp" }], "name": "test-cfn-x", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CloudFormation" }, "outputArtifacts": [], "configuration": { "ActionMode": "CHANGE_SET_REPLACE", "ChangeSetName": "test", "RoleArn": "ARN_FOR_CFN_STACK_ROLE", "Capabilities": "CAPABILITY_IAM", "StackName": "test-cfn-sam", "TemplatePath": "MyApp::template.yaml" }, "roleArn": "ARN_FOR_CROSS_ACCOUNT_ROLE", "runOrder": 1 }] }
5. 從 pipeline.json 檔案移除中繼資料組態。例如:
"metadata": { "pipelineArn": "arn:aws:codepipeline:REGION:ACC:my_test", "updated": 1551216777.183, "created": 1551207202.964 }
重要事項:若要跟適當 JSON 格式保持一致,請移除中繼資料區段前的逗號。
6. (選用) 若要建立管道並更新 JSON 結構,請執行下列命令,利用新組態檔案更新管道:
aws codepipeline update-pipeline --cli-input-json file://pipeline.json
7. (選用) 若要使用目前管道並更新 JSON 結構,請執行下列命令建立新管道:
aws codepipeline create-pipeline --cli-input-json file://pipeline.json
**重要事項:**請在 pipeline.json 檔案確認已為新管道變更名稱。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 7 個月前
- 已提問 3 年前