如何使用 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 檔案確認已為新管道變更名稱。
相關資訊
相關內容
- 已提問 2 個月前lg...
- 已提問 2 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 個月前