如何使用 CodePipeline 在不同帳戶部署 AWS CloudFormation 堆疊?

4 分的閱讀內容
0

我想使用 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 檔案,確認 artifactStoreencryptionKey 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 檔案確認已為新管道變更名稱。


相關資訊

在 CodePipeline 建立管道以使用其他 AWS 帳戶的資源

CodePipeline 管道結構參考

AWS 官方
AWS 官方已更新 1 年前