View a markdown version of this page

自定义操作 Lambda 执行块 - Amazon 应用程序恢复控制器(ARC)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

自定义操作 Lambda 执行块

自定义操作 Lambda 执行块允许您使用 Lambda 函数向计划添加自定义步骤。

配置

要配置 Lambda 执行块,请输入以下值。

重要

在配置执行块之前,请确保计划的执行角色具有正确的 IAM 策略。有关更多信息,请参阅 自定义操作 Lambda 执行块示例策略。

  1. 步骤名称:输入名称。

  2. 步骤描述(可选):输入步骤的描述。

  3. 要@@ 在主区域和次要区域调用的 Lambda 函数的 ARN:指定要在此步骤中运行的 Lambda 函数的 ARN。

  4. 负载(可选):输入有效的 JSON 负载以调用 Lambda 函数。

  5. 运行 Lambda 函数的区域:在下拉菜单中,选择您想要在其中运行 Lambda 函数的区域。

  6. 超时:输入超时值。

  7. 重试间隔:输入重试间隔,如果在此间隔内没有成功,则重新运行 Lambda 函数。

  8. 不雅执行(可选):选择是否在非优雅(计划外)执行期间跳过此执行块。如果您不选择跳过该阻止,则区域切换将在不雅的执行期间调用 Lambda 函数。

然后,选择保存步骤。

工作原理

当计划执行达到此步骤时,区域切换将调用指定的 Lambda 函数。调用详情(调用的 Lambda 的 ARN 和有效负载)可在与该步骤对应的执行事件日志中找到。调用后,区域切换会轮询 Lambda 以返回成功响应,直到达到步骤超时为止。如果 Lambda 在配置的超时时间内遇到错误,则该步骤将失败,执行将暂停,等待您重试、跳过或取消。

当您的负载是 JSON 对象时(或者未配置任何负载时),区域切换会添加以下执行元数据密钥:

  • InvokedBy—始终设置为。RegionSwitch

  • PlanArn— 计划的 ARN。

  • ExecutionId— 执行标识符,形式为region/execution-id。

  • StepName— 步骤的名称。

此块支持优雅和非优雅的执行模式。在非正常执行期间,只有当您将不雅行为配置为跳过时,区域切换才会跳过该步骤。如果您未配置不当行为,则区域切换将使用与优雅执行相同的配置来调用 Lambda 函数。

当您为 Lambda 执行块配置负载时,区域切换会按如下方式处理执行元数据注入:

  • JSON 对象有效负载:区域切换会将其执行元数据密钥(例如PlanArnExecutionId、和StepName)合并到 JSON 对象的顶层。如果您的负载包含与元数据键同名的密钥,则您的值优先,并且会省略冲突的元数据密钥。请注意,密钥匹配区分大小写,例如,密钥与元数据密钥planArn不冲突。PlanArn

  • Non-JSON-object payloads:如果您的负载是 JSON 字符串、数字、布尔值或数组,则 Region switch 会将您的负载转发到 Lambda 函数不变,并且不会注入执行元数据。

要在您的 Lambda 函数中接收区域切换执行元数据,请确保您的负载是 JSON 对象。如果您的负载是任何其他类型,则不会包含元数据。此外,如果要保留区域切换注入的元数据值,请避免使用与元数据键匹配的密钥名称。

停用区域依赖关系

创建自定义操作 Lambda 执行块时,必须指定两个 Lambda 函数,分别位于计划的每个区域。您可以配置在执行期间在哪个区域调用 Lambda:激活区域或停用区域。如果您将 Lambda 配置为在停用区域中执行,请注意,您依赖的是该区域的可用性,而该可用性在故障转移期间可能不可用。考虑为该区块启用非优雅模式,以便在停用区域不可用时可以选择跳过此步骤。

示例:带有按键碰撞且接近匹配的有效载荷

假设您在配置执行块时输入了以下有效负载。请注意,StepName与元数据密钥完全匹配(区分大小写冲突),但planArn不匹配,PlanArn因为大小写不同:

{ "action": "enable-maintenance-page", "environment": "production", "StepName": "my-custom-step-label", "planArn": "arn:aws:my-custom:value" }

当区域切换调用 Lambda 函数时,它会将执行元数据合并到您的对象中。因为StepName会发生碰撞,所以你的值获胜,元数据StepName被省略。由于大小写planArn不同PlanArn,因此两个密钥都存在于最终有效载荷中:

{ "action": "enable-maintenance-page", "environment": "production", "StepName": "my-custom-step-label", "planArn": "arn:aws:my-custom:value", "InvokedBy": "RegionSwitch", "PlanArn": "arn:aws:arc-region-switch:us-east-1:123456789012:plan/my-recovery-plan", "ExecutionId": "us-west-2/abc123-def456" }

示例:未配置有效负载

如果您未配置有效负载,则区域切换仅发送执行元数据密钥:

{ "InvokedBy": "RegionSwitch", "PlanArn": "arn:aws:arc-region-switch:us-east-1:123456789012:plan/my-recovery-plan", "ExecutionId": "us-west-2/abc123-def456", "StepName": "Display maintenance page" }

示例: Non-JSON-object 有效载荷

如果您的负载不是 JSON 对象,则区域切换会将其转发到 Lambda 函数,且不会注入执行元数据。例如,如果您输入以下字符串有效负载:

"enable-maintenance-page"

Lambda 函数正好接收该字符串,不添加任何元数据密钥。