【问题标题】:AWS Step function process output from lambda来自 lambda 的 AWS Step 函数处理输出
【发布时间】:2022-04-19 20:53:24
【问题描述】:

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

那么阶跃函数如何处理来自 lambda 的响应?可以举个例子吗?

【问题讨论】:

    标签: amazon-web-services aws-step-functions


    【解决方案1】:

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

    此解决方法非常简单,您可以在 lambda 响应中返回一个属性(例如:next_state),在 step 函数中创建一个“Choice”流,然后将此 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
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      有两种方法可以从阶跃函数中捕获 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

      【讨论】:

        猜你喜欢
        • 2021-10-03
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-05
        • 2022-01-26
        • 2017-10-23
        • 2019-01-27
        相关资源
        最近更新 更多