使用映射状态多次调用 Lambda - AWS Step Functions
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用映射状态多次调用 Lambda

在本教程中,您将学习如何根据状态机输入使用 Map 状态多次调用 AWS Lambda 函数。

创建使用 Lambda 的 Step Functions 状态机;教程将引导您创建一个调用 Lambda 函数的状态机。如果您已完成该教程,请跳至步骤 4,并使用之前创建的 AWS Identity and Access Management (IAM) 角色和 Lambda 函数。

步骤 1:为 Lambda 创建 IAM 角色

AWS Lambda 和 AWS Step Functions 均可执行代码和访问 AWS 资源(例如,存储在 Amazon S3 存储桶中的数据)。为了保持安全性,您必须授予 Lambda 和 Step Functions 对这些资源的访问权限。

Lambda 要求您在创建 Lambda 函数时指定 AWS Identity and Access Management (IAM) 角色,其方式与您创建状态机时 Step Functions 要求您指定 IAM 角色相同。

您将使用 IAM 控制台创建服务相关角色。

创建角色(控制台)

  1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

  2. 在 IAM 控制台的导航窗格中,选择 Roles。然后选择 Create role

  3. 选择 AWS 服务角色类型,然后选择 Lambda

  4. 选择 Lambda 使用案例。使用案例由服务定义以包含服务所需的信任策略。然后选择 Next: Permissions

  5. 选择一个或多个要附加到角色的许可策略(例如,AWSLambdaBasicExecutionRole)。请参阅 AWS Lambda 权限模型

    选中用于分配您希望角色拥有的权限的策略旁的框,然后选择 Next: Review

  6. 输入 Role name

  7. (可选) 对于 Role description,编辑新服务相关角色的描述。

  8. 检查该角色,然后选择创建角色

步骤 2:创建 Lambda 函数

您的 Lambda 函数接收输入(一个名称)并返回包含输入值的问候语。

重要

确保您的 Lambda 函数与状态机位于同一 AWS 账户和 AWS 区域下。

  1. 打开 Lambda 控制台,选择创建 Lambda 函数

  2. Blueprints 部分中,选择 Author from scratch

  3. Basic information (基本信息) 部分,配置您的 Lambda 函数:

    1. 对于 Function name (函数名称),输入 HelloFunction

    2. 对于 Runtime (运行时),选择 Node.js 12.x

    3. 对于 Role (角色),选择 Choose an existing role (选择现有角色)

    4. 对于 Existing role (现有角色),选择您之前创建的 Lambda 角色

      注意

      如果您创建的 IAM 角色未显示在列表中,该角色可能仍需要几分钟才能传播到 Lambda。

    5. 选择 Create function (创建函数)

      创建您的 Lambda 函数后,记下页面右上角的 Amazon 资源名称 (ARN)。例如:

      arn:aws-cn:lambda:us-east-1:123456789012:function:HelloFunction
  4. 将以下 Lambda 函数代码复制到 HelloFunction 页面的 Function code (函数代码) 部分中。

    exports.handler = (event, context, callback) => { callback(null, "Hello, " + event.who + "!"); };

    此代码将使用输入数据的 who 字段组装问候语,该输入数据是由传送到您的函数的 event 对象提供的。以后当您启动新的执行时,您将为此函数添加输入数据。callback 方法将从您的函数返回组装的问候语。

  5. 选择 Save

步骤 3:测试 Lambda 函数

测试您的 Lambda 函数以查看其运行情况。

  1. 对于 Select a test event (选择测试事件),选择配置测试事件。对于事件名称,输入 HelloFunction

  2. 使用以下内容替换示例数据。

    { "who": "AWS Step Functions" }

    "who" 条目对应于您的 Lambda 函数中的 event.who 字段,用于编写问候语。在作为 Step Functions 任务运行该函数时,您将使用同一输入数据。

  3. 选择 Create

  4. HelloFunction 页面上,使用新数据对您的 Lambda 函数进行测试

    测试结果将显示在页面顶部。展开 Details (详细信息) 以查看输出。

步骤 4:创建状态机

使用 Step Functions 控制台创建具有 Map 状态的状态机。添加 Task 状态以及对 Lambda 的引用。根据状态机输入,对于 Map 状态的每次迭代都调用 Lambda 函数。

  1. 打开 Step Functions 控制台,然后选择 Create a state machine (创建状态机)

  2. Define state machine (定义状态机) 页面上,选择 Author with code snippets (使用代码段创作)。对于 Type (类型),选择 Standard (标准)。输入 Name (名称),例如 MapLambda

    注意

    状态机名称、执行名称和活动名称的长度必须是 1–80 个字符,在您的账户和 AWS 区域中必须是唯一的,并且不得包含以下任何内容:

    • 空格

    • 通配符 (? *)

    • 括号字符 (< > { } [ ])

    • 特殊字符 (: ; , \ | ^ ~ $ # % & ` ")

    • 控制字符 (\\u0000 - \\u001f\\u007f - \\u009f)。

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择一个只使用 ASCII 字符的名称。

  3. State machine definition (状态机定义) 窗格中,使用您之前创建的 Lambda 函数的 ARN 添加以下状态机定义,如以下示例所示。

    { "StartAt": "ExampleMapState", "States": { "ExampleMapState": { "Type": "Map", "Iterator": { "StartAt": "CallLambda", "States": { "CallLambda": { "Type": "Task", "Resource": "arn:aws-cn:lambda:us-east-1:123456789012:function:HelloFunction", "End": true } } }, "End": true } } }

    这是使用 Amazon 状态语言的状态机的说明。它定义一个名为 ExampleMapStateMap 状态,其中包括一个调用 Lambda 函数的 Task 状态 (CallLambda)。有关更多信息,请参阅状态机结构

    注意

    您也可以为 Task 状态设置 Retry。作为最佳实践,确保生产代码可以处理 Lambda 服务异常(Lambda.ServiceExceptionLambda.SdkClientException)。有关更多信息,请参阅下列内容:

    选择 Next (下一步)

  4. 创建或输入 IAM 角色:

    • 要为 Step Functions 创建 IAM 角色,请选择为我创建 IAM 角色,然后输入角色的名称

    • 如果您使用您的状态机的正确权限之前已创建 IAM 角色,请选择 Choose an existing IAM role (选择现有 IAM 角色)。从列表中选择一个角色,或者提供该角色的 ARN。

    注意

    如果您删除了 Step Functions 创建的 IAM 角色,Step Functions 在以后无法重新创建它。同样,如果您修改角色(例如,通过在 IAM 策略中从委托人删除 Step Functions),Step Functions 在以后无法还原其原始设置。

  5. 选择 Next (下一步)

步骤 5:启动新的执行

在创建您的状态机后,可以开始执行。

  1. LambdaStateMachine 页面上,选择 Start execution (开始执行)

    此时将显示 New execution 页面。

  2. (可选)为帮助您标识执行,您可以在 Enter an execution name (输入执行名称) 框中为执行指定一个 ID。如果未输入 ID,Step Functions 将自动生成一个唯一 ID。

    注意

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于 Amazon CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择一个只使用 ASCII 字符的名称。

  3. 在执行输入区域中,将示例数据替换为以下内容。

    [ { "who": "bob" }, { "who": "meg" }, { "who": "joe" } ]

    您的 Map 状态将为输入中的每个项目迭代并运行 CallLambda 任务状态。"who" 是您的 Lambda 函数用来获取要问候的人的名字的键名。

  4. 选择 Start Execution (开始执行)

    此时将启动新的状态机执行,并显示一个说明正在运行的执行的新页面。

  5. 要查看执行结果,请展开 Output (输出) 部分的 Execution details (执行详细信息)

    [ "Hello, bob!", "Hello, meg!", "Hello, joe!" ]

    每个 Lambda 函数执行的输出都组合到状态机的输出中。

有关使用 Map 状态的更多信息,请参阅以下内容: