使用AWS Lambda(Python)编写CSV文件并将其保存到S3

13

我正在尝试使用AWS Lambda将CSV文件写入S3存储桶,为此我使用了以下代码:

data=[[1,2,3],[23,56,98]]
with open("s3://my_bucket/my_file.csv", "w") as f:
   f.write(data)

这会导致以下错误:

[Errno 2] No such file or directory: u's3://my_bucket/my_file.csv': IOError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 51, in lambda_handler
with open("s3://my_bucket/my_file.csv", "w") as f:
IOError: [Errno 2] No such file or directory: u's3://my_bucket/my_file.csv'

请问我能够得到一些帮助吗?

另外,我的编程语言是Python 2.7

提前感谢您的帮助。


2
Lambda不支持s3:// URI的本地设备驱动程序。将CSV文件写入本地文件系统(/tmp),然后使用boto3的put_object()方法。如果需要,也可以使用boto3将文件内容流式传输到S3。 - jarmod
@jarmod,您能否给我一个例子,非常感谢。 - kab
1
请参见以下链接:https://dev59.com/RVkS5IYBdhLWcg3wHTRy - jarmod
3个回答

14

迟答总比不答好。获取S3中的数据有四个步骤:

  • 调用S3存储桶
  • 使用requests库将数据加载到Lambda中(如果您没有安装它,则需要将其作为层加载)
  • 将数据写入Lambda的'/tmp'文件
  • 将文件上传到S3

类似于这样:

import csv
import requests
#all other apropriate libs already be loaded in lambda

#properly call your s3 bucket
s3 = boto3.resource('s3')
bucket = s3.Bucket('your-bucket-name')
key = 'yourfilename.txt'

#you would need to grab the file from somewhere. Use this incomplete line below to get started:
with requests.Session() as s:
    getfile = s.get('yourfilelocation')

#Only then you can write the data into the '/tmp' folder.
with open('/tmp/yourfilename.txt', 'w', newline='') as f:
    w = csv.writer(f)
    w.writerows(filelist)
#upload the data into s3
bucket.upload_file('/tmp/yourfilename.txt', key)

希望能帮到您。


1
对于同时调用 Lambda 的情况 - 不会使用相同的 '/tmp/yourfilename.txt' 创建冲突吗? - Alex_Y
1
当然可以,但一个选项是将此 Lambda 限制为一次只能执行一次。 - Mr Chow

-3

我不熟悉使用 AWS Lambda,但我一直在使用 Boto3 来完成相同的操作。

这是一个简单的几行代码。

#Your file path will be something like this:
#s3://<your_s3_bucket_name>/<Directory_name>/<File_name>.csv

import boto3

BUCKET_NAME = '<your_s3_bucket_name>'
PREFIX = '<Directory_name>/'
s3 = boto3.resource('s3')
obj = s3.Object(BUCKET_NAME, PREFIX + '<File_name>.csv')
obj.put(Body=content)

-5
with open("s3://my_bucket/my_file.csv", "w+") as f:

而不是

with open("s3://my_bucket/my_file.csv", "w") as f:

注意"w"已经改为"w+",这意味着它将写入文件,如果文件不存在,则会创建它。

好的,s3://my_bucket/ 目录实际上存在吗? - Ryan
是的,但文件不存在。 - kab
s3://my_bucket/ 这个“目录”在本地不存在... 它在 S3 上。而且它甚至不是一个目录,它是一个 S3 存储桶。它不能像本地文件一样访问,你必须使用 boto3。 - Mark B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接