

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

# CodeBuild 的跨服務範例
<a name="cross-service-samples"></a>

您可以使用這些跨服務範例來實驗 AWS CodeBuild：

[Amazon ECR 範例](sample-ecr.md)  
使用 Amazon ECR 儲存庫中的 Docker 映像，使用 Apache Maven 產生單一 JAR 檔案。範例說明將示範如何建立 Docker 映像並將其推送至 Amazon ECR、建立 Go 專案、建置專案、執行專案，以及設定許可，以允許 CodeBuild 連線至 Amazon ECR。

[Amazon EFS 範例](sample-efs.md)  
示範如何設定 buildspec 檔案，以便 CodeBuild 專案在 Amazon EFS 檔案系統上掛載和建置。範例說明將示範如何建立 Amazon VPC、在 Amazon VPC 中建立檔案系統、建立和建置使用 Amazon VPC 的專案，然後檢閱產生的專案檔案和變數。

[AWS CodePipeline 範例](sample-codepipeline.md)  
示範如何使用 AWS CodePipeline 建立具有批次組建的組建，以及多個輸入來源和多個輸出成品。本節中包含的範例 JSON 檔案會顯示管道結構，這些結構會建立具有個別成品和合併成品的批次建置。提供附加 JSON 範例，顯示具有多個輸入來源和多個輸出成品的管道結構。

[AWS Config 範例](how-to-integrate-config.md)  
顯示如何設定 AWS Config。列出要追蹤哪些 CodeBuild 資源，並說明如何查詢 CodeBuild 專案 AWS Config。範例說明將向您顯示與 整合的先決條件 AWS Config、設定步驟 AWS Config，以及查詢 CodeBuild 專案和資料的步驟 AWS Config。

[建置通知範例](sample-build-notifications.md)  
使用 Apache Maven 來產生單一 JAR 檔案。傳送建置通知給 Amazon SNS 主題的訂閱者。範例指示說明如何設定許可，以便 CodeBuild 可以與 Amazon SNS 和 CloudWatch 通訊、如何在 Amazon SNS 中建立和識別 CodeBuild 主題、如何訂閱主題的收件人，以及如何在 CloudWatch 中設定規則。

# CodeBuild 的 Amazon ECR 範例
<a name="sample-ecr"></a>

此範例使用 Amazon Elastic Container Registry (Amazon ECR) 映像儲存庫中的 Docker 映像來建置範例 Go 專案。

**重要**  
執行此範例可能會導致 AWS 您的帳戶產生費用。這包括 AWS CodeBuild 與 Amazon S3、、 AWS KMS CloudWatch Logs 和 Amazon ECR 相關的 AWS 資源和動作的可能費用。如需詳細資訊，請參閱 [CodeBuild 定價](https://aws.amazon.com/codebuild/pricing)、[Amazon S3 定價](https://aws.amazon.com/s3/pricing)、[AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing)、[Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing)和 [Amazon Elastic Container Registry 定價](https://aws.amazon.com/ecr/pricing)。

**Topics**
+ [執行 Amazon ECR 範例](#sample-ecr-running)

## 執行 Amazon ECR 範例
<a name="sample-ecr-running"></a>

使用下列指示來執行 CodeBuild 的 Amazon ECR 範例。

**如何執行此範例**

1. 若要在 Amazon ECR 中建立 Docker 映像並將其推送至映像儲存庫，請完成 [執行「發佈 Docker 映像到 Amazon ECR」範例](sample-docker.md#sample-docker-running)區段中的步驟[「將 Docker 映像發佈至 Amazon ECR」範例](sample-docker.md)。

1. 建立 Go 專案：

   1. 如本主題的 [Go 專案結構](#ecr-sample-go-project-file-structure)和 [Go 專案檔案](#sample-ecr-go-project-files)章節所述建立檔案，然後將其上傳至 S3 輸入儲存貯體或 AWS CodeCommit、GitHub 或 Bitbucket 儲存庫。
**重要**  
請勿上傳 `(root directory name)`，僅上傳 `(root directory name)` 內的檔案即可。  
如果您使用的是 S3 輸入儲存貯體，請務必建立包含這些檔案的 ZIP 檔案，然後將其上傳至輸入儲存貯體。請勿將 `(root directory name)` 新增至 ZIP 檔案，僅新增 `(root directory name)` 內的檔案即可。

   1. 建立組建專案、執行組建，以及檢視相關的組建資訊。

      如果您使用 AWS CLI 來建立建置專案，`create-project`命令的 JSON 格式輸入可能會與此類似。(以您自己的值取代預留位置。)

      ```
      {
        "name": "sample-go-project",
        "source": {
          "type": "S3",
          "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip"
        },
        "artifacts": {
          "type": "S3",
          "location": "codebuild-region-ID-account-ID-output-bucket",
          "packaging": "ZIP",
          "name": "GoOutputArtifact.zip"
        },
        "environment": {
          "type": "LINUX_CONTAINER",
          "image": "aws/codebuild/standard:5.0",
          "computeType": "BUILD_GENERAL1_SMALL"
        },
        "serviceRole": "arn:aws:iam::account-ID:role/role-name",
        "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
      }
      ```

   1. 若要取得建置輸出成品，請開啟您的 S3 輸出儲存貯體。

   1. 將 `GoOutputArtifact.zip` 檔案下載到您的本機電腦或執行個體，然後解壓縮檔案的內容。在已解壓縮的內容中，取得 `hello` 檔案。

1.  如果下列其中一項為 true，您必須將許可新增至 Amazon ECR 中的映像儲存庫，讓 AWS CodeBuild 可以將 Docker 映像提取至建置環境。
   +  您的專案使用 CodeBuild 登入資料來提取 Amazon ECR 映像。這個行為可由 `ProjectEnvironment` 中屬性 `imagePullCredentialsType` 的值 `CODEBUILD` 看出。
   +  您的專案使用跨帳戶 Amazon ECR 映像。在這種情況下，您的專案必須使用其服務角色來提取 Amazon ECR 映像。若要啟用這種行為，請將您 `ProjectEnvironment` 的 `imagePullCredentialsType` 屬性設定成 `SERVICE_ROLE`。

   1. 在 [https://console.aws.amazon.com/ecr/](https://console.aws.amazon.com/ecr/) 開啟 Amazon ECR 主控台。

   1. 在儲存庫名稱的清單中，選擇您建立或選取的儲存庫名稱。

   1. 從導覽窗格，依序選擇 **Permissions (許可)**、**Edit (編輯)** 和 **Add statement (新增陳述式)**。

   1. 針對 **Statement name (陳述式名稱)**，輸入識別符 (例如 **CodeBuildAccess**)。

   1. 用於**生效**時，請保留選取**允許**。這樣做表示您允許存取另一個 AWS 帳戶。

   1. 用於 **Principal (委託人)**，執行下列其中一項操作：
      + 如果您的專案使用 CodeBuild 登入資料來提取 Amazon ECR 映像，請在**服務主體**中輸入 **codebuild.amazonaws.com**。
      + 如果您的專案使用跨帳戶 Amazon ECR 映像，請在**AWS 帳戶 IDs** 中輸入IDs。 AWS 

   1. 略過 **All IAM entities (所有 IAM 實體)** 清單。

   1. 針對 **Action (動作)**，選取所有僅限提取的動作：**ecr:GetDownloadUrlForLayer**、**ecr:BatchGetImage** 和 **ecr:BatchCheckLayerAvailability**。

   1. 針對**條件**，新增下列項目：

      ```
      {
         "StringEquals":{
            "aws:SourceAccount":"<AWS-account-ID>",
            "aws:SourceArn":"arn:aws:codebuild:<region>:<AWS-account-ID>:project/<project-name>"
         }
      }
      ```

   1. 選擇**儲存**。

      此政策會顯示在 **Permissions (許可)** 中。委託人是您在此程序的步驟 3 中針對 **Principal (委託人)** 輸入的委託人：
      + 如果您的專案使用 CodeBuild 登入資料來提取 Amazon ECR 映像，則 `"codebuild.amazonaws.com"`會顯示在**服務主體**下。
      + 如果您的專案使用跨帳戶 Amazon ECR 映像，您要授予存取權 AWS 的帳戶 ID 會顯示在**AWS 帳戶 IDs**下方。

        下列範例政策同時使用 CodeBuild 登入資料和跨帳戶 Amazon ECR 映像。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "CodeBuildAccessPrincipal",
                  "Effect": "Allow",
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ],
                  "Resource": "*",
                  "Condition": {
                      "StringEquals": {
                          "aws:SourceArn": "arn:aws:codebuild:us-east-1:111122223333:project/MyProject",
                          "aws:SourceAccount": "111122223333"
                      }
                  }
              },
              {
                  "Sid": "CodeBuildAccessCrossAccount",
                  "Effect": "Allow",
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ],
                  "Resource": "*"
              }
          ]
      }
      ```

------
      + 如果您的專案使用 CodeBuild 登入資料，而且您希望 CodeBuild 專案開放存取 Amazon ECR 儲存庫，您可以省略`Condition`金鑰並新增下列範例政策。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "CodeBuildAccessPrincipal",
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo"
                  ],
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ]
              },
              {
                  "Sid": "CodeBuildAccessCrossAccount",
                  "Effect": "Allow",
                  "Resource": [
                      "arn:aws:codecommit:us-east-2:111122223333:MySharedDemoRepo"
                  ],
                  "Action": [
                      "ecr:GetDownloadUrlForLayer",
                      "ecr:BatchGetImage",
                      "ecr:BatchCheckLayerAvailability"
                  ]
              }
          ]
      }
      ```

------

1. 建立組建專案、執行組建，以及檢視組建資訊。

   如果您使用 AWS CLI 來建立建置專案，`create-project`命令的 JSON 格式輸入可能會與此類似。(以您自己的值取代預留位置。)

   ```
   {
     "name": "amazon-ecr-sample-project",
     "source": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-input-bucket/GoSample.zip"
     },
     "artifacts": {
       "type": "S3",
       "location": "codebuild-region-ID-account-ID-output-bucket",
       "packaging": "ZIP",
       "name": "GoOutputArtifact.zip"
     },
     "environment": {
       "type": "LINUX_CONTAINER",
       "image": "account-ID.dkr.ecr.region-ID.amazonaws.com/your-Amazon-ECR-repo-name:tag",
       "computeType": "BUILD_GENERAL1_SMALL"
     },
     "serviceRole": "arn:aws:iam::account-ID:role/role-name",
     "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID"
   }
   ```

1. 若要取得建置輸出成品，請開啟您的 S3 輸出儲存貯體。

1. 將 `GoOutputArtifact.zip` 檔案下載到您的本機電腦或執行個體，然後解壓縮 `GoOutputArtifact.zip` 檔案的內容。在已解壓縮的內容中，取得 `hello` 檔案。

### Go 專案結構
<a name="ecr-sample-go-project-file-structure"></a>

此範例假設此目錄結構。

```
(root directory name)
├── buildspec.yml
└── hello.go
```

### Go 專案檔案
<a name="sample-ecr-go-project-files"></a>

此範例使用這些檔案。

`buildspec.yml` (在 `(root directory name)` 中)

```
version: 0.2

phases:
  install: 
   runtime-versions: 
     golang: 1.13 
  build:
    commands:
      - echo Build started on `date`
      - echo Compiling the Go code
      - go build hello.go 
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  files:
    - hello
```

`hello.go` (在 `(root directory name)` 中)

```
package main
import "fmt"

func main() {
  fmt.Println("hello world")
  fmt.Println("1+1 =", 1+1)
  fmt.Println("7.0/3.0 =", 7.0/3.0)
  fmt.Println(true && false)
  fmt.Println(true || false)
  fmt.Println(!true)
}
```

# 的 Amazon Elastic File System 範例 AWS CodeBuild
<a name="sample-efs"></a>

 您可能想要在 Amazon Elastic File System 上建立 AWS CodeBuild 組建，Amazon EC2 執行個體是可擴展的共用檔案服務。Amazon EFS 的儲存容量是彈性的，因此它會隨著檔案的新增和移除而成長或縮減。它有簡單的 Web 服務界面，可讓您用來快速輕鬆地建立和設定檔案系統。它還會為您管理所有檔案儲存基礎設施，因此您不需要擔心部署、修補，或維護檔案系統組態。如需詳細資訊，請參閱《[Amazon Elastic File System 使用者指南》中的什麼是 Amazon Elastic File System？](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)。 *Amazon Elastic File System * 

 此範例說明如何設定 CodeBuild 專案，使其掛載並建置 Java 應用程式至 Amazon EFS 檔案系統。開始之前，您必須準備好建置上傳至 S3 輸入儲存貯體或 AWS CodeCommit、GitHub、GitHub Enterprise Server 或 Bitbucket 儲存庫的 Java 應用程式。

檔案系統傳輸中的資料會受到加密。若要使用不同的映像加密傳輸中的資料，請參閱[加密傳輸中的資料](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html)。

**Topics**
+ [AWS CodeBuild 搭配 Amazon Elastic File System 使用](#sample-efs-high-level-steps)
+ [Amazon EFS 整合疑難排解](sample-efs-troubleshooting.md)

## AWS CodeBuild 搭配 Amazon Elastic File System 使用
<a name="sample-efs-high-level-steps"></a>

此範例涵蓋搭配使用 Amazon EFS 所需的四個高階步驟 AWS CodeBuild。這些類別為：

1. 在 AWS 帳戶中建立虛擬私有雲端 (VPC)。

1. 建立使用此 VPC 的檔案系統。

1. 建立並建置使用 VPC 的 CodeBuild 專案。CodeBuild 專案使用下列項目來識別檔案系統：
   +  不重複的檔案系統識別碼。當您在組件專案中指定檔案系統時，您可以選擇識別碼。
   + 檔案系統 ID。當您在 Amazon EFS 主控台中檢視檔案系統時，會顯示 ID。
   +  一個掛載點。這是 Docker 容器中的一個目錄，用於掛載檔案系統。
   + 掛載選項。這些包括如何掛載檔案系統的相關詳細資訊。

1. 檢閱建置專案，以確保產生正確的專案檔案和變數。

**注意**  
 僅在 Linux 平台上支援在 Amazon EFS 中建立的檔案系統。

 

**Topics**
+ [步驟 1：使用 建立 VPC CloudFormation](#sample-efs-create-vpc)
+ [步驟 2：使用 VPC 建立 Amazon Elastic File System 檔案系統](#sample-efs-create-efs)
+ [步驟 3：建立 CodeBuild 專案以搭配 Amazon EFS 使用](#sample-efs-create-acb)
+ [步驟 4：檢閱建置專案](#sample-efs-summary)

### 步驟 1：使用 建立 VPC CloudFormation
<a name="sample-efs-create-vpc"></a>

 使用 CloudFormation 範本建立 VPC。

1.  遵循 中的指示[CloudFormation VPC 範本](cloudformation-vpc-template.md)，以使用 CloudFormation 建立 VPC。
**注意**  
 此 CloudFormation 範本建立的 VPC 有兩個私有子網路和兩個公有子網路。只有在使用 AWS CodeBuild 掛載您在 Amazon EFS 中建立的檔案系統時，才能使用私有子網路。如果您使用其中一個公有子網路，則建置會失敗。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)：// 開啟 Amazon VPC 主控台。

1.  選擇您建立的 VPC CloudFormation。

1. 在 **Description (描述)** 標籤上，記下 VPC 的名稱及其 ID。當您稍後在這個範例建立您的 AWS CodeBuild 專案時，會需要這兩個項目。

### 步驟 2：使用 VPC 建立 Amazon Elastic File System 檔案系統
<a name="sample-efs-create-efs"></a>

 使用您先前建立的 VPC，為此範例建立簡單的 Amazon EFS 檔案系統。

1. 登入 AWS 管理主控台 ，並在 https：// 開啟 Amazon EFS 主控台。 [ https://console.aws.amazon.com/efs/](https://console.aws.amazon.com/efs/)

1.  選擇 **Create file system (建立檔案系統)**。

1.  從 **VPC** 中，選擇您在此範例中稍早記下的 VPC 名稱。

1.  將與您的子網路相關聯的可用區域保持選取。

1.  選擇 **Next Step (後續步驟)**。

1.  在**新增標籤**中，針對預設**名稱**索引鍵，在**值**中輸入 Amazon EFS 檔案系統的名稱。

1.  將 **Bursting (爆量)** 與 **General Purpose (一般用途)** 分別選為預設效能及傳輸量模式，然後選擇 **Next Step (下一步)**。

1. 對於 **Configure new client (設定新用戶端)**，請選擇 **Next Step (下一個步驟)**。

1.  選擇 **Create File System (建立檔案系統)**。

1.  （選用） 建議您將政策新增至 Amazon EFS 檔案系統，以強制執行傳輸中資料的加密。在 Amazon EFS 主控台中，選擇**檔案系統政策**，選擇**編輯**，選擇標示**為所有用戶端強制執行傳輸中加密的**方塊，然後選擇**儲存**。

### 步驟 3：建立 CodeBuild 專案以搭配 Amazon EFS 使用
<a name="sample-efs-create-acb"></a>

 建立使用您先前在此範例中建立之 VPC 的 AWS CodeBuild 專案。當組建執行時，它會掛載先前建立的 Amazon EFS 檔案系統。接下來，組件會儲存由您的 Java 應用程式於檔案系統的掛載點目錄中建立的 .jar 檔案。

1. 在 https：//[https://console.aws.amazon.com/codesuite/codebuild/home](https://console.aws.amazon.com/codesuite/codebuild/home) 開啟 AWS CodeBuild 主控台。

1.  從導覽窗格，選擇 **Build projects (建置專案)**，然後選擇 **Create build project (建立建置專案)**。

1.  在**專案名稱** 中，輸入您的專案名稱。

1.  從 **Source provider (來源供應商)**，選擇包含您希望建置的 Java 應用程式的儲存庫。

1.  輸入 CodeBuild 用來尋找應用程式的資訊，例如儲存庫 URL。每個來源供應商的選項不同。如需詳細資訊，請參閱[Choose source provider](create-project.md#create-project-source-provider)。

1.  從 **Environment image (環境映像)**，選擇 **Managed image (受管映像)**。

1.  從 **Operating system (作業系統)**，選擇 **Amazon Linux 2**。

1. 從 **Runtime(s) (執行時間)**，選擇 **Standard (標準)**。

1.  在**影像**中，選擇 **aws/codebuild/amazonlinux-x86\$164-standard：4.0。**

1.  從 **Environment type** (環境類型) 中選擇 **Linux**。

1.  在 **Service role (服務角色)** 下，選擇 **New service role (新服務角色)**。在**角色名稱**中，輸入 CodeBuild 為您建立的角色名稱。

1. 展開 **Additional configuration (其他組態)**。

1.  選取 **Enable this flag if you want to build Docker images or want your builds to get elevated privileges (若想建置 Docker 影像或讓您的建置提升權限，請啟用此標記)**。
**注意**  
根據預設，非 VPC 建置會啟用 Docker 協助程式。如果您想要使用 Docker 容器進行 VPC 建置，請參閱 Docker 文件網站上的[執行期權限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)，並啟用特權模式。此外，Windows 不支援特殊權限模式。

1.  從 **VPC**，選擇 VPC ID。

1.  從 **Subnets (子網路)**，選擇與您的 VPC 關聯的一或多個私有子網路。您必須在掛載 Amazon EFS 檔案系統的建置中使用私有子網路。如果您使用公有子網路，則建置會失敗。

1.  從 **Security Groups** (安全群組) 中選擇預設的安全群組。

1.  在 **File systems** (檔案系統) 中，輸入下列資訊：
   + 針對 **Identifier (識別碼)**，輸入唯一的檔案系統識別碼。它必須少於 129 個字元，且只包含英數字元和底線。CodeBuild 使用此識別符來建立可識別彈性檔案系統的環境變數。環境變量格式是大寫英文字母的 `CODEBUILD_<file_system_identifier>`。例如，如果您輸入 `my_efs`，環境變數則為 `CODEBUILD_MY_EFS`。
   + 針對 **ID**，請選擇檔案系統 ID。
   + （選用） 在檔案系統中輸入目錄。CodeBuild 掛載此目錄。如果您將**目錄路徑**保留空白，CodeBuild 會掛載整個檔案系統。此路徑相對於檔案系統的根目錄。
   + 針對**掛載點**，在掛載檔案系統的建置容器中，輸入 目錄的絕對路徑。如果此目錄不存在，CodeBuild 會在建置期間建立目錄。
   + (選用) 輸入掛載選項。如果您將**掛載選項**保留空白，CodeBuild 會使用其預設掛載選項：

     ```
     nfsvers=4.1
     rsize=1048576
     wsize=1048576
     hard
     timeo=600
     retrans=2
     ```

     如需詳細資訊，請參閱《*Amazon Elastic File System 使用者指南*》中的[建議的 NFS 掛載選項](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs-nfs-mount-settings.html)。

1.  如為 **Build specification (建置規格)**，選擇 **Insert build commands (插入建置命令)**，然後選擇 **Switch to editor (切換到編輯器)**。

1.  在編輯器中輸入下列建置規格命令。使用您在步驟 17 中輸入的識別碼取代 `<file_system_identifier>`。使用大寫英文字母 (例如：`CODEBUILD_MY_EFS`)。

   ```
   version: 0.2
   phases:
     install:
       runtime-versions:
         java: corretto11    
     build:
       commands:
         - mvn compile -Dgpg.skip=true -Dmaven.repo.local=$CODEBUILD_<file_system_identifier>
   ```

1.  對所有其他設定使用預設值，然後選擇 **Create build project (建立建置專案)**。當建置完成時，您專案的主控台頁面就會顯示。

1.  選擇 **Start build (開始組建)**。

### 步驟 4：檢閱建置專案
<a name="sample-efs-summary"></a>



 建置 AWS CodeBuild 專案之後：
+  您有由 Java 應用程式建立的 .jar 檔案，該檔案建置在掛載點目錄下的 Amazon EFS 檔案系統。
+  可辨識您檔案系統的環境變數，會使用您在建立專案時輸入的檔案系統識別碼建立。

 如需詳細資訊，請參閱《Amazon Elastic [File System 使用者指南》中的掛](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html)載檔案系統。 *Amazon Elastic File System * 

# Amazon EFS 整合疑難排解
<a name="sample-efs-troubleshooting"></a>

以下是使用 CodeBuild 設定 Amazon EFS 時可能遇到的錯誤。

**Topics**
+ [CLIENT\$1ERROR：掛載 '127.0.0.1：/' 失敗。 許可遭拒](#sample-efs-troubleshooting.permission-denied)
+ [CLIENT\$1ERROR：掛載 '127.0.0.1：/' 失敗。連線依對等重設](#sample-efs-troubleshooting.connection-reset)
+ [VPC\$1CLIENT\$1ERROR：未預期的 EC2 錯誤：UnauthorizedOperation](#sample-efs-troubleshooting.unauthorized-operation)

## CLIENT\$1ERROR：掛載 '127.0.0.1：/' 失敗。 許可遭拒
<a name="sample-efs-troubleshooting.permission-denied"></a>

使用 CodeBuild 掛載 Amazon EFS 不支援 IAM 授權。如果您使用的是自訂 Amazon EFS 檔案系統政策，您將需要授予所有 IAM 主體的讀取和寫入存取權。例如：

```
"Principal": {
  "AWS": "*"
}
```

## CLIENT\$1ERROR：掛載 '127.0.0.1：/' 失敗。連線依對等重設
<a name="sample-efs-troubleshooting.connection-reset"></a>

此錯誤有兩種可能的原因：
+ CodeBuild VPC 子網路與 Amazon EFS 掛載目標位於不同的可用區域。您可以透過在與 Amazon EFS 掛載目標相同的可用區域中新增 VPC 子網路來解決此問題。
+ 安全群組沒有與 Amazon EFS 通訊的許可。您可以新增傳入規則，以允許來自 VPC （為您的 VPC 新增主要 CIDR 區塊） 或安全群組本身的所有流量來解決此問題。

## VPC\$1CLIENT\$1ERROR：未預期的 EC2 錯誤：UnauthorizedOperation
<a name="sample-efs-troubleshooting.unauthorized-operation"></a>

當 CodeBuild 專案 VPC 組態中的所有子網路都是公有子網路時，就會發生此錯誤。VPC 中必須至少有一個私有子網路，以確保網路連線。

# AWS CodePipeline CodeBuild 的範例
<a name="sample-codepipeline"></a>

本節說明 CodePipeline 和 CodeBuild 之間的範例整合。


| 樣本 | Description | 
| --- | --- | 
|  [CodePipeline/CodeBuild 整合和批次建置的範例](#sample-pipeline-batch)  |  這些範例示範如何使用 AWS CodePipeline 建立使用批次建置的建置專案。  | 
|  [CodePipeline/CodeBuild 與多個輸入來源和輸出成品整合的範例](#sample-pipeline-multi-input-output)  |  此範例示範如何使用 AWS CodePipeline 建立使用多個輸入來源建立多個輸出成品的建置專案。  | 

## CodePipeline/CodeBuild 整合和批次建置的範例
<a name="sample-pipeline-batch"></a>

AWS CodeBuild 支援批次建置。下列範例示範如何使用 AWS CodePipeline 建立使用批次建置的建置專案。

您可以使用定義管道結構的 JSON 格式檔案，然後將其與 搭配使用 AWS CLI 來建立管道。如需詳細資訊，請參閱*AWS CodePipeline 《 使用者指南*》中的[AWS CodePipeline 管道結構參考](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html)。

### 具有個別成品的批次建置
<a name="sample-pipeline-batch.separate-artifacts"></a>

使用下列 JSON 檔案做為管道結構的範例，該結構會建立具有個別成品的批次建置。若要在 CodePipeline 中啟用批次建置，請將`configuration`物件的 `BatchEnabled` 參數設定為 `true`。

```
{
  "pipeline": {
    "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
    "stages": [
      {
        "name": "Source",
        "actions": [
          {
            "inputArtifacts": [],
            "name": "Source1",
            "actionTypeId": {
              "category": "Source",
              "owner": "AWS",
              "version": "1",
              "provider": "S3"
            },
            "outputArtifacts": [
              {
                "name": "source1"
              }
            ],
            "configuration": {
              "S3Bucket": "<my-input-bucket-name>",
              "S3ObjectKey": "my-source-code-file-name.zip"
            },
            "runOrder": 1
          },
          {
            "inputArtifacts": [],
            "name": "Source2",
            "actionTypeId": {
              "category": "Source",
              "owner": "AWS",
              "version": "1",
              "provider": "S3"
            },
            "outputArtifacts": [
              {
                "name": "source2"
              }
            ],
            "configuration": {
              "S3Bucket": "<my-other-input-bucket-name>",
              "S3ObjectKey": "my-other-source-code-file-name.zip"
            },
            "runOrder": 1
          }
        ]
      },
      {
        "name": "Build",
        "actions": [
          {
            "inputArtifacts": [
              {
                "name": "source1"
              },
              {
                "name": "source2"
              }
            ],
            "name": "Build",
            "actionTypeId": {
              "category": "Build",
              "owner": "AWS",
              "version": "1",
              "provider": "CodeBuild"
            },
            "outputArtifacts": [
              {
                "name": "build1"
              },
              {
                "name": "build1_artifact1"
              },
              {
                "name": "build1_artifact2"
              },
              {
                "name": "build2_artifact1"
              },
              {
                "name": "build2_artifact2"
              }
            ],
            "configuration": {
              "ProjectName": "my-build-project-name",
              "PrimarySource": "source1",
              "BatchEnabled": "true"
            },
            "runOrder": 1
          }
        ]
      }
    ],
    "artifactStore": {
      "type": "S3",
      "location": "<AWS-CodePipeline-internal-bucket-name>"
    },
    "name": "my-pipeline-name",
    "version": 1
  }
}
```

以下是將使用此管道組態的 CodeBuild buildspec 檔案範例。

```
version: 0.2
batch:
  build-list:
    - identifier: build1
      env:
        compute-type: BUILD_GENERAL1_SMALL
    - identifier: build2
      env:
        compute-type: BUILD_GENERAL1_MEDIUM

phases:
  build:
    commands:
      - echo 'file' > output_file

artifacts:
  files:
    - output_file
  secondary-artifacts:
    artifact1:
      files:
        - output_file
    artifact2:
      files:
        - output_file
```

管道 JSON 檔案中指定的輸出成品名稱必須符合 buildspec 檔案中定義的組建和成品的識別符。語法是主要成品的 *buildIdentifier*，次要成品的 *buildIdentifier*\$1*artifactIdentifier*。

例如，對於輸出成品名稱 `build1`，CodeBuild 會將 的主要成品上傳`build1`到 的位置`build1`。對於輸出名稱 `build1_artifact1`，CodeBuild 會將 `artifact1` 的次要成品上傳`build1`到 的位置`build1_artifact1`，以此類推。如果只指定一個輸出位置，則名稱應該是 *buildIdentifier*。

建立 JSON 檔案之後，您可以建立管道。使用 AWS CLI 執行 **create-pipeline** 命令，並將 檔案傳遞至 `--cli-input-json` 參數。如需詳細資訊，請參閱*AWS CodePipeline 《 使用者指南*》中的[建立管道 (CLI)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。

### 具有合併成品的批次建置
<a name="sample-pipeline-batch.combined-artifacts"></a>

使用下列 JSON 檔案做為管道結構的範例，該結構會建立具有合併成品的批次建置。若要在 CodePipeline 中啟用批次建置，請將`configuration`物件的 `BatchEnabled` 參數設定為 `true`。若要將建置成品合併到相同的位置，請將`configuration`物件的 `CombineArtifacts` 參數設定為 `true`。

```
{
 "pipeline": {
  "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
  "stages": [
    {
      "name": "Source",
      "actions": [
        {
          "inputArtifacts": [],
          "name": "Source1",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source1"
            }
          ],
          "configuration": {
            "S3Bucket": "<my-input-bucket-name>",
            "S3ObjectKey": "my-source-code-file-name.zip"
          },
          "runOrder": 1
        },
        {
          "inputArtifacts": [],
          "name": "Source2",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source2"
            }
          ],
          "configuration": {
            "S3Bucket": "<my-other-input-bucket-name>",
            "S3ObjectKey": "my-other-source-code-file-name.zip"
          },
          "runOrder": 1
        }
      ]
    },
    {
      "name": "Build",
      "actions": [
        {
          "inputArtifacts": [
            {
              "name": "source1"
            },
            {
              "name": "source2"
            }
          ],
          "name": "Build",
          "actionTypeId": {
            "category": "Build",
            "owner": "AWS",
            "version": "1",
            "provider": "CodeBuild"
          },
          "outputArtifacts": [
            {
              "name": "output1 "
            }
          ],
          "configuration": {
            "ProjectName": "my-build-project-name",
            "PrimarySource": "source1",
             "BatchEnabled": "true",
             "CombineArtifacts": "true"
          },
          "runOrder": 1
        }
      ]
    }
  ],
  "artifactStore": {
    "type": "S3",
    "location": "<AWS-CodePipeline-internal-bucket-name>"
  },
  "name": "my-pipeline-name",
  "version": 1
 }
}
```

以下是將使用此管道組態的 CodeBuild buildspec 檔案範例。

```
version: 0.2
batch:
  build-list:
    - identifier: build1
      env:
        compute-type: BUILD_GENERAL1_SMALL
    - identifier: build2
      env:
        compute-type: BUILD_GENERAL1_MEDIUM

phases:
  build:
    commands:
      - echo 'file' > output_file

artifacts:
  files:
    - output_file
```

如果批次建置已啟用合併成品，則只允許一個輸出。CodeBuild 會將所有組建的主要成品合併為單一 ZIP 檔案。

建立 JSON 檔案之後，您可以建立管道。使用 AWS CLI 執行 **create-pipeline** 命令，並將 檔案傳遞至 `--cli-input-json` 參數。如需詳細資訊，請參閱*AWS CodePipeline 《 使用者指南*》中的[建立管道 (CLI)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。

## CodePipeline/CodeBuild 與多個輸入來源和輸出成品整合的範例
<a name="sample-pipeline-multi-input-output"></a>

 AWS CodeBuild 專案可能需要多個輸入來源。也可以建立不只一個輸出成品。此範例示範如何使用 AWS CodePipeline 建立使用多個輸入來源建立多個輸出成品的建置專案。如需詳細資訊，請參閱[多個輸入來源和輸出成品範例](sample-multi-in-out.md)。

您可以使用定義管道結構的 JSON 格式檔案，然後將其與 搭配使用 AWS CLI 來建立管道。使用下列 JSON 檔案作為管道結構的範例，以建立具有多個輸入來源和多個輸出成品的組建。稍後在此範例中，您會看到此檔案如何指定多個輸入和輸出。如需詳細資訊，請參閱*AWS CodePipeline 《 使用者指南*》中的 [CodePipeline 管道結構參考](https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html)。

```
{
 "pipeline": {
  "roleArn": "arn:aws:iam::account-id:role/my-AWS-CodePipeline-service-role-name",
  "stages": [
    {
      "name": "Source",
      "actions": [
        {
          "inputArtifacts": [],
          "name": "Source1",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source1"
            }
          ],
          "configuration": {
            "S3Bucket": "my-input-bucket-name",
            "S3ObjectKey": "my-source-code-file-name.zip"
          },
          "runOrder": 1
        },
        {
          "inputArtifacts": [],
          "name": "Source2",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "version": "1",
            "provider": "S3"
          },
          "outputArtifacts": [
            {
              "name": "source2"
            }
          ],
          "configuration": {
            "S3Bucket": "my-other-input-bucket-name",
            "S3ObjectKey": "my-other-source-code-file-name.zip"
          },
          "runOrder": 1
        }
      ]
    },
    {
      "name": "Build",
      "actions": [
        {
          "inputArtifacts": [
            {
              "name": "source1"
            },
            {
              "name": "source2"
            }
          ],
          "name": "Build",
          "actionTypeId": {
            "category": "Build",
            "owner": "AWS",
            "version": "1",
            "provider": "AWS CodeBuild"
          },
          "outputArtifacts": [
            {
              "name": "artifact1"
            },
            {
              "name": "artifact2"
            }
          ],
          "configuration": {
            "ProjectName": "my-build-project-name",
            "PrimarySource": "source1"
          },
          "runOrder": 1
        }
      ]
    }
  ],
  "artifactStore": {
    "type": "S3",
    "location": "AWS-CodePipeline-internal-bucket-name"
  },
  "name": "my-pipeline-name",
  "version": 1
 }
}
```

 在此 JSON 檔案中：
+ 您的其中一個輸入來源必須指定為 `PrimarySource`。此來源是 CodeBuild 尋找並執行 buildspec 檔案的目錄。在 JSON 檔案的 CodeBuild 階段的 `configuration` 區段中，關鍵字 `PrimarySource` 用來指定主要來源。
+ 每個輸入來源安裝在其自己的目錄中。此目錄會存放在內建的環境變數，`$CODEBUILD_SRC_DIR` 表示主要來源和 `$CODEBUILD_SRC_DIR_yourInputArtifactName` 表示所有其他來源。就此範例中的管道而言，兩個輸入來源目錄是 `$CODEBUILD_SRC_DIR` 和 `$CODEBUILD_SRC_DIR_source2`。如需詳細資訊，請參閱[建置環境中的環境變數](build-env-ref-env-vars.md)。
+ 在管道的 JSON 檔案中指定的輸出成品名稱，必須符合 buildspec 檔案中定義的次要成品名稱。此管道使用下列 buildspec 檔案。如需詳細資訊，請參閱[Buildspec 語法](build-spec-ref.md#build-spec-ref-syntax)。

  ```
  version: 0.2
  
  phases:
    build:
      commands:
        - touch source1_file
        - cd $CODEBUILD_SRC_DIR_source2
        - touch source2_file
  
  artifacts:
    files:
      - '**/*'
    secondary-artifacts:
      artifact1:
        base-directory: $CODEBUILD_SRC_DIR
        files:
          - source1_file
      artifact2:
        base-directory: $CODEBUILD_SRC_DIR_source2
        files:
          - source2_file
  ```

 建立 JSON 檔案之後，您可以建立管道。使用 AWS CLI 執行 **create-pipeline** 命令，並將 檔案傳遞至 `--cli-input-json` 參數。如需詳細資訊，請參閱*AWS CodePipeline 《 使用者指南*》中的[建立管道 (CLI)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create.html#pipelines-create-cli)。

# AWS Config 範例搭配 CodeBuild
<a name="how-to-integrate-config"></a>

AWS Config 提供 AWS 資源的清查，以及這些資源的組態變更歷史記錄。 AWS Config 現在支援 AWS CodeBuild 做為 AWS 資源，這表示服務可以追蹤 CodeBuild 專案。如需詳細資訊 AWS Config，請參閱《 *AWS Config 開發人員指南*》中的[什麼是 AWS Config？](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)。

您可以在 AWS Config 主控台的資源**庫存**頁面上查看下列有關 CodeBuild 資源的資訊：
+ CodeBuild 組態的時間軸會變更。
+ 每個 CodeBuild 專案的組態詳細資訊。
+ 與其他 AWS 資源的關係。
+ CodeBuild 專案的變更清單。

**Topics**
+ [搭配 使用 CodeBuild AWS Config](#how-to-integrate-config-run)
+ [步驟 3：在 AWS Config 主控台中檢視 AWS CodeBuild 資料](#viewing-config-details)

## 搭配 使用 CodeBuild AWS Config
<a name="how-to-integrate-config-run"></a>

本主題中的程序說明如何設定 AWS Config 和查詢 CodeBuild 專案。

**Topics**
+ [先決條件](#how-to-create-a-build-project)
+ [步驟 1：設定 AWS Config](#setup-config)
+ [步驟 2：查詢 AWS CodeBuild 專案](#lookup-projects)

### 先決條件
<a name="how-to-create-a-build-project"></a>

建立您的 AWS CodeBuild 專案。如需說明，請參閱[建立組建專案](create-project.md)。

### 步驟 1：設定 AWS Config
<a name="setup-config"></a>
+ [設定 AWS Config (主控台)](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html)
+ [設定 AWS Config (AWS CLI)](https://docs.aws.amazon.com/config/latest/developerguide/gs-cli.html)

**注意**  
完成設定後，最多可能需要 10 分鐘才能在 AWS Config 主控台中看到 AWS CodeBuild 專案。

### 步驟 2：查詢 AWS CodeBuild 專案
<a name="lookup-projects"></a>

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/config](https://console.aws.amazon.com/config) 開啟 AWS Config 主控台。

1. 在**資源庫存**頁面上，選取**資源類型**下的 **AWS CodeBuild 專案**。向下捲動並選取 **CodeBuild project (CodeBuild 專案)** 核取方塊。

1. 選擇 **Look up** (查閱)。

1. 新增 CodeBuild 專案清單後，請在 **Config 時間軸**欄中選擇 CodeBuild 專案名稱連結。

## 步驟 3：在 AWS Config 主控台中檢視 AWS CodeBuild 資料
<a name="viewing-config-details"></a>

在資源**庫存**頁面上查詢資源時，您可以選擇 AWS Config 時間軸以檢視 CodeBuild 專案的詳細資訊。資源的詳細資訊頁面提供該資源之組態、關係以及對其所做之變更的相關資訊。

頁面頂端的區塊統稱為時間軸。時間軸顯示記錄的日期和時間。

如需詳細資訊，請參閱[《 開發人員指南》中的在 AWS Config 主控台中檢視組態詳細資訊](https://docs.aws.amazon.com/config/latest/developerguide/view-manage-resource-console.html)。 *AWS Config *

# CodeBuild 的建置通知範例
<a name="sample-build-notifications"></a>

Amazon CloudWatch Events 具有 的內建支援 AWS CodeBuild。CloudWatch Events 是描述 AWS 資源變更的系統事件串流。使用 CloudWatch Events，您可以撰寫宣告規則，將感興趣的事件與要採取的自動化動作建立關聯。此範例使用 Amazon CloudWatch Events 和 Amazon Simple Notification Service (Amazon SNS)，每當組建成功、失敗、從一個組建階段移至另一個組建階段，或這些事件的任意組合時，就會傳送組建通知給訂閱者。

**重要**  
執行此範例可能會導致 AWS 您的帳戶產生費用。這包括 CodeBuild 以及與 Amazon CloudWatch 和 Amazon SNS 相關的 AWS 資源和動作的可能費用。如需詳細資訊，請參閱 [CodeBuild 定價](https://aws.amazon.com/codebuild/pricing)、[Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing)和 [Amazon SNS 定價](https://aws.amazon.com/sns/pricing)。

**Topics**
+ [執行建置通知範例](#sample-build-notifications-running)
+ [建置通知輸入格式參考](sample-build-notifications-ref.md)

## 執行建置通知範例
<a name="sample-build-notifications-running"></a>

使用下列程序來執行建置通知範例。

**如何執行此範例**

1. 如果您已在 Amazon SNS 中設定並訂閱要用於此範例的主題，請跳到步驟 4。否則，如果您使用 IAM 使用者而非 AWS 根帳戶或管理員使用者來使用 Amazon SNS，請將下列陳述式 （介於 *\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1 *和 *\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1* 之間） 新增至使用者 （或使用者相關聯的 IAM 群組）。不建議使用 AWS 根帳戶。此陳述式可讓您檢視、建立、訂閱和測試 Amazon SNS 中主題的通知傳送。省略符號 (`...`) 用於簡化和協助您找到新增陳述式的位置。請不要移除任何陳述式，也不要在現有政策中輸入這些省略符號。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sns:CreateTopic",
                   "sns:GetTopicAttributes",
                   "sns:List*",
                   "sns:Publish",
                   "sns:SetTopicAttributes",
                   "sns:Subscribe"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------
**注意**  
修改此政策的 IAM 實體必須在 IAM 中具有修改政策的許可。  
如需詳細資訊，請參閱[《IAM 使用者指南》中的編輯客戶受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#edit-managed-policy-console)或「編輯或刪除群組、使用者或角色的內嵌政策」一節[中的使用內嵌政策 （主控台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console)。 **

1. 在 Amazon SNS. AWS CodeBuild uses CloudWatch Events 中建立或識別主題，以透過 Amazon SNS 傳送建置通知至此主題。

   建立主題：

   1. 開啟位於 https：//[https://console.aws.amazon.com/sns](https://console.aws.amazon.com/sns) 的 Amazon SNS 主控台。

   1. 請選擇**建立主題**。

   1. 在 **Create new topic (建立新主題)** 中，針對 **Topic name (主題名稱)**，輸入主題的名稱 (例如 **CodeBuildDemoTopic**)。(如果您選擇其他名稱，請在此範例中全部換成此名稱。) 

   1. 請選擇**建立主題**。

   1. 在**主題詳細資訊：CodeBuildDemoTopic** 頁面上，複製**主題 ARN** 值。您在下一個步驟中需要使用到此數值。

        
![\[主題 ARN 值。\]](http://docs.aws.amazon.com/zh_tw/codebuild/latest/userguide/images/topic-arn.png)

      

   如需詳細資訊，請參閱《*Amazon SNS 開發人員指南*》中的[建立主題](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)。

1. 讓一或多個收件人訂閱主題來接收電子郵件通知。

   讓收件人訂閱主題：

   1. 從上一個步驟開啟 Amazon SNS 主控台後，在導覽窗格中，選擇**訂閱**，然後選擇**建立訂閱**。

   1. 在 **Create subscription (建立訂閱)** 中，對於 **Topic ARN (主題 ARN)**，貼上您從上個步驟複製的主題 ARN。

   1. 對於**通訊協定**，選擇**電子郵件**。

   1. 針對 **​Endpoint (端點)**，輸入收件人的完整電子郵件地址。

        
![\[訂閱組態。\]](http://docs.aws.amazon.com/zh_tw/codebuild/latest/userguide/images/create-subscription.png)

      

   1. 選擇 **Create Subscription** (建立訂閱)。

   1. Amazon SNS 會傳送訂閱確認電子郵件給收件人。若要開始接收電子郵件通知，收件人必須選擇訂閱確認電子郵件中的 **Confirm subscription (確認訂閱)** 連結。收件人按一下連結後，如果成功訂閱，Amazon SNS 會在收件人的 Web 瀏覽器中顯示確認訊息。

   如需詳細資訊，請參閱《*Amazon SNS 開發人員指南*》中的[訂閱主題](https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html)。

1. 如果您使用 使用者而非 AWS 根帳戶或管理員使用者來使用 CloudWatch Events，請將下列陳述式 （介於 *\$1\$1\$1 BEGIN ADDING STATEMENT HERE \$1\$1\$1* 和 *\$1\$1\$1 END ADDING STATEMENT HERE \$1\$1\$1* 之間） 新增至使用者 （或使用者相關聯的 IAM 群組）。不建議使用 AWS 根帳戶。此陳述式用於允許使用者使用 CloudWatch Events。省略符號 (`...`) 用於簡化和協助您找到新增陳述式的位置。請不要移除任何陳述式，也不要在現有政策中輸入這些省略符號。

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

****  

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

------
**注意**  
修改此政策的 IAM 實體必須在 IAM 中具有修改政策的許可。  
如需詳細資訊，請參閱[《IAM 使用者指南》中的編輯客戶受管政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#edit-managed-policy-console)或「編輯或刪除群組、使用者或角色的內嵌政策」一節[中的使用內嵌政策 （主控台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console)。 **

1. 在 CloudWatch Events 中建立規則。若要這樣做，請開啟 CloudWatch 主控台，網址為 https：//[https://console.aws.amazon.com/cloudwatch](https://console.aws.amazon.com/cloudwatch)。

1. 在導覽窗格中，在 **Events (事件)** 下方選擇 **Rules (規則)**，然後選擇 **Create rule (建立規則)**。

1. 在 **Step 1: Create rule page (步驟 1：建立規則頁面)** 上，應該已選取 **Event Pattern (事件模式)** 和 **Build event pattern to match events by service (建構事件的模式，依服務來匹配事件)**。

1. 針對**服務名稱**，選擇 **CodeBuild**。在 **Event Type (事件類型)** 中，應該已選取 **All Events (所有事件)**。

1. 下列程式碼應顯示於 **Event Pattern Preview (事件模式預覽)** 中：

   ```
   {
     "source": [ 
       "aws.codebuild"
     ]
   }
   ```

1. 選擇 **Edit (編輯)**，將 **Event Pattern Preview (事件模式預覽)** 中的程式碼換成下列兩個規則模式之一。

    AWS CodeBuild中指定的建置專案有建置開始或完成時，這第一個規則模式就會觸發事件。

   ```
   {
     "source": [ 
       "aws.codebuild"
     ], 
     "detail-type": [
       "CodeBuild Build State Change"
     ],
     "detail": {
       "build-status": [
         "IN_PROGRESS",
         "SUCCEEDED", 
         "FAILED",
         "STOPPED" 
       ],
       "project-name": [
         "my-demo-project-1",
         "my-demo-project-2"
       ]
     }  
   }
   ```

   在上個規則中，依需要進行下列程式碼變更。
   + 若要在有建置開始或完成時觸發事件，請保留 `build-status` 陣列中所示的所有值，或移除整個 `build-status` 陣列。
   + 若只要在組建完成時才觸發事件，請從 `build-status` 陣列中移除 `IN_PROGRESS`。
   + 若只要在組建開始時才觸發事件，請從 `build-status` 陣列中移除所有值，但保留 `IN_PROGRESS`。
   + 若要對所有組建專案觸發事件，請移除整個 `project-name` 陣列。
   + 若只要對個別組建專案觸發事件，請在 `project-name` 陣列中指定每個組建專案的名稱。

   每當 AWS CodeBuild中指定的建置專案有建置從一個建置階段進入另一個建置階段時，這第二個規則模式就會觸發事件。

   ```
   {
     "source": [ 
       "aws.codebuild"
     ], 
     "detail-type": [
       "CodeBuild Build Phase Change" 
     ],
     "detail": {
       "completed-phase": [
         "SUBMITTED",
         "PROVISIONING",
         "DOWNLOAD_SOURCE",
         "INSTALL",
         "PRE_BUILD",
         "BUILD",
         "POST_BUILD",
         "UPLOAD_ARTIFACTS",
         "FINALIZING"
       ],
       "completed-phase-status": [
         "TIMED_OUT",
         "STOPPED",
         "FAILED", 
         "SUCCEEDED",
         "FAULT",
         "CLIENT_ERROR"
       ],
       "project-name": [
         "my-demo-project-1",
         "my-demo-project-2"
       ]
     }  
   }
   ```

   在上個規則中，依需要進行下列程式碼變更。
   + 若要在每次建置階段變更時觸發事件 (對每個建置，最多可傳送九次通知)，請保留 `completed-phase` 陣列中所示的所有值，或移除整個 `completed-phase` 陣列。
   + 若只要對個別組建階段變更來觸發事件，請在 `completed-phase` 陣列中移除您不想觸發事件的每個組建階段的名稱。
   + 若要在每次組建階段狀態變更時觸發事件，請保留 `completed-phase-status` 陣列中所示的全部值，或移除整個 `completed-phase-status` 陣列。
   + 若只要對個別組建階段狀態變更來觸發事件，請在 `completed-phase-status` 陣列中移除您不想觸發事件的每個組建階段狀態的名稱。
   + 若要對所有組建專案觸發事件，請移除 `project-name` 陣列。
   + 若要對個別組建專案觸發事件，請在 `project-name` 陣列中指定每個組建專案的名稱。

   如需事件模式的詳細資訊，請參閱《Amazon EventBridge 使用者指南》中的[事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/filtering-examples-structure.html)。

   如需使用事件模式進行篩選的詳細資訊，請參閱《Amazon EventBridge 使用者指南》中的[使用事件模式進行內容型篩選](https://docs.aws.amazon.com/eventbridge/latest/userguide/content-filtering-with-event-patterns.html)。
**注意**  
如果希望建置狀態變更和建置階段變更都觸發事件，您必須建立兩個不同的規則：一個用於建置狀態變更，另一個用於建置階段變更。如果您嘗試將兩個規則合併成單一規則，合併的規則可能產生非預期的結果，或完全停止運作。

   完成取代程式碼時，選擇 **Save (儲存)**。

1. 在 **Targets** (目標) 中，選擇 **Add target (新增目標)**。

1. 在目標清單中，選擇 **​SNS topic (SNS 主題)**。

1. 對於 **Topic (主題)**，選擇您稍早識別或建立的主題。

1. 展開 **​Configure input (設定輸入)**，然後選擇 **​Input Transformer (輸入轉換器)**。

1. 在 **​Input Path (輸入路徑)** 方塊中，輸入下列其中一個輸入路徑。

   如果規則的 `detail-type` 值為 `CodeBuild Build State Change`，請輸入下列程式碼。

   ```
   {"build-id":"$.detail.build-id","project-name":"$.detail.project-name","build-status":"$.detail.build-status"}
   ```

   如果規則的 `detail-type` 值為 `CodeBuild Build Phase Change`，請輸入下列程式碼。

   ```
   {"build-id":"$.detail.build-id","project-name":"$.detail.project-name","completed-phase":"$.detail.completed-phase","completed-phase-status":"$.detail.completed-phase-status"}
   ```

   如需其他類型的資訊，請參閱[建置通知輸入格式參考](sample-build-notifications-ref.md)。

1. 在 **​Input Template (輸入範本)** 方塊中，輸入下列其中一個輸入範本。

   如果規則的 `detail-type` 值為 `CodeBuild Build State Change`，請輸入下列程式碼。

   ```
   "Build '<build-id>' for build project '<project-name>' has reached the build status of '<build-status>'."
   ```

   如果規則的 `detail-type` 值為 `CodeBuild Build Phase Change`，請輸入下列程式碼。

   ```
   "Build '<build-id>' for build project '<project-name>' has completed the build phase of '<completed-phase>' with a status of '<completed-phase-status>'."
   ```

1. 選擇**設定詳細資訊**。

1. 在 **Step 2: Configure rule details (步驟 2：設定規則詳細資訊)** 頁面上，輸入名稱和選填的描述。針對 **State (狀態)**，將 **Enabled (啟用)** 保留為選取狀態。

1. 選擇**建立規則**。

1. 建立組建專案、執行組建，以及檢視組建資訊。

1. 確認 CodeBuild 現在已成功傳送建置通知。例如，檢查您的收件匣中是否有組建通知電子郵件。

若要變更規則的行為，請在 CloudWatch 主控台中選擇您要變更的規則，選擇**動作**，然後選擇**編輯**。變更規則，選擇 **​Configure details (設定詳細資訊)**，然後選擇 **​Update rule (更新規則)**。

若要停止使用規則來傳送建置通知，請在 CloudWatch 主控台中選擇您要停止使用的規則，選擇**動作**，然後選擇**停用**。

若要完全刪除規則，請在 CloudWatch 主控台中選擇您要刪除的規則，選擇**動作**，然後選擇**刪除**。

# 建置通知輸入格式參考
<a name="sample-build-notifications-ref"></a>

CloudWatch 會以 JSON 格式傳送通知。

組建狀態變更通知採用以下格式：

```
{
  "version": "0",
  "id": "c030038d-8c4d-6141-9545-00ff7b7153EX",
  "detail-type": "CodeBuild Build State Change",
  "source": "aws.codebuild",
  "account": "123456789012",
  "time": "2017-09-01T16:14:28Z",
  "region": "us-west-2",
  "resources":[
    "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX"
  ],
  "detail":{
    "build-status": "SUCCEEDED",
    "project-name": "my-sample-project",
    "build-id": "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX",
    "additional-information": {
      "artifact": {
        "md5sum": "da9c44c8a9a3cd4b443126e823168fEX",
        "sha256sum": "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX",
        "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip"
      },
      "environment": {
        "image": "aws/codebuild/standard:5.0",
        "privileged-mode": false,
        "compute-type": "BUILD_GENERAL1_SMALL",
        "type": "LINUX_CONTAINER",
        "environment-variables": []
      },
      "timeout-in-minutes": 60,
      "build-complete": true,
      "initiator": "MyCodeBuildDemoUser",
      "build-start-time": "Sep 1, 2017 4:12:29 PM",
      "source": {
        "location": "codebuild-123456789012-input-bucket/my-input-artifact.zip",
        "type": "S3"
      },
      "logs": {
        "group-name": "/aws/codebuild/my-sample-project",
        "stream-name": "8745a7a9-c340-456a-9166-edf953571bEX",
        "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX"
      },
      "phases": [
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:12:29 PM",
          "end-time": "Sep 1, 2017 4:12:29 PM",
          "duration-in-seconds": 0,
          "phase-type": "SUBMITTED",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:12:29 PM",
          "end-time": "Sep 1, 2017 4:13:05 PM",
          "duration-in-seconds": 36,
          "phase-type": "PROVISIONING",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:05 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 4,
          "phase-type": "DOWNLOAD_SOURCE",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 0,
          "phase-type": "INSTALL",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 0,
          "phase-type": "PRE_BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 70,
          "phase-type": "BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 0,
          "phase-type": "POST_BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 0,
          "phase-type": "UPLOAD_ARTIFACTS",
          "phase-status": "SUCCEEDED"
        },
         {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:26 PM",
          "duration-in-seconds": 4,
          "phase-type": "FINALIZING",
          "phase-status": "SUCCEEDED"
        },
        {
          "start-time": "Sep 1, 2017 4:14:26 PM",
          "phase-type": "COMPLETED"
        }
      ]
    },
    "current-phase": "COMPLETED",
    "current-phase-context": "[]",
    "version": "1"
  }
}
```

組建階段變更通知採用以下格式：

```
{
  "version": "0",
  "id": "43ddc2bd-af76-9ca5-2dc7-b695e15adeEX",
  "detail-type": "CodeBuild Build Phase Change",
  "source": "aws.codebuild",
  "account": "123456789012",
  "time": "2017-09-01T16:14:21Z",
  "region": "us-west-2",
  "resources":[
    "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX"
  ],
  "detail":{
    "completed-phase": "COMPLETED",
    "project-name": "my-sample-project",
    "build-id": "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX",
    "completed-phase-context": "[]",
    "additional-information": {
      "artifact": {
        "md5sum": "da9c44c8a9a3cd4b443126e823168fEX",
        "sha256sum": "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX",
        "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip"
      },
      "environment": {
        "image": "aws/codebuild/standard:5.0",
        "privileged-mode": false,
        "compute-type": "BUILD_GENERAL1_SMALL",
        "type": "LINUX_CONTAINER",
        "environment-variables": []
      },
      "timeout-in-minutes": 60,
      "build-complete": true,
      "initiator": "MyCodeBuildDemoUser",
      "build-start-time": "Sep 1, 2017 4:12:29 PM",
      "source": {
        "location": "codebuild-123456789012-input-bucket/my-input-artifact.zip",
        "type": "S3"
      },
      "logs": {
        "group-name": "/aws/codebuild/my-sample-project",
        "stream-name": "8745a7a9-c340-456a-9166-edf953571bEX",
        "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX"
      },
      "phases": [
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:12:29 PM",
          "end-time": "Sep 1, 2017 4:12:29 PM",
          "duration-in-seconds": 0,
          "phase-type": "SUBMITTED",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:12:29 PM",
          "end-time": "Sep 1, 2017 4:13:05 PM",
          "duration-in-seconds": 36,
          "phase-type": "PROVISIONING",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:05 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 4,
          "phase-type": "DOWNLOAD_SOURCE",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 0,
          "phase-type": "INSTALL",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:13:10 PM",
          "duration-in-seconds": 0,
          "phase-type": "PRE_BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:13:10 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 70,
          "phase-type": "BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 0,
          "phase-type": "POST_BUILD",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:21 PM",
          "duration-in-seconds": 0,
          "phase-type": "UPLOAD_ARTIFACTS",
          "phase-status": "SUCCEEDED"
        },
        {
          "phase-context": [],
          "start-time": "Sep 1, 2017 4:14:21 PM",
          "end-time": "Sep 1, 2017 4:14:26 PM",
          "duration-in-seconds": 4,
          "phase-type": "FINALIZING",
          "phase-status": "SUCCEEDED"
        },
        {
          "start-time": "Sep 1, 2017 4:14:26 PM",
          "phase-type": "COMPLETED"
        }
      ]  
    },
    "completed-phase-status": "SUCCEEDED",
    "completed-phase-duration-seconds": 4,
    "version": "1",
    "completed-phase-start": "Sep 1, 2017 4:14:21 PM",
    "completed-phase-end": "Sep 1, 2017 4:14:26 PM"
  }
}
```