通过步进函数将输入(参数)传递并使用到lambda任务

时间:2019-01-25 02:43:05

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

我有一个简单的步骤函数来启动lambda,我正在寻找一种将参数(事件/上下文)传递给多个后续任务中的每个任务的方法。我的步进函数如下所示:

{
  "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Parameters": {
        "TableName": "table_example"
      },
      "Resource": "arn:aws:lambda:ap-southeast-2:XXXXXXX:function:fields_sync",
      "End": true
    }
  }
}

在用Python编写的lambda中,我使用的是一个简单的处理程序:

def lambda_handler(event, context):
    #...

事件和上下文如下所示(检查日志):

  

START RequestId:f58140b8-9f04-47d7-9285-510b0357b4c2版本:$ LATEST

我找不到将参数传递给此lambda并在脚本中使用它们的方法。本质上,我想做的是运行同一lambda并传递几个不同的值作为参数。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:3)

根据您所说的内容:“寻找一种传递参数的方法 (事件/上下文)到几个后续任务中的每个任务” 您想将非静态值传递给lambda。

两种方式通过状态机传递参数。通过InputPathParameters。如有差异,请查看here

如果您没有要传递给lambda的任何静态值,我将执行以下操作。将所有参数以json格式传递给step函数。

为状态机输入JSON

{
    "foo": 123,
    "bar": ["a", "b", "c"],
    "car": {
        "cdr": true
    }
    "TableName": "table_example"
}

在步骤函数中,您将使用"InputPath": "$"将整个JSON显式传递给lambda,除了第一步是隐式传递。有关$路径语法的更多信息,请查看here。您还需要处理任务结果,其中multiple approaches之一使用ResultPath。在大多数情况下,最安全的解决方案是将任务结果保留在特殊变量"ResultPath": "$.taskresult"

{
  "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:ap-southeast-2:XXXXXXX:function:fields_sync",
      "Next": "HelloWorld2"
    },
    "HelloWorld2": {
      "Type": "Task",
      "InputPath": "$",
      "ResultPath": "$.taskresult"
      "Resource": "arn:aws:lambda:ap-southeast-2:XXXXXXX:function:fields_sync_2",
      "End": true
    }
  }
}

在lambda中成为事件变量,可以作为python字典访问

def lambda_handler(event, context):
    table_example = event["TableName"]
    a = event["bar"][0]
    cdr_value = event["car"]["cdr"]
    # taskresult will not exist as event key 
    # only on lambda triggered by first state
    # in the rest of subsequent states
    # it will hold a task result of last executed state
    taskresult = event["taskresult"]

通过这种方法,您可以使用多个步骤函数和不同的lambda,并通过移动lambda中的所有逻辑来使它们保持清洁小。 另外,由于所有事件变量在所有lambda中都是相同的,因此调试起来也更容易,因此,通过简单的print(event),您可以查看整个状态机所需的所有参数以及可能出了问题的地方。

答案 1 :(得分:0)

我碰到了这一点,很明显,当Resource设置为lambda ARN(例如"arn:aws:lambda:ap-southeast-2:XXXXXXX:function:fields_sync")时,您不能使用Parameters来指定输入,而是使用状态传递了step函数(可能是状态函数的输入,如果之前没有任何步长)。

要通过“参数”传递函数输入,可以执行以下操作:

将资源指定为"arn:aws:states:::lambda:invoke",并在“参数”部分中提供您的FunctionName

{
    "StartAt": "HelloWorld",
    "States": {
        "HelloWorld": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
                "FunctionName": "YOUR_FUNCTION_NAME",
                "Payload": {
                    "SOMEPAYLOAD": "YOUR PAYLOAD"
                }
            },
            "End": true
        }
    }
}

您还可以潜在地使用inputPath,或也可以使用步骤函数状态函数https://docs.aws.amazon.com/step-functions/latest/dg/input-output-inputpath-params.html

中的元素