我想使用Lambda函数将文件从S3存储桶下载到Windows PC上的本地目录。
我已经尝试过将此代码命名为“ 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 PC运行以下命令时:
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 ...
为了复制文件,尽管我需要添加更多的逻辑,并且使用Lambda进行操作会更加方便。
答案 0 :(得分:3)
本地计算机上未运行Lambda函数。当您运行aws lambda invoke
时,您将触发AWS在某处的AWS服务器上运行Lambda函数的实例。 lambda函数将无法访问您的本地计算机。
如果要在本地计算机上运行一些Python代码以从S3下载文件,则需要将其作为常规Python脚本而不是Lambda函数编写。