Ошибка получения атрибута для модуля в Lambda, но не на локальной машине - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь получить объект из S3, используя boto3, следующим образом:

s3 = boto3.resource('s3')
    streaming_body = s3.Object(bucket_name=s3bucket,
                               key=documentPath
                               )

    body = {}
    body['filename'] = documentName
    body['file'] = streaming_body.get()['Body'].read()

Это прекрасно работает на моей локальной машине в PyCharm.Однако, когда я загружаю в Lambda и выполняю вызов API, возвращается следующая ошибка:

Traceback (most recent call last):
'File "/var/task/s3getdocument.py", line 73, in lambda_handler
 body['file'] = streaming_body.get()['Body'].read()
 File "/opt/python/lib/python3.7/site-packages/boto3/resources/factory.py", line 520, in do_action
response = action(self, *args, **kwargs)
File "/opt/python/lib/python3.7/site-packages/boto3/resources/action.py", line 83, in __call__
response = getattr(parent.meta.client, operation_name)(**params)
File "/opt/python/lib/python3.7/site-packages/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/opt/python/lib/python3.7/site-packages/botocore/client.py", line 648, in _make_api_call
operation_model, request_dict, request_context)
File "/opt/python/lib/python3.7/site-packages/botocore/client.py", line 667, in _make_request
return self._endpoint.make_request(operation_model, request_dict)
File "/opt/python/lib/python3.7/site-packages/botocore/endpoint.py", line 102, in make_request
return self._send_request(request_dict, operation_model)
File "/opt/python/lib/python3.7/site-packages/botocore/endpoint.py", line 135, in _send_request
request, operation_model, context)
File "/opt/python/lib/python3.7/site-packages/botocore/endpoint.py", line 167, in _get_response
request, operation_model)
File "/opt/python/lib/python3.7/site-packages/botocore/endpoint.py", line 218, in _do_get_response
response_dict, operation_model.output_shape)
File "/opt/python/lib/python3.7/site-packages/botocore/parsers.py", line 242, in parse
parsed = self._do_parse(response, shape)
File "/opt/python/lib/python3.7/site-packages/botocore/parsers.py", line 774, in _do_parse
member_shapes, final_parsed)
File "/opt/python/lib/python3.7/site-packages/botocore/parsers.py", line 833, in _parse_non_payload_attrs
member_shape, headers[header_name])
File "/opt/python/lib/python3.7/site-packages/botocore/parsers.py", line 302, in _parse_shape
return handler(shape, node)
File "/opt/python/lib/python3.7/site-packages/botocore/parsers.py", line 175, in _get_text_content
return func(self, shape, text)
File "/opt/python/lib/python3.7/site-packages/botocore/parsers.py", line 462, in _handle_timestamp
return self._timestamp_parser(text)
File "/opt/python/lib/python3.7/site-packages/botocore/utils.py", line 567, in parse_timestamp
return dateutil.parser.parse(value, tzinfos={'GMT': tzutc()})
File "/opt/python/lib/python3.7/site-packages/dateutil/parser/_parser.py", line 1358, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "/opt/python/lib/python3.7/site-packages/dateutil/parser/_parser.py", line 657, in parse
ret = self._build_tzaware(ret, res, tzinfos)
File "/opt/python/lib/python3.7/site-packages/dateutil/parser/_parser.py", line 1175, in _build_tzaware
aware = self._assign_tzname(aware, res.tzname)
File "/opt/python/lib/python3.7/site-packages/dateutil/parser/_parser.py", line 1238, in _assign_tzname
new_dt = tz.enfold(dt, fold=1)
AttributeError: module 'dateutil.tz' has no attribute 'enfold

Все модули в лямбда-версиях имеют те же версии, что и на моем локальном компьютере.Я использую последнюю версию boto3 и botocore на сегодняшний день (5/30).

Любой совет о том, какая разница может быть причиной этого?

1 Ответ

0 голосов
/ 31 мая 2019

Это прекрасно сработало для меня (для небольшого файла):

import boto3

s3bucket = 'my-bucket'
documentPath='foo.txt'

def lambda_handler(event, context):

    s3 = boto3.resource('s3')
    streaming_body = s3.Object(bucket_name=s3bucket,
                               key=documentPath
                               )

    body = {}
    body['filename'] = documentPath # Changed this
    body['file'] = streaming_body.get()['Body'].read()
    print(body['file'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...