【问题标题】:boto3 lambda payload always returns NULL [python, sync invoked]boto3 lambda 有效负载始终返回 NULL [python,同步调用]
【发布时间】:2021-06-17 06:28:31
【问题描述】:

我正在使用 Lambda 来触发阶跃函数。它在触发步进函数方面工作正常,但我还需要 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 得到了 executionArn,但它只是没有返回到 client.invoke()

整个lambda_response(截图中命名为response):

【问题讨论】:

  • 有时返回null,或者返回{"sfn_exe_arn": null}?
  • 它作为一个整体返回null,即使我让lambda返回一个常量字符串,它仍然是null。谢谢你的澄清问题~
  • 我猜它失败了,例如时间到。打印整个lambda_response 对象。
  • 嗨@jarmod,我刚刚在帖子底部添加了整个响应的屏幕截图,它有StatusCode:200。我之前故意尝试失败,这样做时确实会抛出错误.
  • 会不会是 StreamingBody 读取仍然不是反序列化格式?你能试试lambda_response["Payload"].read().decode()。猜猜应该是这样,因为StreamingBody.read() 仍然返回一个bytesobject。

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


【解决方案1】:

您必须解码从 StreamingBody.read() 获得的字节流

.decode() 添加到您通过读取响应有效负载获得的bytes 对象中。

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

【讨论】:

  • 嗨@lwohlart,我真的希望这是答案。我尝试按照你写的方式添加 decode(),但打印出来的内容完全一样,仍然没有,但感谢你提供帮助!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 2016-05-31
    相关资源
    最近更新 更多