【发布时间】:2018-01-16 16:55:23
【问题描述】:
我完全不喜欢使用 AWS。我试图让一个非常简单和基本的操作工作。我想要做的是,在将文件上传到一个 s3 存储桶后,我希望该上传触发一个 Lambda 函数,该函数将该文件复制到另一个存储桶。
我进入 AWS 管理控制台,在 us-west2 服务器上创建了一个名为“test-bucket-3x1”的 s3 存储桶作为我的“源”存储桶,另一个名为“test-bucket-3x2”的存储桶作为我的“目的地'桶。创建这些存储桶时,我没有更改或修改任何设置。
在 Lambda 控制台中,我为“test-bucket-3x1”创建了一个 s3 触发器,将“事件类型”更改为“ObjectCreatedByPut”,并且没有更改任何其他设置。
这是我实际的 lamda_function 代码:
import boto3
import json
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('test-bucket-3x1')
dest_bucket = s3.Bucket('test-bucket-3x2')
print(bucket)
print(dest_bucket)
for obj in bucket.objects():
dest_key = obj.key
print(dest_key)
s3.Object(dest_bucket.name, dest_key).copy_from(CopySource = {'Bucket': obj.bucket_name, 'Key': obj.key})
当我使用 AWS Lambda 控制台提供的基本“HelloWorld”测试来测试这个函数时,我收到了这个”
{
"errorMessage": "'s3.Bucket.objectsCollectionManager' object is not callable",
"errorType": "TypeError",
"stackTrace": [
[
"/var/task/lambda_function.py",
12,
"lambda_handler",
"for obj in bucket.objects():"
]
]
}
我需要对我的代码进行哪些更改,以便在将文件上传到 test-bucket-3x1 时触发 lambda 函数并将文件复制到 test-bucket-3x2?
感谢您的宝贵时间。
【问题讨论】:
-
您不应该使用
for obj in bucket.objects.all()而不是for obj in bucket.objects()。参考这个链接:boto3.readthedocs.io/en/latest/reference/services/… -
"object is not callable" - 你正在尝试迭代它。我认为您可能希望使用
bucket.objects.all()创建一个可迭代的 -
感谢您的帮助。这似乎很愚蠢,但这对我来说真的很有用。我可以查看 cloudwatch 日志并开始了解
event和context对象实际上是什么。在相关说明中,是否可以通过 lambda 打开/使用 s3 存储桶中的文件?例如,我可以将 csv 加载到 pandas 数据框中,操作数据框,返回操作后的数据框,然后将其上传到我的目标存储桶吗?会不会像在事件处理程序中放置df = pd.read_excel(['Records']['bucket']['object']['key'])之类的东西那么简单? -
请注意,如果您真正将所有新对象从一个存储桶复制到另一个存储桶,AWS 中有一个 S3 存储桶复制功能。
标签: python amazon-web-services amazon-s3 aws-lambda