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

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

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

您可能希望建立一個管道,該管道使用由另一個 AWS 帳戶建立或管理的資源。例如,您可能想要將一個帳戶用於管道,將另一個帳戶用於 CodeDeploy 資源。

注意

使用來自多個帳戶的動作建立管道時,您必須設定帳戶,讓它們在跨帳戶管道的限制內仍可存取成品。以下限制適用於跨帳戶動作:

  • 通常,若為下列情況,動作只能取用一個成品:

    • 動作與管道帳戶 OR 位於同一帳戶

    • 已在道管帳戶中為另一個帳戶 OR 中的動作建立成品

    • 與此動作位於同一帳戶的前一動作已產生成品

    換言之,您無法將成品從一個帳戶傳遞至另一個帳戶,如果任一帳戶都不是管道帳戶的話。

  • 以下動作類型不支援跨帳戶動作:

    • Jenkins 建置動作

在此範例中,您必須建立要使用的 AWS Key Management Service (AWS KMS) 金鑰、將金鑰新增至管道,以及設定帳戶政策和角色以啟用跨帳戶存取。對於 AWS KMS 金鑰,您可以使用金鑰 ID、金鑰 ARN 或別名 ARN。

注意

別名只能在建立 KMS 金鑰的帳戶中識別。如果是跨帳戶動作,您只可以使用金鑰 ID 或金鑰 ARN 來識別金鑰。跨帳戶動作涉及使用來自其他帳戶 (AccountB) 的角色,因此指定金鑰 ID 將使用其他帳戶 (AccountB) 中的金鑰。

在此逐步教學和其範例中,AccountA​ 是最初用於建立管道的帳戶。它可以存取用於存放管道成品的 Amazon S3 儲存貯體,以及 所使用的服務角色 AWS CodePipeline。AccountB 是最初用於建立 CodeDeploy 應用程式、部署群組和 CodeDeploy 使用的服務角色的帳戶。

若要讓 AccountA 編輯管道以使用 AccountB 建立的 CodeDeploy 應用程式,AccountA 必須:

  • 請求 AccountB 的 ARN 或帳戶 ID (在此逐步教學中,AccountB ID 為 012ID_ACCOUNT_B)。

  • 在管道的 區域中建立或使用 AWS KMS 客戶受管金鑰,並將使用該金鑰的許可授予服務角色 (CodePipeline_Service_Role) 和 AccountB

  • 建立 Amazon S3 儲存貯體政策,授予 AccountB 對 Amazon S3 儲存貯體的存取權 (例如,codepipeline-us-east-2-1234567890)。

  • 建立允許 AccountA 擔任 AccountB 所設定角色的政策,並將該政策連接至服務角色 (CodePipeline_Service_Role)。

  • 編輯管道以使用客戶受管 AWS KMS 金鑰,而非預設金鑰。

若要讓 AccountB​ 允許其資源存取在 AccountA​ 中建立的管道,AccountB​ 必須:

  • 請求 AccountA 的 ARN 或帳戶 ID (在此逐步教學中,AccountA ID 為 012ID_ACCOUNT_A)。

  • 建立套用至針對 CodeDeploy 設定的 Amazon EC2 執行個體角色的政策,以允許存取 Amazon S3 儲存貯體 (codepipeline-us-east-2-1234567890)。

  • 建立套用至針對 CodeDeploy 設定的 Amazon EC2 執行個體角色的政策,允許存取用於加密 AccountA 中管道成品 AWS KMS 的客戶受管金鑰。

  • 設定並連接具有信任關係政策的 IAM 角色 (CrossAccount_Role),允許 AccountA 中的 CodePipeline 服務角色擔任該角色。

  • 建立允許存取管道所需部署資源的政策,並將其連接至 CrossAccount_Role

  • 建立允許存取 Amazon S3 儲存貯體 (codepipeline-us-east-2-1234567890) 的政策,並將其連接至 CrossAccount_Role

必要條件:建立 AWS KMS ​ 加密金鑰

客戶受管金鑰專屬於區域,所有 AWS KMS 金鑰也是如此。您必須在建立管道的相同區域中建立客戶受管 AWS KMS 金鑰 (例如 us-east-2)。

在 中建立客戶受管金鑰 AWS KMS
  1. AWS Management Console 使用 AccountA 登入 並開啟 AWS KMS 主控台。

  2. 在左側選擇 Customer managed keys (客戶受管金鑰)

  3. 選擇建立金鑰。在 Configure key (設定金鑰) 中,保持 Symmetric (對稱) 預設值的選取狀態,然後選擇 Next (下一步)

  4. Alias (別名) 中輸入用於此金鑰的別名 (例如 PipelineName-Key)。為此金鑰提供說明和標籤 (選用),然後選擇 Next (下一步)

  5. 定義金鑰管理許可中,選擇您要擔任此金鑰管理員的角色,然後選擇下一步

  6. 定義金鑰使用許可中,在此帳戶下,選取管道的服務角色名稱 (例如 CodePipeline_Service_Role)。在其他 AWS 帳戶下,選擇新增另一個 AWS 帳戶。為 AccountB 輸入帳戶 ID 以完成 ARN,然後選擇 Next (下一步)

  7. Review and edit key policy (檢閱和編輯金鑰政策) 中檢閱政策,然後選擇 Finish (完成)

  8. 從金鑰清單中選擇您的金鑰別名,並複製其 ARN (例如 arn:aws:kms:us-east-2:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE​)。在您編輯管道和設定政策時將需要用到這項資料。

步驟 1:設定帳戶政策與角色

建立 AWS KMS 金鑰之後,您必須建立並連接政策,以啟用跨帳戶存取。這將需要 AccountA​ 和 AccountB​ 的動作。

在建立管道的帳戶 (AccountA) 中設定政策和角色

若要建立使用與另一個 AWS 帳戶相關聯之 CodeDeploy 資源的管道,AccountA 必須為用於存放成品的 Amazon S3 儲存貯體和 CodePipeline 的服務角色設定政策。

為授予 AccountB 存取權的 Amazon S3 儲存貯體建立政策 (主控台)
  1. AWS Management Console 使用 AccountA 登入 ,並開啟 Amazon S3 主控台,網址為 https://https://console.aws.amazon.com/s3/

  2. 在 Amazon S3 儲存貯體清單中,選擇儲存管道成品的 Amazon S3 儲存貯體。此儲存貯體名為 codepipeline-region-1234567EXAMPLE,其中 region 是您建立管道 AWS 的區域,而 1234567EXAMPLE 是十位數的隨機數字,可確保儲存貯體名稱是唯一的 (例如codepipeline-us-east-2-1234567890)。

  3. 在 Amazon S3 儲存貯體的詳細資訊頁面上,選擇屬性

  4. 在屬性窗格中,展開 Permissions (許可),然後選擇 Add bucket policy (新增儲存貯體政策)

    注意

    如果政策已連接至您的 Amazon S3 儲存貯體,請選擇編輯儲存貯體政策。然後,您可以按以下範例新增陳述式至現有政策。若要新增政策,請選擇連結,然後遵循 AWS 政策產生器中的指示。如需詳細資訊,請參閱 IAM 政策概觀

  5. Bucket Policy Editor (儲存貯體政策編輯器)​ 視窗中,輸入以下政策。這可讓 AccountB​ 存取管道成品,並授與 AccountB​ 在動作 (例如自訂來源或建置動作) 建立輸出成品時將其新增的能力。

    在下列範例中,​AccountB 的 ARN 為 ​012ID_ACCOUNT_B。Amazon S3 儲存貯體的 ARN 是 codepipeline-us-east-2-1234567890。將這些 ARNs 取代為您想要允許存取的帳戶 ARN,以及 Amazon S3 儲存貯體的 ARN:

    { "Version": "2012-10-17", "Id": "SSEAndSSLPolicy", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*", "Condition": { "Bool": { "aws:SecureTransport": false } } }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root" }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890" } ] }
  6. 選擇 Save (儲存),然後關閉政策編輯器。

  7. 選擇儲存以儲存 Amazon S3 儲存貯體的許可。

為 CodePipeline 的服務角色建立政策 (主控台)
  1. AWS Management Console 使用 AccountA 登入 ,並開啟 IAM 主控台,網址為 https://https://console.aws.amazon.com/iam/.。

  2. 在導覽窗格中,選擇角色

  3. 在角色清單中的角色名稱下,選擇 CodePipeline 的服務角色名稱。

  4. 許可標籤上,選擇新增內嵌政策

  5. 選擇 JSON 索引標籤,然後輸入下列政策,以允許 AccountB 擔任該角色。在下列範例中,​012ID_ACCOUNT_B​AccountB 的 ARN:

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::012ID_ACCOUNT_B:role/*" ] } }
  6. 選擇檢閱政策

  7. ​Name (名稱) 中,輸入此政策的名稱。選擇 建立政策

在擁有 AWS 資源的帳戶中設定政策和角色 (AccountB)

當您在 CodeDeploy 中建立應用程式、部署和部署群組時,您也可以建立 Amazon EC2 執行個體角色。(若您使用執行部署逐步說明精靈,將為您建立此角色,但您也可以手動建立角色。)​ 若要讓在 AccountA 中建立的管道使用 AccountB 中建立的 CodeDeploy 資源,您必須:

  • 設定執行個體角色的政策,允許其存取儲存管道成品的 Amazon S3 儲存貯體。

  • 在為跨帳戶存取設定的 AccountB 中建立第二個角色。

    第二個角色不僅必須能夠存取 AccountA 中的 Amazon S3 儲存貯體,還必須包含允許存取 CodeDeploy 資源的政策,以及允許 AccountA 中的 CodePipeline 服務角色擔任該角色的信任關係政策。

    注意

    這些政策專用於設定 CodeDeploy 資源,以便在使用不同 AWS 帳戶建立的管道中使用。其他 AWS 資源將需要特定於其資源需求的政策。

為針對 CodeDeploy 設定的 Amazon EC2 執行個體角色建立政策 (主控台)
  1. AWS Management Console 使用 AccountB 登入 ,並開啟 IAM 主控台,網址為 https://https://console.aws.amazon.com/iam/.。

  2. 在導覽窗格中,選擇角色

  3. 在角色清單中的角色名稱下,選擇做為 CodeDeploy 應用程式 Amazon EC2 執行個體角色的服務角色名稱。此角色名稱可能不同,且部署群組可使用一個以上的執行個體角色。如需詳細資訊,請參閱為您的 Amazon EC2 執行個體建立 IAM 執行個體描述檔。

  4. 許可標籤上,選擇新增內嵌政策

  5. 選擇 JSON 索引標籤,然後輸入下列政策,以授予 AccountA 用來存放管道成品的 Amazon S3 儲存貯體存取權 (在此範例中為 codepipeline-us-east-2-1234567890):

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890" ] } ] }
  6. 選擇檢閱政策

  7. ​Name (名稱) 中,輸入此政策的名稱。選擇 建立政策

  8. 為 建立第二個政策, AWS KMS 其中 arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE是在 AccountA 中建立的客戶受管金鑰 ARN,並設定為允許 AccountB 使用它:

    { "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:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE" ] } ] }
    重要

    您必須使用此政策中 AccountA 的帳戶 ID 做為 AWS KMS 金鑰資源 ARN 的一部分,如下所示,否則政策將無法運作。

  9. 選擇檢閱政策

  10. ​Name (名稱) 中,輸入此政策的名稱。選擇 建立政策

現在建立用於跨帳戶存取的 IAM 角色,並加以設定,讓 AccountA 中的 CodePipeline 服務角色可以擔任該角色。此角色必須包含允許存取 CodeDeploy 資源和用於在 AccountA 中存放成品的 Amazon S3 儲存貯體的政策。

在 IAM 中設定跨帳戶角色
  1. AWS Management Console 使用 AccountB 登入 ,並開啟 IAM 主控台,網址為 https://https://console.aws.amazon.com/iam.。

  2. 在導覽窗格中,選擇 Roles (角色)。選擇 Create Role (建立角色)。

  3. Select type of trusted entity (選取信任的實體類型) 下,選擇 Another AWS account (另一個 帳戶)。在指定可使用此角色的帳戶下,在 AWS 帳戶 ID 中輸入將在 CodePipeline (AccountA) 中建立管道之帳戶的帳戶 ID,然後選擇下一步:許可

    重要

    此步驟建立在 AccountBAccountA 之間的信任關係政策。​ 不過,這會授予帳戶的根層級存取權,而 CodePipeline 建議將其縮小到 AccountA 中的 CodePipeline 服務角色。遵循步驟 16 來限制許可。

  4. 連接許可政策下,選擇 AmazonS3ReadOnlyAccess,然後選擇下一步:標籤

    注意

    這並非您將使用的政策。您必須選擇一個政策以完成精靈。

  5. 選擇下一步:檢閱。在角色名稱中輸入此角色的名稱 (例如 CrossAccount_Role)。只要符合 IAM 中的命名慣例,您就可以將此角色命名為任何您想要的名稱。可考慮給予角色清楚說明其用途的名稱。選擇建立角色

  6. 從角色清單中,選擇您剛建立的角色 (例如 CrossAccount_Role),以開啟該角色的摘要頁面。

  7. 許可標籤上,選擇新增內嵌政策

  8. 選擇 JSON 索引標籤,然後輸入下列政策以允許存取 CodeDeploy 資源:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision" ], "Resource": "*" } ] }
  9. 選擇檢閱政策

  10. ​Name (名稱) 中,輸入此政策的名稱。選擇 建立政策

  11. 許可標籤上,選擇新增內嵌政策

  12. 選擇 JSON 索引標籤,然後輸入下列政策,以允許此角色從 AccountA 中的 Amazon S3 儲存貯體擷取輸入成品,並將輸出成品放入其中:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" ] } ] }
  13. 選擇檢閱政策

  14. ​Name (名稱) 中,輸入此政策的名稱。選擇 建立政策

  15. 許可索引標籤上,在政策名稱下的政策清單中尋找 AmazonS3ReadOnlyAccess,然後選擇政策旁邊的刪除圖示 (X)。出現提示時,選擇 Detach (分離)

  16. 選取信任關係索引標籤,然後選擇編輯信任政策。選擇左欄上的新增委託人選項。針對主體類型,選擇 IAM 角色,然後在 AccountA 中提供 CodePipeline 服務角色的 ARN。arn:aws:iam::Account_A:rootAWS 委託人清單中移除 ,然後選擇更新政策

步驟 2:編輯管道

您無法使用 CodePipeline 主控台來建立或編輯使用與其他 AWS 帳戶相關聯資源的管道。不過,您可以使用 主控台建立管道的一般結構,然後使用 AWS CLI 編輯管道並新增這些資源。或者,您可以使用現有管道的架構,並手動將資源加入其中。

新增與另一個 AWS 帳戶相關聯的資源 (AWS CLI)
  1. 在終端機 (Linux、macOS 或 Unix) 或命令提示字元 (Windows) 中,對您要新增資源的管道執行 get-pipeline命令。複製命令輸出到 JSON 檔案。例如,對於名為 MyFirstPipeline 的管道,您可以輸入類似如下的內容:

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    輸出會傳送至 pipeline.json 檔案。

  2. 在任何純文字編輯器中開啟 JSON 檔案。在成品存放"type": "S3"區中,新增 KMS encryptionKey、ID 和類型資訊,其中 codepipeline-us-east-2-1234567890 是用於存放管道成品的 Amazon S3 儲存貯體名稱arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE,也是您剛建立之客戶受管金鑰的 ARN:

    { "artifactStore”: { "location": "codepipeline-us-east-2-1234567890", "type": "S3", "encryptionKey": { "id": "arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE", "type": "KMS" } },
  3. 在階段中新增部署動作,以使用與 AccountB 相關聯的 CodeDeploy 資源,包括您建立的跨帳戶角色 (CrossAccount_Role) roleArn的值。

    下列範例顯示 JSON 新增名為 ExternalDeploy​ 的部署動作。它使用在名為預備的階段中,在 AccountB 中建立的 CodeDeploy 資源。在下列範例中,AccountB 的 ARN 為 012ID_ACCOUNT_B

    , { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyAppBuild" } ], "name": "ExternalDeploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "AccountBApplicationName", "DeploymentGroupName": "AccountBApplicationGroupName" }, "runOrder": 1, "roleArn": "arn:aws:iam::012ID_ACCOUNT_B:role/CrossAccount_Role" } ] }
    注意

    這並非適用於整個管道的 JSON,只是階段中動作的結構。

  4. 您必須從檔案移除 metadata 行,以讓 update-pipeline 命令可以使用它。從 JSON 檔案的管道結構移除此區段 ("metadata": { } 行以及 "created""pipelineARN""updated" 欄位)。

    例如,從結構中移除下列幾行:

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" }

    儲存檔案。

  5. 若要套用您的變更,請執行 update-pipeline 命令,並指定管道 JSON 檔案,與下面類似:

    重要

    請確認在檔案名稱之前包含 file://。這是此命令必要項目。

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    此命令會傳回所編輯管道的整個結構。

測試使用與其他 AWS 帳戶相關聯資源的管道
  1. 在終端機 (Linux、macOS 或 Unix) 或命令提示字元 (Windows) 執行 start-pipeline-execution命令,指定管道的名稱,如下所示:

    aws codepipeline start-pipeline-execution --name MyFirstPipeline

    如需詳細資訊,請參閱手動啟動管道

  2. AWS Management Console 使用 AccountA 登入 ,並開啟 CodePipeline 主控台,網址為 https://http://console.aws.amazon.com/codesuite/codepipeline/home.。

    與 AWS 您的帳戶相關聯的所有管道名稱都會顯示。

  3. Name (名稱) 中,選擇您剛編輯的管道名稱。這會開啟管道的詳細檢視,包含管道中各階段的每項動作之狀態。

  4. 從管道觀看進度。等待使用與另一個 AWS 帳戶相關聯資源之動作的成功訊息。

    注意

    若您在使用 AccountA​ 登入的情況下嘗試檢視動作的詳細資訊,將收到錯誤訊息。登出,然後使用 AccountB 登入以檢視 CodeDeploy 中的部署詳細資訊。