

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

# CodeCommit 來源動作和 EventBridge
<a name="triggering"></a>

若要在 CodePipeline 中新增 CodeCommit 來源動作，您可以選擇： CodePipeline 
+ 使用 CodePipeline 主控台**建立管道**精靈 ([建立自訂管道 （主控台）](pipelines-create.md#pipelines-create-console)) 或**編輯動作**頁面，選擇 **CodeCommit** 提供者選項。主控台會建立 EventBridge 規則，在來源變更時啟動您的管道。
+ 使用 AWS CLI 為動作新增`CodeCommit`動作組態，並建立其他資源，如下所示：
  + 使用 中`CodeCommit`的範例動作組態[CodeCommit 來源動作參考](action-reference-CodeCommit.md)來建立您的動作，如 所示[建立管道 (CLI)](pipelines-create.md#pipelines-create-cli)。
  + 變更偵測方法預設為透過輪詢來源來啟動管道。您應該停用定期檢查，並手動建立變更偵測規則。使用下列其中一種方法：[為 CodeCommit 來源建立 EventBridge 規則 （主控台）](pipelines-trigger-source-repo-changes-console.md)、 [為 CodeCommit 來源 (CLI) 建立 EventBridge 規則](pipelines-trigger-source-repo-changes-cli.md)或 [為 CodeCommit 來源建立 EventBridge 規則 (CloudFormation 範本）](pipelines-trigger-source-repo-changes-cfn.md)。

**Topics**
+ [為 CodeCommit 來源建立 EventBridge 規則 （主控台）](pipelines-trigger-source-repo-changes-console.md)
+ [為 CodeCommit 來源 (CLI) 建立 EventBridge 規則](pipelines-trigger-source-repo-changes-cli.md)
+ [為 CodeCommit 來源建立 EventBridge 規則 (CloudFormation 範本）](pipelines-trigger-source-repo-changes-cfn.md)

# 為 CodeCommit 來源建立 EventBridge 規則 （主控台）
<a name="pipelines-trigger-source-repo-changes-console"></a>

**重要**  
如果您使用主控台來建立或編輯管道，則會為您建立 EventBridge 規則。

**建立 EventBridge 規則以用於 CodePipeline 操作**

1. 前往 [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/) 開啟 Amazon EventBridge 主控台。

1. 在導覽窗格中，選擇**規則**。保持選取預設匯流排，或選擇事件匯流排。選擇**建立規則**。

1. 在**名稱**中，輸入規則的名稱。

1. 在**規則類型**下，選擇**具有事件模式的規則**。選擇**下一步**。

1. 在**事件來源**下，選擇**AWS 事件或 EventBridge 合作夥伴事件**。

1. 在**範例事件類型**下，選擇**AWS 事件**。

1. 在**範例事件**中，輸入 CodeCommit 作為要篩選的關鍵字。選擇 **CodeCommit 儲存庫狀態變更**。

1. 在**建立方法**下，選擇**客戶模式 (JSON 編輯器）**。

   貼上下方提供的事件模式。以下是事件視窗中具有名為 分支之`MyTestRepo`儲存庫的範例 CodeCommit **事件**模式`main`：

   ```
   {
     "source": [
       "aws.codecommit"
     ],
     "detail-type": [
       "CodeCommit Repository State Change"
     ],
     "resources": [
       "arn:aws:codecommit:us-west-2:80398EXAMPLE:MyTestRepo"
     ],
     "detail": {
       "referenceType": [
         "branch"
       ],
       "referenceName": [
         "main"
       ]
     }
   }
   ```

1. 在 **Targets (目標)** 中，選擇 **CodePipeline**。

1. 輸入要由此規則啟動之管道的管道 ARN。
**注意**  
在您執行 **get-pipeline** 命令之後，即可在中繼資料輸出中找到管道 ARN。管道 ARN 是以下列格式建構：  
arn：aws：codepipeline：*region*：*account*：*pipeline-name*  
範例管道 ARN：  
`arn:aws:codepipeline:us-east-2:80398EXAMPLE:MyFirstPipeline`

1. 若要建立或指定 IAM 服務角色，以授予 EventBridge 調用與 EventBridge 規則相關聯目標的許可 （在此情況下，目標是 CodePipeline)：
   + 選擇**為此特定資源建立新角色**，以建立將 EventBridge 許可授予您啟動管道執行的服務角色。
   + 選擇**使用現有角色**來輸入服務角色，為 EventBridge 授予啟動管道執行的許可。

1. （選用） 若要使用特定影像 ID 指定來源覆寫，請使用輸入轉換器將資料作為 JSON 參數傳遞。您也可以使用輸入轉換器來傳遞管道變數。
   + 展開 **Additional settings** (其他設定)。

     在**設定目標輸入**下，選擇**設定輸入轉換器**。

     在對話方塊中，選擇**輸入我自己的**。在**輸入路徑**方塊中，輸入下列鍵值對。

     ```
     {"revisionValue": "$.detail.image-digest"}
     ```
   + 在**範本**方塊中，輸入下列鍵/值對。

     ```
     {
         "sourceRevisions": [
             {
                 "actionName": "Source",
                 "revisionType": "COMMIT_ID",
                 "revisionValue": "<revisionValue>"
             }
         ],
         "variables": [
             {
                 "name": "Branch_Name",
                 "value": "value"
             }
         ]
     }
     ```
   + 選擇**確認**。

1. 選擇**下一步**。

1. 在**標籤**頁面上，選擇**下一步**。

1. 在**檢閱和建立**頁面上，檢閱規則組態。如果您對此規則感到滿意，請選擇 **Create rule (建立規則)**。

# 為 CodeCommit 來源 (CLI) 建立 EventBridge 規則
<a name="pipelines-trigger-source-repo-changes-cli"></a>

呼叫 **put-rule** 命令，並指定：
+ 可唯一識別您所建立規則的名稱。此名稱在您使用與 AWS 帳戶相關聯的 CodePipeline 建立的所有管道中必須是唯一的。
+ 規則所使用來源和詳細資訊欄位的事件模式。如需詳細資訊，請參閱 [Amazon EventBridge 和事件模式](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html)。<a name="proc-cli-event-codecommit"></a>

**使用 CodeCommit 作為事件來源和 CodePipeline 作為目標來建立 EventBridge 規則**

1. 新增 EventBridge 使用 CodePipeline 叫用規則的許可。如需詳細資訊，請參閱[使用 Amazon EventBridge 的資源型政策](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-use-resource-based.html)。

   1. 使用下列範例建立信任政策，允許 EventBridge 擔任服務角色。將信任政策命名為 `trustpolicyforEB.json`。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "events.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      ```

------

   1. 使用下列命令來建立 `Role-for-MyRule` 角色，並連接信任政策。

      ```
      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
      ```

   1. 為名為 `MyFirstPipeline` 的管道建立許可政策 JSON，如這個範例所示。將許可政策命名為 `permissionspolicyforEB.json`。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "codepipeline:StartPipelineExecution"
                  ],
                  "Resource": [
                      "arn:aws:codepipeline:us-west-2:111122223333:MyFirstPipeline"
                  ]
              }
          ]
      }
      ```

------

   1. 使用執行以下命令，將 `CodePipeline-Permissions-Policy-for-EB` 許可政策連接到 `Role-for-MyRule` 角色。

      **為什麼我會做出此變更？** 將此政策新增至角色會建立 EventBridge 的許可。

      ```
      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
      ```

1. 呼叫 **put-rule** 命令，並包含 `--name`、`--event-pattern` 和 `--role-arn` 參數。

   **為什麼我會做出此變更？** 此命令可讓 CloudFormation 建立事件。

   以下範例命令會建立名為 `MyCodeCommitRepoRule` 的規則。

   ```
   aws events put-rule --name "MyCodeCommitRepoRule" --event-pattern "{\"source\":[\"aws.codecommit\"],\"detail-type\":[\"CodeCommit Repository State Change\"],\"resources\":[\"repository-ARN\"],\"detail\":{\"referenceType\":[\"branch\"],\"referenceName\":[\"main\"]}}" --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
   ```

1. 若要新增 CodePipeline 做為目標，請呼叫 **put-targets**命令並包含下列參數：
   + `--rule` 參數與您使用 **put-rule** 所建立的 `rule_name` 搭配使用。
   + `--targets` 參數與目標清單中目標的清單 `Id` 和目標管道的 `ARN` 搭配使用。

   以下命令範例指定名為 `MyCodeCommitRepoRule` 的規則，該目標 `Id` 是由數字 1 組成，指出在規則的目標清單中，這是目標 1。此範例命令也會指定管道的範例 `ARN`。儲存庫中若發生變更，管道就會啟動。

   ```
   aws events put-targets --rule MyCodeCommitRepoRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
   ```

1. （選用） 若要為特定映像 ID 設定具有來源覆寫的輸入轉換器，請在 CLI 命令中使用下列 JSON。下列範例會設定覆寫，其中：
   + 在此`actionName``Source`範例中， 是在管道建立時定義的動態值，不是衍生自來源事件。
   + 在此`revisionType``COMMIT_ID`範例中， 是在管道建立時定義的動態值，不是衍生自來源事件。
   + 此範例中的 `revisionValue`<*revisionValue*> 衍生自來源事件變數。

   ```
   {
       "Rule": "my-rule",
       "Targets": [
           {
               "Id": "MyTargetId",
               "Arn": "pipeline-ARN",
               "InputTransformer": {
                   "sourceRevisions": {
                       "actionName": "Source",
                       "revisionType": "COMMIT_ID",
                       "revisionValue": "<revisionValue>"
                   },
                   "variables": [
                       {
                           "name": "Branch_Name",
                           "value": "value"
                       }
                   ]
               }
           }
       ]
   }
   ```<a name="proc-cli-flag-codecommit"></a>

**編輯管道的 PollForSourceChanges 參數**
**重要**  
當您使用這個方法建立管道時，如果沒有明確設為 false，則 `PollForSourceChanges` 參數會預設為 true。當新增基於事件的變更偵測時，您必須將該參數新增到輸出，並將其設為 false 以停用輪詢。否則，您的管道會針對單一來源變更啟動兩次。如需詳細資訊，請參閱[`PollForSourceChanges` 參數的有效設定](PollForSourceChanges-defaults.md)。

1. 執行 **get-pipeline** 命令，將管道結構複製到 JSON 檔案。例如，針對名為 `MyFirstPipeline` 的管道，執行下列命令：

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

   此命令不會傳回任何內容，但您建立的檔案應該會顯示在您執行命令的目錄中。

1. 在任何純文字編輯器中開啟 JSON 檔案，然後將 `PollForSourceChanges` 參數變更為 `false`，來編輯來源階段，如這個範例所示。

   **為什麼我會做出此變更？** 將此參數變更為 `false` 會關閉定期檢查，因此您只能使用事件型變更偵測。

   ```
   "configuration": {
       "PollForSourceChanges": "false",
       "BranchName": "main",
       "RepositoryName": "MyTestRepo"
   },
   ```

1. 如果您使用的是使用 **get-pipeline** 命令擷取的管道結構，請從 JSON 檔案中移除 `metadata` 行。否則，**update-pipeline** 命令無法使用它。移除 `"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
   ```

   此命令會傳回所編輯管道的整個結構。
**注意**  
**update-pipeline** 命令將終止管道。若在您執行 **update-pipeline** 命令時有修訂正在透過管道執行，該執行將停止。您必須手動啟動管道，以透過更新的管道執行該修訂。使用 **`start-pipeline-execution`** 命令來手動啟動您的管道。

# 為 CodeCommit 來源建立 EventBridge 規則 (CloudFormation 範本）
<a name="pipelines-trigger-source-repo-changes-cfn"></a>



若要使用 CloudFormation 建立規則，請更新您的範本，如下所示。<a name="proc-cfn-event-codecommit"></a>

**更新您的管道 CloudFormation 範本並建立 EventBridge 規則**

1. 在 範本的 下`Resources`，使用 `AWS::IAM::Role` CloudFormation 資源來設定允許事件啟動管道的 IAM 角色。此項目會建立一個使用兩個政策的角色：
   + 第一個政策允許要承擔的角色。
   + 第二個政策提供啟動管道的許可。

   **為什麼我會做出此變更？** 新增 `AWS::IAM::Role` 資源 CloudFormation 可讓 建立 EventBridge 的許可。此資源會新增至您的 CloudFormation 堆疊。

------
#### [ YAML ]

   ```
     EventRole:
       Type: AWS::IAM::Role
       Properties:
         AssumeRolePolicyDocument:
           Version: 2012-10-17		 	 	 
           Statement:
             -
               Effect: Allow
               Principal:
                 Service:
                   - events.amazonaws.com
               Action: sts:AssumeRole
         Path: /
         Policies:
           -
             PolicyName: eb-pipeline-execution
             PolicyDocument:
               Version: 2012-10-17		 	 	 
               Statement:
                 -
                   Effect: Allow
                   Action: codepipeline:StartPipelineExecution
                   Resource: !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ]
   ```

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

   ```
   "EventRole": {
     "Type": "AWS::IAM::Role", 
     "Properties": {
       "AssumeRolePolicyDocument": {
         "Version": "2012-10-17",		 	 	 
         "Statement": [
           {
             "Effect": "Allow",
             "Principal": {
               "Service": [
                 "events.amazonaws.com"
               ]
             },
             "Action": "sts:AssumeRole"
           }
         ]
       },
       "Path": "/",
       "Policies": [
         {
           "PolicyName": "eb-pipeline-execution",
           "PolicyDocument": {
             "Version": "2012-10-17",		 	 	 
             "Statement": [
               {
                 "Effect": "Allow",
                 "Action": "codepipeline:StartPipelineExecution",
                 "Resource": {
                   "Fn::Join": [
                     "",
                     [
                       "arn:aws:codepipeline:",
                       {
                         "Ref": "AWS::Region"
                       },
                       ":",
                       {
                         "Ref": "AWS::AccountId"
                       },
                       ":",
                       {
                         "Ref": "AppPipeline"
                       }
                     ]
   
   ...
   ```

------

1. 在 範本的 下`Resources`，使用 `AWS::Events::Rule` CloudFormation 資源來新增 EventBridge 規則。此事件模式會建立事件，以監控對儲存庫的推送變更。當 EventBridge 偵測到儲存庫狀態變更時，規則會在您的目標管道`StartPipelineExecution`上叫用 。

   **為什麼要進行這項變更？ ** 新增 `AWS::Events::Rule` 資源 CloudFormation 可讓 建立事件。此資源會新增至您的 CloudFormation 堆疊。

------
#### [ YAML ]

   ```
     EventRule:
       Type: AWS::Events::Rule
       Properties:
         EventPattern:
           source:
             - aws.codecommit
           detail-type:
             - 'CodeCommit Repository State Change'
           resources:
             - !Join [ '', [ 'arn:aws:codecommit:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref RepositoryName ] ]
           detail:
             event:
               - referenceCreated
               - referenceUpdated
             referenceType:
               - branch
             referenceName:
               - main
         Targets:
           -
             Arn: 
               !Join [ '', [ 'arn:aws:codepipeline:', !Ref 'AWS::Region', ':', !Ref 'AWS::AccountId', ':', !Ref AppPipeline ] ]
             RoleArn: !GetAtt EventRole.Arn
             Id: codepipeline-AppPipeline
   ```

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

   ```
   "EventRule": {
     "Type": "AWS::Events::Rule",
     "Properties": {
       "EventPattern": {
         "source": [
           "aws.codecommit"
         ],
         "detail-type": [
           "CodeCommit Repository State Change"
         ],
         "resources": [
           {
             "Fn::Join": [
               "",
               [
                 "arn:aws:codecommit:",
                 {
                   "Ref": "AWS::Region"
                 },
                 ":",
                 {
                   "Ref": "AWS::AccountId"
                 },
                 ":",
                 {
                   "Ref": "RepositoryName"
                 }
               ]
             ]
           }
         ],
         "detail": {
           "event": [
             "referenceCreated",
             "referenceUpdated"
           ],
           "referenceType": [
             "branch"
           ],
           "referenceName": [
             "main"
           ]
         }
       },
       "Targets": [
         {
           "Arn": {
             "Fn::Join": [
               "",
               [
                 "arn:aws:codepipeline:",
                 {
                   "Ref": "AWS::Region"
                 },
                 ":",
                 {
                   "Ref": "AWS::AccountId"
                 },
                 ":",
                 {
                   "Ref": "AppPipeline"
                 }
               ]
             ]
           },
           "RoleArn": {
             "Fn::GetAtt": [
               "EventRole",
               "Arn"
             ]
           },
           "Id": "codepipeline-AppPipeline"
         }
       ]
     }
   },
   ```

------

1. （選用） 若要為特定映像 ID 設定具有來源覆寫的輸入轉換器，請使用下列 YAML 程式碼片段。下列範例會設定覆寫，其中：
   + 在此`actionName``Source`範例中， 是在管道建立時定義的動態值，不是衍生自來源事件。
   + 在此`revisionType``COMMIT_ID`範例中， 是在管道建立時定義的動態值，不是衍生自來源事件。
   + 此範例中的 `revisionValue`<*revisionValue*> 衍生自來源事件變數。
   + `Value` 指定 `BranchName`和 的輸出變數。

   ```
   Rule: my-rule
   Targets:
   - Id: MyTargetId
     Arn: pipeline-ARN
     InputTransformer:
       sourceRevisions:
         actionName: Source
         revisionType: COMMIT_ID
         revisionValue: <revisionValue>
       variables:
       - name: BranchName
         value: value
   ```

1. 將更新後的範本儲存至本機電腦，然後開啟 CloudFormation 主控台。

1. 選擇您的堆疊，然後選擇 **Create Change Set for Current Stack (建立目前堆疊的變更集)**。

1. 上傳範本，然後檢視 CloudFormation中所列的變更。這些是會針對堆疊進行的變更。您應該會在清單中看到新資源。

1. 選擇 **Execute (執行)**。<a name="proc-cfn-flag-codecommit"></a>

**編輯管道的 PollForSourceChanges 參數**
**重要**  
在許多情況下，當您建立管道時，`PollForSourceChanges` 參數會預設為 true。當新增基於事件的變更偵測時，您必須將該參數新增到輸出，並將其設為 false 以停用輪詢。否則，您的管道會針對單一來源變更啟動兩次。如需詳細資訊，請參閱[`PollForSourceChanges` 參數的有效設定](PollForSourceChanges-defaults.md)。
+ 在範本中，將 `PollForSourceChanges` 變更為 `false`。如果您並未在管道定義中包含 `PollForSourceChanges`，請新增它，並將其設為 `false`。

  **為什麼我會做出此變更？** 將此參數變更為 `false` 會關閉定期檢查，因此您只能使用事件型變更偵測。

------
#### [ YAML ]

  ```
            Name: Source
            Actions: 
              - 
                Name: SourceAction
                ActionTypeId: 
                  Category: Source
                  Owner: AWS
                  Version: 1
                  Provider: CodeCommit
                OutputArtifacts: 
                  - Name: SourceOutput
                Configuration: 
                  BranchName: !Ref BranchName
                  RepositoryName: !Ref RepositoryName
                  PollForSourceChanges: false
                RunOrder: 1
  ```

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

  ```
  {
    "Name": "Source", 
    "Actions": [
      {
        "Name": "SourceAction",
        "ActionTypeId": {
          "Category": "Source",
          "Owner": "AWS",
          "Version": 1,
          "Provider": "CodeCommit"
        },
        "OutputArtifacts": [
          {
            "Name": "SourceOutput"
          }
        ],
        "Configuration": {
          "BranchName": {
            "Ref": "BranchName"
          },
          "RepositoryName": {
            "Ref": "RepositoryName"
          },
          "PollForSourceChanges": false
        },
        "RunOrder": 1
      }
    ]
  },
  ```

------