

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

# 教程：将变量与 Lambda 调用操作一起使用
<a name="tutorials-lambda-variables"></a>

Lambda 调用操作可以使用来自另一个操作的变量作为其输入的一部分，并返回新变量及其输出。有关中操作变量的信息 CodePipeline，请参见[变量参考](reference-variables.md)。

**重要**  
作为创建管道的一部分，客户提供的 S3 工件存储桶将 CodePipeline 用于项目。（这与用于 S3 源操作的存储桶不同。） 如果 S3 工件存储桶与您的管道账户位于不同的账户中，请确保 S3 工件存储桶归其所有 AWS 账户 ，该存储桶是安全且可靠的。

在本教程结束时，您将具备：
+ Lambda 调用操作：
  + 消耗 CodeCommit 源`CommitId`操作中的变量
  + 输出三个新变量：`dateTime`、`testRunId` 和 `region`
+ 一个手动审批操作，它使用 Lambda 调用操作中的新变量以提供测试 URL 和测试运行 ID
+ 使用新操作更新的管道

**Topics**
+ [先决条件](#lambda-variables-prereqs)
+ [第 1 步：创建 Lambda 函数](#lambda-variables-function)
+ [步骤 2：向您的管道添加 Lambda 调用操作和手动审批操作](#lambda-variables-pipeline)

## 先决条件
<a name="lambda-variables-prereqs"></a>

在开始之前，您必须具有以下内容：
+ 您可以创建或使用带有 CodeCommit 源代码的管道[教程：创建简单的管道（CodeCommit 存储库）](tutorials-simple-codecommit.md)。
+ 编辑现有管道，使 CodeCommit 源操作具有命名空间。将命名空间 `SourceVariables` 分配给操作。

## 第 1 步：创建 Lambda 函数
<a name="lambda-variables-function"></a>

使用以下步骤可创建 Lambda 函数和 Lambda 执行角色。创建 Lambda 函数后，可以将 Lambda 操作添加到您的管道中。

**创建 Lambda 函数和执行角色**

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

1. 选择**创建函数**。将 **Author from scratch (从头开始创作)** 保持选中状态：

1. 在 **Function name (函数名称)** 中，输入您的函数的名称，例如 **myInvokeFunction**。在 **Runtime (运行时)** 中，保持选中默认选项。

1. 展开 **Choose or create an execution role (选择或创建执行角色)**。选择 **Create a new role with basic Lambda permissions (创建具有基本 Lambda 权限的新角色)**。

1. 选择**创建函数**。

1. 要使用来自另一个操作的变量，必须将它传递给 Lambda 调用操作配置中的 `UserParameters`。您将在本教程的后面部分的管道中配置操作，但假设将传递变量，您将添加代码。

   要生成新变量，请将输入上名为 `outputVariables` 的属性设置为 `putJobSuccessResult`。请注意，您不能将变量作为 `putJobFailureResult` 的一部分生成。

   ```
    const putJobSuccess = async (message) => {
           const params = {
               jobId: jobId,
               outputVariables: {
                   testRunId: Math.floor(Math.random() * 1000).toString(),
                   dateTime: Date(Date.now()).toString(),
                   region: lambdaRegion
               }
           };
   ```

   在新函数中，在**代码**选项卡上，将以下示例代码粘贴到 `index.mjs` 下方。

   ```
   import { CodePipeline } from '@aws-sdk/client-codepipeline';
   
   export const handler = async (event, context) => {
       const codepipeline = new CodePipeline({});
       
       // Retrieve the Job ID from the Lambda action
       const jobId = event["CodePipeline.job"].id;
       
       // Retrieve UserParameters
       const params = event["CodePipeline.job"].data.actionConfiguration.configuration.UserParameters;
       
       // The region from where the lambda function is being executed
       const lambdaRegion = process.env.AWS_REGION;
       
       // Notify CodePipeline of a successful job
       const putJobSuccess = async (message) => {
           const params = {
               jobId: jobId,
               outputVariables: {
                   testRunId: Math.floor(Math.random() * 1000).toString(),
                   dateTime: Date(Date.now()).toString(),
                   region: lambdaRegion
               }
           };
           
           try {
               await codepipeline.putJobSuccessResult(params);
               return message;
           } catch (err) {
               throw err;
           }
       };
       
       // Notify CodePipeline of a failed job
       const putJobFailure = async (message) => {
           const params = {
               jobId: jobId,
               failureDetails: {
                   message: JSON.stringify(message),
                   type: 'JobFailed',
                   externalExecutionId: context.invokeid
               }
           };
           
           try {
               await codepipeline.putJobFailureResult(params);
               throw message;
           } catch (err) {
               throw err;
           }
       };
       
       try {
           console.log("Testing commit - " + params);
           
           // Your tests here
           
           // Succeed the job
           return await putJobSuccess("Tests passed.");
       } catch (ex) {
           // If any of the assertions failed then fail the job
           return await putJobFailure(ex);
       }
   };
   ```

1. 允许该函数自动保存。

1. 复制屏幕顶部的**函数 ARN** 字段中包含的 Amazon 资源名称（ARN）。

1. 最后一步，打开 AWS Identity and Access Management (IAM) 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。修改 Lambda 执行角色以添加以下策略：。[AWSCodePipelineCustomActionAccess](https://console.aws.amazon.com/iam/home?region=us-west-2#/policies/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAWSCodePipelineCustomActionAccess)有关创建 Lambda 执行角色或修改角色策略的步骤，请参阅[第 2 步：创建 Lambda 函数](actions-invoke-lambda-function.md#actions-invoke-lambda-function-create-function) 。

## 步骤 2：向您的管道添加 Lambda 调用操作和手动审批操作
<a name="lambda-variables-pipeline"></a>

在此步骤中，将 Lambda 调用操作添加到您的管道中。可以在名为 **Test** 的阶段中添加操作。操作类型是一个调用动作。然后，您可以在调用操作后面添加手动审批操作。

**向管道添加 Lambda 操作和手动审批操作**

1. 打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

   将显示与您的 AWS 账户关联的所有管道的名称。选择要添加操作的管道。

1. 将 Lambda 测试操作添加到您的管道中。

   1. 要编辑您的管道，请选择**编辑**。在现有管道中的源操作后面添加一个阶段。输入阶段的名称，例如 **Test**。

   1. 在新阶段中，选择**添加操作组**来添加操作。在 **Action name (操作名称)** 中，输入调用操作的名称，例如 **Test\$1Commit**。

   1. 对于**操作提供程序**，选择 **AWS Lambda**。

   1. 在 **Input artifacts (输入构件)** 中，选择源操作输出构件的名称，例如 `SourceArtifact`。

   1. 在中 **FunctionName**，添加您创建的 Lambda 函数的 ARN。

   1. 在 **Variable namespace (变量命名空间)** 中，添加命名空间名称，例如 **TestVariables**。

   1. 在**输出构件**中，添加输出构件名称，如 **LambdaArtifact**。

   1. 选择**完成**。

1. 将手动审批操作添加到您的管道中。

   1. 如果您的管道仍处于编辑模式，则在调用操作后面添加一个阶段。输入阶段的名称，例如 **Approval**。

   1. 在新阶段中，选择要添加操作的图标。在 **Action name (操作名称)** 中，输入审批操作的名称，例如 **Change\$1Approval**。

   1. 在 **Action provider (操作提供程序)** 中，选择 **Manual approval (手动审批)**。

   1. 在 **URL for review (用于审查的 URL)** 中，通过为 `CommitId` 变量和 `region` 变量添加变量语法，来构建 URL。确保您使用分配给提供输出变量的操作的命名空间。

      在此示例中，带有 CodeCommit 动作变量语法的 URL 具有默认命名空间`SourceVariables`。Lambda 区域输出变量具有 `TestVariables` 命名空间。此 URL 如下所示：

      ```
      https://#{TestVariables.region}.console.aws.amazon.com/codesuite/codecommit/repositories/MyDemoRepo/commit/#{SourceVariables.CommitId}
      ```

      在 **Comments (注释)** 中，通过添加 `testRunId` 变量的变量语法，构建审批消息文本。对于此示例，使用 Lambda `testRunId` 输出变量的变量语法的 URL 具有 `TestVariables` 命名空间。输入以下消息。

      ```
      Make sure to review the code before approving this action. Test Run ID: #{TestVariables.testRunId}
      ```

1. 选择 **Done (完成)** 以关闭操作的编辑屏幕，然后选择 **Done (完成)** 以关闭阶段的编辑屏幕。要保存管道，请选择 **Done (完成)**。已完成的管道现在包含一个结构，该结构带有源、测试、审批和部署阶段。

   选择 **Release change (发布更改)** 以通过管道结构运行最新更改。

1. 当管道到达手动审批阶段时，选择 **Review (审核)**。解析的变量显示为提交 ID 的 URL。您的审批人可以选择该 URL 来查看提交。

1. 当成功运行管道后，您还可以在操作执行历史记录页面上查看变量值。