【问题标题】:Boto3 Call to Lambda Function Works in Dev but Not in Production?Boto3 调用 Lambda 函数在开发中有效,但在生产中无效?
【发布时间】:2020-04-11 09:54:19
【问题描述】:

我正在尝试使用 Boto3 从 Django Python 应用程序异步启动 AWS Lambda。以下代码在我的本地开发系统上运行良好:

import boto3
from concurrent.futures import ThreadPoolExecutor

[.....]

endpoint_scoring_arn = "arn:aws:lambda:us-east-1:xxx:function:my-lambda-function"
data = {
    'my_data_param': 'my_data',
}

# https://stackoverflow.com/a/39457165/364966
# https://stackoverflow.com/questions/40377662/boto3-client-noregionerror-you-must-specify-a-region-error-only-sometimes
boto3_client = boto3.client('lambda', region_name='us-east-1')
with ThreadPoolExecutor(max_workers=1) as executor:
future_execution = [executor.submit(boto3_client.invoke,
                FunctionName=endpoint_scoring_arn,
                InvocationType="Event",
                Payload=json.dumps(data)
                )]
try:
    print("boto3 exception:")
    print(future_execution[0]._exception.kwargs['report'])
except Exception as e0:
    print("No boto3 exception found")

...但是当我在 EC2 上的生产环境中运行它时,Lambda 函数永远不会运行。我的 Django debug.log 或 syslog 中没有错误消息,上面的代码打印出 "No boto3 exception found"

这可能是什么原因?

【问题讨论】:

  • 我不熟悉 concurrent.futures 库。这是处理潜在异常的典型方法吗?看起来很奇怪。我从您下面的回答中假设您实际上是从 boto3 触发 AccessDenied 异常。您没有在输出中清楚地看到这一点,因此发现问题难以调试,这似乎表明您没有以最佳方式处理异常。
  • 感谢您提供此信息。我根据发布的代码示例中提到的 SO 帖子使用了 concurrent.futures。我也觉得奇怪的是我没有看到 AccessDenied 异常。如果方便,请发布您喜欢的示例代码以供将来参考。

标签: amazon-web-services amazon-ec2 aws-lambda boto3


【解决方案1】:

您错误地处理了由于提供无效或不提供凭据而引发的异常。

您可以更清楚地看到异常如下:

with ThreadPoolExecutor(max_workers=1) as executor:
    future = executor.submit(
        client.invoke,
        FunctionName=lambda_arn,
        InvocationType="Event",
        Payload=json.dumps(data)
    )
    try:
        print("executor boto3 result:", future.result())
    except Exception as exc:
        print("executor exception:", exc.response)
        print("executor exception code:", exc.response['Error']['Code'])

这将打印出来,除其他外:

executor exception code: AccessDeniedException

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多