获取步进函数执行结果

问题描述

我是 AWS 的新手,正在为阶梯函数苦苦挣扎。

我的工作流程是这样的:

client('search_word')-> api gateway -> lambda 函数调用 step 函数)-> step 函数生成搜索输出)-> client

这是我的调用 lambda 函数

import json
import boto3
import uuid

client = boto3.client('stepfunctions')


def lambda_handler(event,context):
    transactionId = str(uuid.uuid1())
    print(transactionId) 
    
    input = {'TransactionId':transactionId,'text':'search_word'} 
    
    response = client.start_execution(
        stateMachineArn='arn:aws:states:ap-northeast-2:xxxxxxxxxx:stateMachine:MyStateMachine',name=transactionId,input=json.dumps(input)
        )
        
    print(response) 
    return {
        'statusCode': 200,'body': json.dumps('Hello from Lambda!')
    }

我想从 step 函数获取执行结果并将其传递给客户端。但我不知道该怎么做。

工作流程不一定是我建议的,只要我能把step function的执行结果给客户端就行了。

这是我的步进函数

{ 
  "Comment": "A simple AWS Step Functions state machine.","StartAt": "Tokenize","States": {  
    "Tokenize": { 
      "Type": "Task","Resource": "arn:aws:lambda:ap-northeast-2:xxxxxxxx:function:search_ko","Next": "Search"
    },"Search": { 
      "Type": "Task","Resource": "arn:aws:lambda:ap-northeast-2:xxxxxxx:function:BM-25-Get-Index","End": true 
    } 
  }
}

请帮忙。

提前致谢!

解决方法

您正在尝试将同步的 api 网关与异步的步骤函数结合起来。如果您使用步进函数,您的流程应该是异步的。您不会通过单个 API 调用获得响应。您将需要创建另一个 API,该 API 将继续“轮询” step 函数以查看它是否已成功执行以及响应是什么。

这是您可以尝试的流程。

  1. 用于初始化 step 函数的 API 调用。您可以尝试将 API 网关 post 调用与您的 step 函数直接连接,看看它是否返回执行 arn 作为响应。如果是这样,您将不需要 lambda。如果没有,则坚持使用当前的 lambda 并使其返回执行 arn。
  2. 您的应用然后获取执行 arn 并使用它定期调用另一个 API。如果您认为完成单步函数执行所需的时间少于 30 秒(API 网关超时限制),您可以定期调用 API 或让后端的 lambda 继续轮询以获取响应。
  3. 您的第二个 API/Lambda 然后使用 DescribeExecution 查找执行结果,并返回响应。

编辑: 如果您认为您的 step 函数将在 30 秒内始终如一地执行,您可以尝试使用单个 lambda 来启动 step 函数,然后使用 DescribeExecution 继续轮询它以完成。