0

我是 AWS 的新手,正在努力使用步进功能。

我的工作流程是这样的:

客户端('search_word')-> api 网关 -> lambda 函数(调用步进函数)-> 步进函数(生成搜索输出)-> 客户端

这是我的调用 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 函数的执行结果提供给客户端即可。

这是我的步骤功能。

{ 
  "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 
    } 
  }
}

请帮忙。

提前致谢!

4

1 回答 1

-1

您正在尝试将同步的 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查找执行结果,并返回响应。

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

于 2021-05-24T14:24:38.330 回答