【问题标题】:boto3 resource requires more parameters when running on localstack vs when on AWS Lambda在 localstack 上运行时与在 AWS Lambda 上运行时相比,boto3 资源需要更多参数
【发布时间】:2019-07-16 23:38:01
【问题描述】:

问题

我在 AWS 上部署的 Lambda 之前只使用了服务名称的 boto3 客户端/资源,但是在 Localstack 中部署的 Lambda 仅在 region_nameaws_access_key_idaws_secret_key_idendpoint_url 时工作。

如何消除对这个的需求?

我的尝试

我尝试在没有额外参数的情况下在 Localstack 中部署 Lambda,但出现以下错误:

Exception: ('Unable to get handler function from lambda code.', NoRegionError('You must specify a region.',))

botocore.exceptions.ClientError: An error occurred (UnrecognizedClientException) when calling the Scan operation: The security token included in the request is invalid.

我想要什么

理想情况(就像我目前在 AWS 上的 Lambda 一样):

dynamodb = boto3.client('dynamodb')

当前的解决方法(部署到 Localstack 时):

dynamodb = boto3.client('dynamodb', region_name='eu-west-2', 
                        aws_access_key_id="", aws_secret_access_key="",
                        endpoint_url='http://localhost:4569')

【问题讨论】:

    标签: python-3.x amazon-web-services aws-lambda boto3 localstack


    【解决方案1】:

    不,你不能阻止在 localstack 中使用它们。

    总是需要区域、aws_access_key_id、端点等——它似乎不在 Lambda 控制台上,因为当您在 Lambda 上运行时,Lambda 环境注入了许多默认值,所以即使您没有不提供这些变量,它仍然有效。

    但是,如果您不想在代码中指定这些值,您仍然可以在运行 localstack 时在环境变量中指定它们:

    https://github.com/localstack/localstack#configurations

    您需要传入以下环境变量:

    SERVICES=lambda:4569
    DEFAULT_REGION=eu-west-2
    

    要放入与 IAM 访问密钥相关的环境变量,请使用这个不错的 lil 实用程序:https://github.com/jaymecd/aws-profile/blob/master/aws-profile

    通过所有这些努力(不是很多,但仍然是一些),您可以“消除在代码中指定这些内容的需要”——但是,您仍然只是将它们移动到环境变量中。

    一个好处是,这样本地看起来与您的生产中的代码更加一致。

    【讨论】:

    • 多哈。我应该考虑环境变量!非常感谢,这很有意义。我只是假设 Localstack 将模拟与 Lambda 环境相同的值注入。
    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 2016-03-04
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2020-12-11
    相关资源
    最近更新 更多