boto3 lambda负载始终返回NULL[python,调用同步]

2024-09-27 02:19:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Lambda触发一个阶跃函数。它在触发step函数方面工作正常,但我还需要lambda返回状态机执行arn(不是状态机arn)。我需要执行arn,因为我将整个流程实现为github操作工作流,所以我需要它来检查状态机的状态(运行/成功/失败/中止)

获取github操作的lambda返回的代码,包装为docker compose服务:

client = boto3.client("lambda", region_name="us-west-1")
lambda_response = client.invoke(
    FunctionName="my-lambda",
    InvocationType="RequestResponse",
    Payload=json.dumps({"detail-type": "gh-action"}),
)
payload = json.loads(lambda_response["Payload"].read()) # tried .decode() too
print("payload:", payload) # payload prints None as a whole, not {"sfn_exe_arn": None}

我的lambda函数的相关部分:

    try:
        client = boto3.client("stepfunctions")
        response = client.start_execution(
            stateMachineArn=STATE_MACHINE_ARN,
            name=run_name,
            input=json.dumps(
                {"runName": run_name, "model_name": MODEL_NAME, "queries": QUERIES}
            ),
        )
        sfn_exe_arn = response["executionArn"]
    except Exception as e:
        raise e
  
    return {"sfn_exe_arn": sfn_exe_arn}
    # this `sfn_exe_arn` can print out with expected value in console
    # but it does not return when called in github action

当我从控制台调用这个lambda时,大部分时间它都会按预期返回,即{"sfn_exe_arn": sfn_exe_arn},但有时它也会返回null

当我作为github操作工作流的一部分调用这个lambda时,返回的总是null(返回的是lambda_response,只有payload部分总是null

有人能帮我理解为什么会有这样的差距吗?显然,我的lambda得到了死刑,但它没有返回到client.invoke()

整个lambda_response(在屏幕截图中命名为response): enter image description here


Tags: lambda函数namegithubclientjsonresponseboto3
2条回答

糟糕的是,我没有彻底尝试其他帖子的答案。感谢@jarmod在评论中指出了解决方案:在读取变量之前,需要将StreamingBody赋值给变量。链接:Lambda Return Payload botocore.response.StreamingBody object prints but then empty in variable

您必须解码从StreamingBody.read()获得的ByTestStream

.decode()添加到从读取响应负载获得的bytes对象中

payload = json.loads(lambda_response["Payload"].read().decode())

相关问题 更多 >

    热门问题