如何使用AWS Lambda(Python)调用步骤函数

时间:2019-06-13 05:13:20

标签: amazon-web-services aws-lambda aws-api-gateway aws-step-functions

我正在尝试创建一个包含两个lambda函数的简单步进函数。第一个lambda函数将两个数字作为用户输入(例如num1 = 2,num2 = 5),并将这两个数字的和传递给第二个lambda函数。第二个lambda函数将第一个lambda函数的输出乘以一个常数(例如10)。

我希望能够获得最终答案(在这种情况下为(2 + 5)* 10 = 70)作为API调用的输出。

我能够成功执行Step Function(从AWS Step Function Console)。但是,调用API(与Step Function集成)时得到的输出不是数字,而是:

{
    "executionArn": "arn:aws:states:ap-south-1:123456789012:execution:Test_Math:xxx",
    "startDate": 1560344276.117
}

如何获取API调用以返回答案(在这种情况下为70)?

我已经仔细阅读过AWS文档和AWS API Gateway with Step Function这个问题,但是我仍然不清楚。

  1. 如何创建一个新的lambda函数(或使用上述两个函数中的任何一个)来调用/执行此step函数以返回答案?
  2. 还有其他方法可以通过API调用返回步进函数的答案吗?

我的问题与这个Api gateway get output results from step function?有点类似。 我尝试在API网关中添加第二个方法,该方法将通过DescribeExecution操作调用Step Function,但此方法无效。

具有StartExecution操作的POST方法的映射模板(application / json)如下:

#set($inputRoot = $input.path('$')) 

#set($data = $util.escapeJavaScript($input.json('$')))

{
  "input": "{ \"num1\": $inputRoot.num1, \"num2\": $inputRoot.num2 }",

  "stateMachineArn": "arn:aws:states:ap-south 1:998338******:stateMachine:Test_Math"
}

我使用DescribeExecution操作创建了一个新的GET方法,其中包含以下“集成请求”详细信息:

Integration type: AWS Service
AWS Service: Step Functions
HTTP method: GET
Action: Describe Execution
Content Handling: Passthrough

Mapping template : application/json

#set($inputRoot = $input.path('$'))

#set($data = $util.escapeJavaScript($input.json('$')))

{
   "executionArn": "arn:aws:states:ap-south-1:998338321653:execution:Test_Math:3981114a-da51-411d-9533-8571dc976e2d",

  "input": "{ \"num1\": $inputRoot.num1, \"num2\": $inputRoot.num2 }"
}
  1. 请让我知道我需要对上面的内容进行哪些更改,才能通过API调用返回答案(70)。

P.S:我想使用步进函数来部署机器学习模型,这只是我正在尝试的一个简单测试。

1 个答案:

答案 0 :(得分:3)

您可以使用 describe_execution 方法来获取步进函数的最终结果。您必须将执行信息作为此方法的输入传递。

在这里https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/stepfunctions.html#SFN.Client.describe_execution

查找更多详细信息

在给出执行信息的情况下,以下python代码将打印输出。

import boto3

client = boto3.client('stepfunctions')
executionArn = ''

response = client.describe_execution(
    executionArn=executionArn
)
#print(response)
print(response.get('output'))