

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 示例：在中 AWS CodeCommit 为现有 AWS Lambda 函数创建触发器
<a name="how-to-notify-lambda-cc"></a>

创建调用 Lambda 函数的触发器的最简单的方法是在 Lambda 控制台中创建该触发器。这种内置集成可确保 CodeCommit 拥有运行该函数所需的权限。要为现有 Lambda 函数添加触发器，请转到 Lambda 控制台，然后选择该函数。在该函数的**触发器**选项卡上，按照**添加触发器**中的步骤操作。这些步骤类似于[创建 Lambda 函数](how-to-notify-lambda.md#how-to-notify-lambda-create-function)中的步骤。

您还可以在存储库中为 Lambda 函数创建触发器。 CodeCommit 为此，您需要选择要调用的现有 Lambda 函数。它还要求您手动配置运行该函数 CodeCommit 所需的权限。

**Topics**
+ [手动配置权限 CodeCommit 以允许运行 Lambda 函数](#how-to-notify-lam-perm)
+ [在 CodeCommit 存储库（控制台）中为 Lambda 函数创建触发器](#how-to-notify-lam-console)
+ [为 CodeCommit 存储库创建 Lambda 函数的触发器 ()AWS CLI](#how-to-notify-lam-cli)

## 手动配置权限 CodeCommit 以允许运行 Lambda 函数
<a name="how-to-notify-lam-perm"></a>

如果您在中 CodeCommit 创建调用 Lambda 函数的触发器，则必须手动配置允许 CodeCommit 运行 Lambda 函数的权限。要避免进行此手动配置，可以考虑改为在 Lambda 控制台中为该函数创建触发器。<a name="how-to-notify-lambda-create-function-perm"></a>

**CodeCommit 允许运行 Lambda 函数**

1. 打开纯文本编辑器并创建一个 JSON 文件，该文件指定 Lambda 函数名称、 CodeCommit 存储库的详细信息以及您希望在 Lambda 中允许的操作，如下所示：

   ```
   {
       "FunctionName": "MyCodeCommitFunction", 
       "StatementId": "1", 
       "Action": "lambda:InvokeFunction", 
       "Principal": "codecommit.amazonaws.com", 
       "SourceArn": "arn:aws:codecommit:us-east-1:111122223333:MyDemoRepo", 
       "SourceAccount": "111122223333"
   }
   ```

1. 将文件另存为 JSON 文件，其名称便于您记住（例如 *AllowAccessfromMyDemoRepo* .json）。

1. 在终端（Linux、macOS 或 Unix）或命令行 (Windows) 中，使用刚刚创建的 JSON 文件运行 **aws lambda add-permissions** 命令，向与 Lambda 函数关联的资源策略添加权限：

   ```
   aws lambda add-permission --cli-input-json file://AllowAccessfromMyDemoRepo.json
   ```

   该命令返回刚添加的策略语句（JSON 格式），内容如下：

   ```
   {
       "Statement": "{\"Condition\":{\"StringEquals\":{\"AWS:SourceAccount\":\"111122223333\"},\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:codecommit:us-east-1:111122223333:MyDemoRepo\"}},\"Action\":[\"lambda:InvokeFunction\"],\"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:MyCodeCommitFunction\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"codecommit.amazonaws.com\"},\"Sid\":\"1\"}"
   }
   ```

   有关 Lambda 函数资源策略的更多信息，请参阅*AWS Lambda 用户*[指南中的[AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)和 Pull/Push 事件模型](https://docs.aws.amazon.com/lambda/latest/dg/intro-invocation-modes.html)。

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在**控制板**导航窗格中，选择**角色**，然后在角色列表中选择*lambda\$1basic\$1execution*。

1. 在角色的摘要页面上，选择**权限**选项卡，然后在**内联策略**中选择**创建角色策略**。

1. 在 **Set Permissions** 页面上，选择 **Policy Generator**，然后选择 **Select**。

1. 在**编辑权限**页面上，执行以下操作：
   + 在 **Effect** 中选择 **Allow**。
   + 在 **AWS 服务**中，选择 **AWS CodeCommit**。
   + 在 “**操作**” 中，选择**GetRepository**。
   + 在 **Amazon 资源名称（ARN）**中输入存储库的 ARN（例如，`arn:aws:codecommit:us-east-1:111122223333:MyDemoRepo`）。

   选择 **Add Statement**，然后选择 **Next Step**。

1. 在 **Review Policy** 页面上，选择 **Apply Policy**。

   策略语句应如下例所示：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Stmt11111111",
               "Effect": "Allow",
               "Action": [
                   "codecommit:GetRepository"
               ],
               "Resource": [
                   "arn:aws:codecommit:us-east-1:111122223333:MyDemoRepo"
               ]
           }
       ]
   }
   ```

------

## 在 CodeCommit 存储库（控制台）中为 Lambda 函数创建触发器
<a name="how-to-notify-lam-console"></a>

创建 Lambda 函数后，您可以在中创建一个触发器 CodeCommit ，该触发器运行该函数以响应您指定的存储库事件。

**注意**  
在成功测试或运行示例的触发器之前，必须配置允许 CodeCommit 调用函数和 Lambda 函数以获取存储库相关信息的策略。有关更多信息，请参阅 [CodeCommit 允许运行 Lambda 函数](#how-to-notify-lambda-create-function-perm)。

**为 Lambda 函数创建触发器**

1. 在 [https://console.aws.amazon.com/codesuite/codemmit](https://console.aws.amazon.com/codesuite/codecommit/home) /home 打开 CodeCommit 控制台。

1. 从**存储库** 中，选择要创建存储库事件触发器的存储库。

1. 在存储库的导航窗格中，选择**设置**，然后选择**触发器**。

1. 选择**创建触发器**。

1. 在**创建触发器**中，执行以下操作：

    
   + 在**触发器名称**中，输入触发器的名称（例如*MyLambdaFunctionTrigger*）。
   + 在**事件**中，选择触发 Lambda 函数的存储库事件。

     如果选择 **All repository events**，则无法选择任何其他事件。如果需要选择事件的子集，请清除 **All repository events**，然后从列表中选择所需的事件。例如，如果希望触发器只在用户在 CodeCommit 存储库中创建标签或分支时运行，请删除**所有存储库事件**，然后选择**创建分支或标记**。
   + 如果您希望触发器应用于存储库中的所有分支，请在**分支**中，将选定内容保留为空，因为此默认选项会自动将触发器应用于所有分支。如果您希望此触发器仅应用于特定分支，请从存储库分支列表中选择最多 10 个分支名称。
   + 在**选择要使用的服务**中，选择 **AWS Lambda**。
   + 在 **Lambda 函数**中，从列表中选择函数名称，或输入函数的 ARN。
   + （可选）在**自定义数据**中，输入要包含在 Lambda 函数中的信息（例如，开发人员用于讨论存储库中的开发工作的 IRC 通道的名称）。该字段是一个字符串。它不能用于传递任何动态参数。

1. （可选）选择**测试触发器**。该选项将尝试使用有关您的存储库的示例数据（包括存储库的最新提交 ID）调用该函数。（如果不存在提交历史记录，则将生成由零组成的示例值。） 这有助于您确认您已正确配置 CodeCommit 和 Lambda 函数之间的访问权限。

1. 选择**创建触发器**以完成触发器的创建操作。

1. 要验证触发器的功能，请生成并向配置该触发器的存储库推送一个提交。在 Lambda 控制台中该函数的**监控**选项卡上，您应该会看到 Lambda 函数的响应。

## 为 CodeCommit 存储库创建 Lambda 函数的触发器 ()AWS CLI
<a name="how-to-notify-lam-cli"></a>

您还可以使用命令行为 Lambda 函数创建触发器，以响应 CodeCommit 存储库事件，例如有人向您的仓库推送提交时。

**为 Lambda 函数创建触发器**

1. 打开纯文本编辑器，创建一个 JSON 文件，在其中指定：
   + Lambda 函数名称。
   + 要用该触发器监控的存储库和分支。（如果没有指定任何分支，触发器将应用到存储库中的所有分支。）
   + 激活该触发器的事件。

    保存该文件。

   例如，如果您要为名为的存储库创建触发器，*MyDemoRepo*该存储库将所有存储库事件发布到名*MyCodeCommitFunction*为两个分支的 Lambda 函数，*main*并且：*preprod*

   ```
   {
       "repositoryName": "MyDemoRepo",
       "triggers": [
           {
               "name": "MyLambdaFunctionTrigger",
               "destinationArn": "arn:aws:lambda:us-east-1:111122223333:function:MyCodeCommitFunction",
               "customData": "",
               "branches": [
                   "main", "preprod"
               ],
               "events": [
                   "all"
               ]
           }
       ]
   }
   ```

   存储库中的每个触发器在该 JSON 文件中都有一个对应的触发块。要为存储库创建多个触发器，请在 JSON 中包含更多的触发块。请记住，在该文件中创建的所有触发器都用于指定的存储库。不能在一个 JSON 文件中为多个存储库创建触发器。例如，如果要为某个存储库创建两个触发器，您可以创建一个包含两个触发块的 JSON 文件。在下面的示例中，第二个触发块中未指定任何分支，因此，该触发器将应用到所有分支：

    

   ```
   {
       "repositoryName": "MyDemoRepo",
       "triggers": [
           {
               "name": "MyLambdaFunctionTrigger",
               "destinationArn": "arn:aws:lambda:us-east-1:111122223333:function:MyCodeCommitFunction",
               "customData": "",
               "branches": [
                   "main", "preprod"
               ],
               "events": [
                   "all"
               ]
           },
           {
               "name": "MyOtherLambdaFunctionTrigger",
               "destinationArn": "arn:aws:lambda:us-east-1:111122223333:function:MyOtherCodeCommitFunction",
               "customData": "",
               "branches": [],
               "events": [
                   "updateReference", "deleteReference"
               ]
           }
       ]
   }
   ```

   您可以为指定的事件 (例如，向存储库推送提交时) 创建触发器。事件类型包括：
   + `all`：指定存储库和分支中的所有事件。
   + `updateReference`：向指定存储库和分支推送提交时。
   + `createReference`：在指定存储库中创建新的分支或标签时。
   + `deleteReference`：在指定存储库中删除分支或标签时。
**注意**  
您可以在触发器中使用多种事件类型。但如果指定 `all`，就无法再指定其他事件。

   要查看有效事件类型的完整列表，请在终端或命令提示符处输入 **aws codecommit put-repository-triggers help**。

   此外，您还可以在 `customData` 中包含一个字符串 (例如，开发人员在讨论该存储库的开发时使用的 IRC 通道的名称)。该字段是一个字符串。它不能用于传递任何动态参数。此字符串作为属性附加到为响应触发器而返回的 CodeCommit JSON 中。

1. （可选）在终端或命令提示符处，运行 **test-repository-triggers** 命令。例如，以下内容用于测试名为的 JSON 文件*trigger.json*是否有效以及该文件是否 CodeCommit 可以触发 Lambda 函数。如果没有实际数据可用，该测试使用示例数据来触发函数。

   ```
   aws codecommit test-repository-triggers --cli-input-json file://trigger.json
   ```

   如果成功，该命令返回类似以下内容的信息：

   ```
   {
       "successfulExecutions": [
           "MyLambdaFunctionTrigger"
       ],
       "failedExecutions": []
   }
   ```

1. 在终端或命令提示符中，运行 **put-repository-triggers** 命令在 CodeCommit 中创建触发器。例如，要使用名为的 JSON 文件*trigger.json*来创建触发器，请执行以下操作：

   `aws codecommit put-repository-triggers --cli-input-json file://trigger.json`

   该命令将返回与以下示例类似的配置 ID：

   ```
   {
       "configurationId": "0123456-I-AM-AN-EXAMPLE"
   }
   ```

1. 要查看触发器的配置，请运行 **get-repository-triggers** 命令，并指定存储库的名称：

   `aws codecommit get-repository-triggers --repository-name MyDemoRepo`

   该命令返回为存储库配置的所有触发器的结构，类似于以下内容：

   ```
   {
       "configurationId": "0123456-I-AM-AN-EXAMPLE",
       "triggers": [
           {
               "events": [
                   "all"
               ],
               "destinationArn": "arn:aws:lambda:us-east-1:111122223333:MyCodeCommitFunction",
               "branches": [
                   "main",
                   "preprod"
               ],
               "name": "MyLambdaFunctionTrigger",
               "customData": "Project ID 12345"
           }
       ]
   }
   ```

1. 要测试触发器的功能，请生成并向配置该触发器的存储库推送一个提交。在 Lambda 控制台中该函数的**监控**选项卡上，您应该会看到 Lambda 函数的响应。