如何使用 CodePipeline 在不同 AWS 帳戶部署成品至 Amazon S3?

4 分的閱讀內容
0

我想部署成品至不同帳戶的 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.    在金鑰管理員 區段,選取 AWS Identity and Access Management (IAM) 使用者或角色作為金鑰管理員。

  1. 選擇下一步定義金鑰使用權限頁面隨即開啟。

11.    在其他 AWS 帳戶區段,選擇新增其他 AWS 帳戶

12.    在出現的文字方塊,新增生產帳戶的帳戶 ID。然後選擇下一步

注意:您也可在此帳戶區段選取現有服務角色。如您選取現有服務角色,請略過更新開發帳戶 KMS 使用政策區段的步驟。

13.    檢閱金鑰政策。然後,選擇完成

在開發帳戶建立 CodePipeline

1.    開啟 CodePipeline 主控台。然後,選擇建立管道

2.    對於管道名稱,輸入管道名稱。例如:crossaccountdeploy

注意:****角色名稱文字方塊會自動填入服務角色名稱 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy。您也可選擇具 KMS 金鑰存取權的其他現有服務角色。

3.    展開進階設定區段。

4.    對於成品存放區,選取預設位置
注意:如果您的使用案例需要,您可選取自訂位置

5.    對於加密金鑰,選取客戶受管金鑰

6.    對於 KMS 客戶受管金鑰,從清單選取金鑰別名 (在此範例為 s3deploykey)。然後選擇下一步新增來源階段頁面隨即開啟。

  1. 對於來源供應商,選擇 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 區域。例如: 美國東部 (維吉尼亞北部)

**重要事項:**如果生產輸出儲存貯體的區域與管道的區域不同,則您還必須驗證以下內容:

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.    從政策清單選取 outputbucketdeployaccessdevkmss3access

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) 的擷取物件擁有者。


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