AWS Step 函数处理来自 lambda 的输出

AWS Step function process output from lambda

我有一个 AWS step 函数需要依次调用 3 个 lambda,但是在每次调用结束时,step 函数需要处理一个 lambda 的响应,并确定下一个 lambda 调用。

那么 step 函数如何处理来自 lambda 的响应?你能举个例子吗?

从step函数中捕获lambda函数的响应有两种方式。

  1. 使用 add_retryadd_catch 来处理来自 lambda 函数的任何异常 例如
            .start(record_ip_task
                   .add_retry(errors=["States.TaskFailed"],
                              interval=core.Duration.seconds(2),
                              max_attempts=2)
                   .add_catch(errors=["States.ALL"], handler=notify_failure_job)) \
  1. 来自 lambda 函数的响应值,例如 return '{"Result": True} 然后步进函数作业将为下一个任务检查该值,例如
                            .next(
                                is_block_succeed
                                    .when(step_fn.Condition.boolean_equals('$.Result', False), notify_failure_job)
                                    .otherwise(send_slack_task)
                            )

参考:https://dev.to/vumdao/aws-guardduty-combine-with-security-hub-and-slack-17eh https://github.com/vumdao/aws-guardduty-to-slack

假设您调用了 lambda 函数作为 step 函数的第一步。根据 lambda 的响应,您需要决定接下来应该触发哪个 lambda。

这个变通方法非常简单,您可以 return lambda 响应中的一个属性(例如:next_state),在步骤函数中创建一个“选择”流,然后给这个 next_state 属性作为输入。

“选择”流程只不过是一个 if-else 条件,您可以将下一步重定向到预期的 lambda。

例如,

定义如下所示,

{
  "Comment": "A description of my state machine",
  "StartAt": "Lambda Invoke 1",
  "States": {
    "Lambda Invoke 1": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "Payload.$": "$",
        "FunctionName": "<your lambda name>"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "Choice"
    },
    "Choice": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.next_state",
          "StringEquals": "Lambda Invoke 2",
          "Next": "Lambda Invoke 2"
        },
        {
          "Variable": "$.next_state",
          "StringEquals": "Lambda Invoke 3",
          "Next": "Lambda Invoke 3"
        }
      ],
      "Default": "Lambda Invoke 3"
    },
    "Lambda Invoke 2": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "Payload.$": "$",
        "FunctionName": "<your lambda name>"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "End": true
    },
    "Lambda Invoke 3": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "OutputPath": "$.Payload",
      "Parameters": {
        "Payload.$": "$",
        "FunctionName": "<your lambda name>"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "End": true
    }
  }
}