我正在编写一个lambda函数,其目标是从s3下载.json文件,修改其内容,然后重新上传到不同密钥下的同一个存储桶。如何使用AWS Lambda创建临时文件将'文件'上传到S3?
所以在我的S3,我有一个“云”斗云/文件夹/ foo.json
>>> foo.json
{
"value1": "abc",
"value2": "123"
}
我想下载它,相应地改变一些事情,并重新上传到同一个作为bar.json
我有第一部分类型的工作,因为它下载文件的内容并修改内容,但一切现在是一个Python字典对象。
import boto3
import json
def get_json():
client = boto3.client('s3')
response = client.get_object(Bucket='cloud', Key='folder/foo.json')
data = response['Body'].read()
bar = json.loads(data)
bar["value-1"] = "do-re-mi"
#TODO: implement uploading here
def lambda_handler(event, context):
get_json()
return 'Hello from Lambda'
所以现在......
>>> bar
{
"value1": "do-re-mi",
"value2": "123"
}
酒吧变量是正确的,但它是一个字典对象。我怎么能直接上传到该桶作为bar.json? 我在这里看到了其他例子,但我并不热衷于在任何地方放入我的AWS秘密密钥或访问密钥。我想是因为我使用的λ我不能创建本机上的文件,当我试图做类似如下:
g = open('myfile.json', 'w')
g.write(json.dumps(bar, indent=4, sort_keys=True))
g.close()
with open('myfile.json', 'rb') as f:
client.upload_fileobj(f, 'cloud', 'bar.json')
我得到一个“错误类型”:“IO错误”, “的errorMessage”:“[ Errno 30]只读文件系统:'myfile.json'“
任何意见将不胜感激。谢谢!
你试过'StringIO'或'tempfile'吗?你的实例有多少内存?如果你想把它写到FS中,Lambda会让你写入'/ tmp'将它添加到你的路径中:[https://www.reddit.com/r/aws/comments/5mlgp4/ aws_lambda_s3_and_temporary_files /) – 2017-05-24 19:09:18
@ monchitos82非常感谢!没有意识到lambda支持一个文件系统。这对了解 – user5494969
非常有帮助,很高兴帮助@ user5494969您的问题标题有误导性,您可能需要修复该问题以帮助处于相同情况的其他人。 – 2017-05-24 19:22:58