Поддерживает ли boto3 v1.9.244 создание ресурса 's3'? - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь получить список файлов из S3 с определенным префиксом, используя AWS Lambda. Я связываю Lambda с boto3-1.9.244 (последняя версия). Когда я запускаю Lambda, я получаю SyntaxError для назначения ресурса S3, хотя это может иметь какое-то отношение к сеансу Boto3.

Я использую Python 3.6, а AWS Lambda использует boto3-1.9.221 и botocore-1.12.221. Когда я запускаю код без комплектации последней версии boto3, он работает. Мое текущее решение состоит в том, чтобы просто связать boto3-1.9.221 с лямбда-кодом, а не с последней версией 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

Ответы [ 3 ]

0 голосов
/ 09 октября 2019

Похоже, у вашей лямбда-функции нет роли IAM для S3. Вы можете указать ключ доступа и секретный ключ для ресурса напрямую,

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
)

или предоставить право доступа к лямбда-функции.

0 голосов
/ 10 октября 2019

Оказывается, проблема заключалась в том, что я устанавливал требования с Python2, а не с Python3. Устанавливая требования с Python3, я больше не получал синтаксическую ошибку.

0 голосов
/ 08 октября 2019

Да, он поддерживает. Таким образом, эта проблема не связана с версией API.

Вы можете получить доступ к определенной версии API, просто заменив latest на номер версии, который вы хотите указать в URL.

Последний

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

...