【发布时间】:2017-05-26 06:56:03
【问题描述】:
我正在编写一个 lambda 函数,其目标是从 s3 下载一个 .json 文件,修改其内容,然后以不同的键重新上传到同一个存储桶。
所以在我的 s3 中,我有一个“云”存储桶 cloud/folder/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 变量是正确的,但它是一个字典对象。我怎样才能以 bar.json 的形式直接上传到该存储桶? 我在这里看到了其他示例,但我并不热衷于将我的 AWS 密钥或访问密钥放在任何地方。我假设因为我使用的是 lambda,所以当我尝试执行以下操作时,我无法在机器上创建文件:
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')
我得到一个“errorType”:“IOError”, "errorMessage": "[Errno 30] 只读文件系统:'myfile.json'"
任何建议将不胜感激。谢谢!
【问题讨论】:
-
你试过
StringIO或tempfile吗?您的实例有多少内存? Lambda 会让你写信给/tmp,如果你想把它写到 FS,请将它添加到你的路径中:thread in reddit -
@monchitos82 非常感谢!没有意识到 lambda 支持文件系统。这对了解很有帮助
-
很高兴为@user5494969 提供帮助,您的问题标题具有误导性,您可能需要解决这个问题以帮助处于相同情况的其他人。
标签: python amazon-s3 lambda boto3