AWS загрузка файла из корзины S3 в Windows локальный каталог с использованием Lambda - PullRequest
0 голосов
/ 07 марта 2020

Я хочу загрузить файл из корзины S3 в локальный каталог на моем Windows P C, используя функцию Lambda.

Я пробовал этот код с именем "myLambdaFunction":

import boto3
import os

def lambda_handler(event, context):   
    ACCESS_KEY = 'AAA...'
    SECRET_KEY = 'BBB...'

path = os.path.join("C:", "Users", "username", "Downloads")
if not os.path.exists(path):
    os.makedirs(path)
s3 = boto3.client('s3', aws_access_key_id=ACCESS_KEY , aws_secret_access_key=SECRET_KEY)
s3.download_file('bucketName','1.mat',path)

# TODO implement
return {
    'statusCode': 200,
    'body': json.dumps('Hello from Lambda!')
}

Когда я запускаю следующую команду из Windows P C:

aws lambda invoke --function-name myLambdaFunction response.json

Я получаю следующее сообщение об ошибке:

{"errorMessage": "[Errno 30] Read-only file system: 'C:'", "errorType": "OSError", "stackTrace": ["  File \"/var/task/lambda_function.py\", line 37, in lambda_handler\n    os.makedirs(path)\n", "  File \"/var/lang/lib/python3.8/os.py\", line 211, in makedirs\n    makedirs(head, exist_ok=exist_ok)\n", "  File \"/var/lang/lib/python3.8/os.py\", line 211, in makedirs\n    makedirs(head, exist_ok=exist_ok)\n", "  File \"/var/lang/lib/python3.8/os.py\", line 211, in makedirs\n    makedirs(head, exist_ok=exist_ok)\n", "  File \"/var/lang/lib/python3.8/os.py\", line 221, in makedirs\n    mkdir(name, mode)\n"]}

И когда я удаляю из кода проверки пути я получаю следующую ошибку:

{"errorMessage": "[Errno 2] No such file or directory: 'C:/Users/username/Downloads.dce48B09'", "errorType": "FileNotFoundError", "stackTrace": ["  File \"/var/task/lambda_function.py\", line 39, in lambda_handler\n    s3.download_file('bucketName','1.mat',path)\n", "  File \"/var/runtime/boto3/s3/inject.py\", line 170, in download_file\n    return transfer.download_file(\n", "  File \"/var/runtime/boto3/s3/transfer.py\", line 307, in download_file\n    future.result()\n", "  File \"/var/runtime/s3transfer/futures.py\", line 106, in result\n    return self._coordinator.result()\n", "  File \"/var/runtime/s3transfer/futures.py\", line 265, in result\n    raise self._exception\n", "  File \"/var/runtime/s3transfer/tasks.py\", line 126, in __call__\n    return self._execute_main(kwargs)\n", "  File \"/var/runtime/s3transfer/tasks.py\", line 150, in _execute_main\n    return_value = self._main(**kwargs)\n", "  File \"/var/runtime/s3transfer/download.py\", line 573, in _main\n    fileobj.seek(offset)\n", "  File \"/var/runtime/s3transfer/utils.py\", line 361, in seek\n    self._open_if_needed()\n", "  File \"/var/runtime/s3transfer/utils.py\", line 344, in _open_if_needed\n    self._fileobj = self._open_function(self._filename, self._mode)\n", "  File \"/var/runtime/s3transfer/utils.py\", line 259, in open\n    return open(filename, mode)\n"]}

Каким-то образом путь был соединен с .dce48B09, что я не понимаю, почему.

Я знаю, что могу используйте команду

aws s3 cp ...

для копирования файлов, хотя мне нужно добавить еще логи c, и будет удобнее делать это с помощью Lambda.

1 Ответ

2 голосов
/ 07 марта 2020

Функция Lambda не работает на вашем локальном компьютере. Когда вы запускаете aws lambda invoke, вы запускаете AWS для запуска экземпляра вашей функции Lambda на сервере AWS. У лямбда-функции нет доступа к вашему локальному компьютеру.

Если вы хотите запустить какой-нибудь код Python на своем локальном компьютере для загрузки файла с S3, вам нужно написать его как обычный Python скрипт, а не функцию Lambda.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...