

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

# 在 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\$1ACCOUNT\$1B*)。
+ 在管道的 區域中建立或使用 AWS KMS 客戶受管金鑰，並將使用該金鑰的許可授予服務角色 (*CodePipeline\$1Service\$1Role*) 和 *AccountB*。
+ 建立 Amazon S3 儲存貯體政策，授予 *AccountB* 對 Amazon S3 儲存貯體的存取權 （例如，*codepipeline-us-east-2-1234567890*)。
+ 建立允許 *AccountA* 擔任 *AccountB* 所設定角色的政策，並將該政策連接至服務角色 (*CodePipeline\$1Service\$1Role*)。
+ 編輯管道以使用客戶受管 AWS KMS 金鑰，而非預設金鑰。

若要讓 *AccountB*​ 允許其資源存取在 *AccountA*​ 中建立的管道，*AccountB*​ 必須：
+ 請求 *AccountA* 的 ARN 或帳戶 ID (在此逐步教學中，*AccountA* ID 為 *012ID\$1ACCOUNT\$1A*)。
+ 建立套用至針對 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\$1Role*)，允許 *AccountA* 中的 CodePipeline 服務角色擔任該角色。
+ 建立允許存取管道所需部署資源的政策，並將其連接至 *CrossAccount\$1Role*。
+ 建立允許存取 Amazon S3 儲存貯體 (*codepipeline-us-east-2-1234567890*) 的政策，並將其連接至 *CrossAccount\$1Role*。

**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\$1Service\$1Role)。**在其他 AWS 帳戶**下，選擇**新增另一個 AWS 帳戶**。為 *AccountB* 輸入帳戶 ID 以完成 ARN，然後選擇 **Next (下一步)**。

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

1. 從金鑰清單中選擇您的金鑰別名，並複製其 ARN (例如 ***arn:aws:kms:us-east-2:012ID\$1ACCOUNT\$1A: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\$1ACCOUNT\$1B* 為 *​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\$1ACCOUNT\$1A: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\$1Role*)。您可以將此角色命名為任何您想要的名稱，只要它遵循 IAM 中的命名慣例即可。可考慮給予角色清楚說明其用途的名稱。選擇**建立角色**。

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

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\$1ACCOUNT\$1A: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\$1Role*) `roleArn`的值。

   下列範例顯示 JSON 新增名為 *ExternalDeploy*​ 的部署動作。它使用在名為*預備*階段的 *AccountB* 中建立的 CodeDeploy 資源。在下列範例中，*AccountB* 的 ARN 為 *012ID\$1ACCOUNT\$1B*：

   ```
   ,
               {
                   "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 中的部署詳細資訊。