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

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

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

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

注意

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

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

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

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

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

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

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

    • Jenkins 建置動作

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

注意

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

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

Account A A 若要編輯管道以使用 Account B 建立的 CodeDeploy 應用程式,Accoun tA TA 必須:

  • 請求 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 承擔由 Account B 設定的角色的原則,並將該原則附加至服務角色 (CodePipeline_Service_ Role)。

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

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

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

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

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

  • 透過信任關係政策設定並附加 IAM CrossAccount角色 (_Role),該政策允許 Account A 中的 CodePipeline 服務角色擔任該角色。

  • 建立允許存取管線所需之部署資源的原則,並將其附加至 CrossAccount_Role

  • 建立允許存取 Amazon S3 儲存貯體 (codepipeline-us-east-2-1234567890) 的政策,並將其附加到 _Role。CrossAccount

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

客戶管理的金鑰和所有金 AWS KMS 鑰都是區域專用的。您必須在建立管道的相同區域中建立客戶管理 AWS KMS 金鑰 (例如us-east-2)。

若要在中建立客戶管理的金鑰 AWS KMS
  1. AWS Management Console 使用帳戶 A 登錄並打開 AWS KMS 控制台。

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

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

  4. 別名中,輸入要用於此機碼的別名 (例如 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 資源的管道,Account A 必須為用於存放成品的 Amazon S3 儲存貯體和的服務角色設定政策。 CodePipeline

為授予 AccountB (主控台) 存取權的 Amazon S3 儲存貯體建立政策
  1. AWS Management Console 使用 AccountA 登錄並在以下位置打開 Amazon S3 控制台 https://console.aws.amazon.com/s3/

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

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

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

    注意

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

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

    在下列範例中,​AccountB 的 ARN 為 ​012ID_ACCOUNT_B。亞馬遜存儲桶的 ARN 是 codepipeline-us-east- 2-1234567890。將這些 ARN 取代為您要允許存取的帳戶的 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 登入,然後在 https://console.aws.amazon.com/iam/ 開啟 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 執行個體角色。(若您使用執行部署逐步說明精靈,將為您建立此角色,但您也可以手動建立角色。)​ 若要讓在 Account A 中建立的管道使用在 Ac countB 中建立的 CodeDeploy 資源,您必須:

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

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

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

    注意

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

若要為 CodeDeploy (主控台) 設定的 Amazon EC2 執行個體角色建立政策
  1. 登入使 AWS Management Console 用 AccountB,然後開啟 IAM 主控台,網址為 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. 針對在 Account TA 中建立 AWS KMS 的客戶管理金鑰的 ARN 建立,並設定為允許 Account B 使用arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE它,建立第二個原則:

    { "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 A 的帳號識別碼做為 AWS KMS 金鑰資源 ARN 的一部分,如下所示,否則政策將無法運作。

  9. 選擇檢閱政策

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

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

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

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

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

    重要

    此步驟建立在 AccountBAccountA 之間的信任關係政策。​ 不過,這會授與帳戶的根層級存取權,並 CodePipeline 建議將其範圍設定為 AccountA 中的 CodePipeline 服務角色。請依照步驟 16 來限制權限。

  4. 在 [附加權限原則] 下,選擇 [AmazonS3]ReadOnlyAccess,然後選擇 [下一步:標籤]。

    注意

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

  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. 在 [權限] 索引標籤上,ReadOnlyAccess在 [原則名稱] 下的政策清單中找到 AmazonS3,然後選擇原則旁邊的刪除圖示 (X)。出現提示時,選擇 Detach (分離)

  16. 選取 [信任關係] 索引標籤,然後選擇 [編輯信任原則]。選擇左欄中的 [新增主參與者] 選項。對於主體類型,請選擇 IAM 角色,然後在 Accoun tA 中提供 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

    輸出會傳送至管線. 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 資源,包括您建立的跨帳戶角色的roleArn值 (CrossAccount_ Role)。

    下列範例顯示新增名為的部署動作的 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 登入,然後在 http://console.aws.amazon.com/codesuite/codepipeline/home 開啟 CodePipeline主控台。

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

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

  4. 從管道觀看進度。在使用與其他 AWS 帳號相關聯之資源的動作上,等待成功訊息。

    注意

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