【问题标题】:Does boto3 v1.9.244 support creating an 's3' resource?boto3 v1.9.244 是否支持创建“s3”资源?
【发布时间】:2020-02-06 02:49:47
【问题描述】:

我正在尝试使用 AWS Lambda 从 S3 检索具有特定前缀的文件列表。我将 Lambda 与boto3-1.9.244(最新版本)捆绑在一起。当我运行 Lambda 时,我收到一个关于 S3 资源分配的SyntaxError,尽管它可能与 Boto3 会话有关。

我使用的是Python 3.6,AWS Lambda 使用的是boto3-1.9.221botocore-1.12.221。当我在不捆绑最新版本的 boto3 的情况下运行代码时,它可以工作。我目前的解决方案是简单地将 boto3-1.9.221 与 lambda 代码而不是最新版本的 boto3 捆绑在一起。

import boto3

s3 = boto3.resource('s3')

我希望它创建一个 s3 资源,但我收到此错误:

invalid syntax (_base.py, line 414): SyntaxError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 20, in lambda_handler
    s3 = boto3.resource('s3')
  File "/var/task/boto3/__init__.py", line 100, in resource
    return _get_default_session().resource(*args, **kwargs)
  File "/var/task/boto3/session.py", line 389, in resource
    aws_session_token=aws_session_token, config=config)
  File "/var/task/boto3/session.py", line 263, in client
    aws_session_token=aws_session_token, config=config)
  File "/var/task/botocore/session.py", line 839, in create_client
    client_config=config, api_version=api_version)
  File "/var/task/botocore/client.py", line 80, in create_client
    cls = self._create_client_class(service_name, service_model)
  File "/var/task/botocore/client.py", line 110, in _create_client_class
    base_classes=bases)
  File "/var/task/botocore/hooks.py", line 356, in emit
    return self._emitter.emit(aliased_event_name, **kwargs)
  File "/var/task/botocore/hooks.py", line 228, in emit
    return self._emit(event_name, kwargs)
  File "/var/task/botocore/hooks.py", line 211, in _emit
    response = handler(**kwargs)
  File "/var/task/boto3/utils.py", line 61, in _handler
    module = import_module(module)
  File "/var/task/boto3/utils.py", line 52, in import_module
    __import__(name)
  File "/var/task/boto3/s3/inject.py", line 15, in <module>
    from boto3.s3.transfer import create_transfer_manager
  File "/var/task/boto3/s3/transfer.py", line 127, in <module>
    from s3transfer.exceptions import RetriesExceededError as \
  File "/var/task/s3transfer/__init__.py", line 134, in <module>
    import concurrent.futures
  File "/var/task/concurrent/futures/__init__.py", line 8, in <module>
    from concurrent.futures._base import (FIRST_COMPLETED,
  File "/var/task/concurrent/futures/_base.py", line 414
    raise exception_type, self._exception, self._traceback
                        ^
SyntaxError: invalid syntax

【问题讨论】:

标签: amazon-web-services amazon-s3 aws-lambda python-3.6 boto3


【解决方案1】:

是的,它确实支持。所以这个问题与API版本无关。

您只需将 latest 替换为 URL 中所需的版本号即可访问特定的 API 版本。

最新

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#bucket

1.9.244

https://boto3.amazonaws.com/v1/documentation/api/1.9.244/reference/services/s3.html#bucket

【讨论】:

    【解决方案2】:

    原来问题是我使用 Python2 而不是 Python3 安装需求。通过使用 Python3 安装需求,我不再收到语法错误。

    【讨论】:

    • 顺便说一句,你为什么要打包boto3?它是默认包,已经安装在 lambda 上。
    【解决方案3】:

    您的 lambda 函数似乎没有 S3 的 IAM 角色。您可以直接指定资源的访问密钥和秘密密钥,

    resource = boto3.resource(
        's3',
        # Hard coded strings as credentials, not recommended.
        aws_access_key_id='AKIAIO5FODNN7E******', # not real
        aws_secret_access_key='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYE******' # not real
    )
    

    或者必须授予 lambda 函数正确的权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多