

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

# 在 CodePipeline 中建立使用其他 AWS 帳戶資源的管道
<a name="pipelines-create-cross-account"></a>

您可能希望建立一個管道，該管道使用由另一個 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 執行個體角色](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)的政策，以允許存取 Amazon S3 儲存貯體 ({{codepipeline-us-east-2-1234567890}})。
+ 建立套用至針對 CodeDeploy 設定的 [Amazon EC2 執行個體角色](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)的政策，以允許存取用來加密 {{AccountA}} 中管道成品 AWS KMS 的客戶受管金鑰。
+ 設定並連接具有信任關係政策的 IAM 角色 ({{CrossAccount\_Role}})，允許 {{AccountA}} 中的 CodePipeline 服務角色擔任該角色。
+ 建立允許存取管道所需部署資源的政策，並將其連接至 {{CrossAccount\_Role}}。
+ 建立允許存取 Amazon S3 儲存貯體 ({{codepipeline-us-east-2-1234567890}}) 的政策，並將其連接至 {{CrossAccount\_Role}}。

**Topics**
+ [先決條件：建立 AWS KMS 加密金鑰](#pipelines-create-cross-account-create-key)
+ [步驟 1：設定帳戶政策與角色](#pipelines-create-cross-account-setup)
+ [步驟 2：編輯管道](#pipelines-create-cross-account-create)

## 先決條件：建立 AWS KMS 加密金鑰
<a name="pipelines-create-cross-account-create-key"></a>

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

**在 中建立客戶受管金鑰 AWS KMS**

1.  AWS 管理主控台 使用 {{AccountA}} 登入 並開啟 AWS KMS 主控台。

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

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

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

1. 在**定義金鑰管理許可**中，選擇您要擔任此金鑰管理員的角色，然後選擇**下一步**。

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

1. 在 **Review and edit key policy (檢閱和編輯金鑰政策)** 中檢閱政策，然後選擇 **Finish (完成)**。

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

## 步驟 1：設定帳戶政策與角色
<a name="pipelines-create-cross-account-setup"></a>

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

**Topics**
+ [在建立管道的帳戶 ({{AccountA}}) 中設定政策和角色](#pipelines-create-cross-account-setup-accounta)
+ [在擁有 AWS 資源的帳戶中設定政策和角色 ({{AccountB}})](#pipelines-create-cross-account-setup-accountb)

### 在建立管道的帳戶 ({{AccountA}}) 中設定政策和角色
<a name="pipelines-create-cross-account-setup-accounta"></a>

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

**為授予 AccountB 存取權的 Amazon S3 儲存貯體建立政策 （主控台）**

1.  AWS 管理主控台 使用 {{AccountA}} 登入 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

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

1. 在 Amazon S3 儲存貯體的詳細資訊頁面上，選擇**屬性**。

1. 在屬性窗格中，展開 **Permissions (許可)**，然後選擇 **Add bucket policy (新增儲存貯體政策)**。
**注意**  
如果政策已連接至您的 Amazon S3 儲存貯體，請選擇**編輯儲存貯體政策**。然後，您可以按以下範例新增陳述式至現有政策。若要新增政策，請選擇連結，然後遵循 AWS 政策產生器中的指示。如需詳細資訊，請參閱 [IAM 政策概觀](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_overview.html)。

1. 在**儲存貯體政策編輯器**視窗中，建立政策以允許 {{AccountB}} 存取管道成品，並可讓 {{AccountB}} 在建立自訂來源或建置動作等動作時新增輸出成品。

1. 選擇 **Save (儲存)**，然後關閉政策編輯器。

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

**為 CodePipeline 的服務角色建立政策 （主控台）**

1.  AWS 管理主控台 使用 {{AccountA}} 登入 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇**角色**。

1. 在角色清單中的角色**名稱**下，選擇 CodePipeline 的服務角色名稱。

1. 在**許可**標籤上，選擇**新增內嵌政策**。

1. 選擇 **JSON** 索引標籤，然後輸入下列政策，以允許 {{AccountB}} 擔任該角色。在下列範例中，{{​012ID\_ACCOUNT\_B}} 為 {{​AccountB}} 的 ARN：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": [
               "arn:aws:iam::{{111122223333}}:role/*"
           ]
       }
   }
   ```

------

1. 選擇**檢閱政策**。

1. 在 **​Name (名稱)** 中，輸入此政策的名稱。選擇**建立政策**。

### 在擁有 AWS 資源的帳戶中設定政策和角色 ({{AccountB}})
<a name="pipelines-create-cross-account-setup-accountb"></a>

當您在 CodeDeploy 中建立應用程式、部署和部署群組時，您也可以建立 [Amazon EC2 執行個體角色](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)。(若您使用執行部署逐步說明精靈，將為您建立此角色，但您也可以手動建立角色。)​ 若要讓在 {{AccountA}} 中建立的管道使用 {{AccountB}} 中建立的 CodeDeploy 資源，您必須：
+ 為執行個體角色設定政策，允許其存取儲存管道成品的 Amazon S3 儲存貯體。
+ 在為跨帳戶存取設定的 {{AccountB}} 中建立第二個角色。

  第二個角色不僅可以存取 {{AccountA}} 中的 Amazon S3 儲存貯體，還必須包含允許存取 CodeDeploy 資源的政策，以及允許 {{AccountA}} 中的 CodePipeline 服務角色擔任該角色的信任關係政策。
**注意**  
這些政策專用於設定要在使用不同 AWS 帳戶建立的管道中使用的 CodeDeploy 資源。其他 AWS 資源將需要特定於其資源需求的政策。

**為針對 CodeDeploy 設定的 Amazon EC2 執行個體角色建立政策 （主控台）**

1.  AWS 管理主控台 使用 {{AccountB}} 登入 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇**角色**。

1. 在角色清單中的角色**名稱**下，選擇做為 CodeDeploy 應用程式 Amazon EC2 執行個體角色的服務角色名稱。此角色名稱可能不同，且部署群組可使用一個以上的執行個體角色。如需詳細資訊，請參閱[為您的 Amazon EC2 執行個體建立 IAM 執行個體設定檔](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)。

1. 在**許可**標籤上，選擇**新增內嵌政策**。

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

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:Get*"
          ],
          "Resource": [
            "arn:aws:s3:::{{amzn-s3-demo-bucket}}/*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::{{amzn-s3-demo-bucket}}"
          ]
        }
      ]
    }
   ```

------

1. 選擇**檢閱政策**。

1. 在 **​Name (名稱)** 中，輸入此政策的名稱。選擇**建立政策**。

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

------
#### [ JSON ]

****  

   ```
   {
       "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:{{111122223333:key/2222222-3333333-4444-556677EXAMPLE}}"
               ]
           }
       ]
   }
   ```

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

1. 選擇**檢閱政策**。

1. 在 **​Name (名稱)** 中，輸入此政策的名稱。選擇**建立政策**。

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

**在 IAM 中設定跨帳戶角色**

1.  AWS 管理主控台 使用 {{AccountB}} 登入 ，並在 https：//[https://console.aws.amazon.com/iam](https://console.aws.amazon.com/iam) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Roles** (角色)。選擇 **Create Role** (建立角色)。

1. 在 **Select type of trusted entity** (選取信任的實體類型) 下，選擇 **Another AWS account** (另一個 帳戶)。在**指定可使用此角色的帳戶**下，在 AWS 帳戶 **ID** 中輸入將在 CodePipeline ({{AccountA}}) 中建立管道的帳戶的帳戶 ID，然後選擇**下一步：許可**。
**重要**  
此步驟建立在 {{AccountB}} 與 {{AccountA}} 之間的信任關係政策。​ 不過，這會授予帳戶的根層級存取權，CodePipeline 建議將其縮小到 {{AccountA}} 中的 CodePipeline 服務角色。請遵循步驟 16 來限制許可。

1. 在**連接許可政策**下，選擇 **AmazonS3ReadOnlyAccess**，然後選擇**下一步：標籤**。
**注意**  
這並非您將使用的政策。您必須選擇一個政策以完成精靈。

1. 選擇下**一步：檢閱**。在角色名稱中輸入此**角色的名稱** （例如 {{CrossAccount\_Role}})。您可以將此角色命名為任何您想要的名稱，只要它遵循 IAM 中的命名慣例即可。可考慮給予角色清楚說明其用途的名稱。選擇**建立角色**。

1. 從角色清單中，選擇您剛建立的角色 （例如 {{CrossAccount\_Role}})，以開啟該角色的**摘要**頁面。

1. 在**許可**標籤上，選擇**新增內嵌政策**。

1. 選擇 **JSON** 索引標籤，然後輸入下列政策以允許存取 CodeDeploy 資源：

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "codedeploy:CreateDeployment",
           "codedeploy:GetDeployment",
           "codedeploy:GetDeploymentConfig",
           "codedeploy:GetApplicationRevision",
           "codedeploy:RegisterApplicationRevision"
         ],
         "Resource": "*"
       }
     ]
   }
   ```

------

1. 選擇**檢閱政策**。

1. 在 **​Name (名稱)** 中，輸入此政策的名稱。選擇**建立政策**。

1. 在**許可**標籤上，選擇**新增內嵌政策**。

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

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:GetObject*",
            "s3:PutObject",
            "s3:PutObjectAcl"               
          ],
          "Resource": [
            "arn:aws:s3:::{{amzn-s3-demo-bucket}}/*"
          ]
        }
      ]
   }
   ```

------

1. 選擇**檢閱政策**。

1. 在 **​Name (名稱)** 中，輸入此政策的名稱。選擇**建立政策**。

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

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

## 步驟 2：編輯管道
<a name="pipelines-create-cross-account-create"></a>

您無法使用 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 檔案。}}

1. 在任何純文字編輯器中開啟 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"
       }
     },
   ```

1. 在階段中新增部署動作，以使用與 {{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，只是階段中動作的結構。

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

   例如，從結構中移除下列幾行：

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

   儲存檔案。

1.  若要套用您的變更，請執行 **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
   ```

   如需詳細資訊，請參閱[手動啟動管道](pipelines-rerun-manually.md)。

1.  AWS 管理主控台 使用 {{AccountA}} 登入 ，並在 https：//[http://console.aws.amazon.com/codesuite/codepipeline/home](https://console.aws.amazon.com/codesuite/codepipeline/home) 開啟 CodePipeline 主控台。

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

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

1. 從管道觀看進度。在使用與另一個 AWS 帳戶相關聯資源的動作上等待成功訊息。
**注意**  
若您在使用 {{AccountA}}​ 登入的情況下嘗試檢視動作的詳細資訊，將收到錯誤訊息。登出，然後使用 {{AccountB}} 登入以檢視 CodeDeploy 中的部署詳細資訊。