如何使用 AWS Lambda 创建临时文件,将'file'上传到 S3?



>我正在编写一个lambda函数,其目标是从s3下载一个.json文件,修改其内容,然后在不同的键下重新上传到同一存储桶。

所以在我的 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 变量是正确的,但是一个字典对象。如何直接上传到该存储桶作为 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')

我得到一个"错误类型":"IOError", "errorMessage": "[Errno 30] 只读文件系统: 'myfile.json'"

任何建议将不胜感激。谢谢!

感谢monchitos82,我了解到你可以在lambda中写入/tmp。所以我所要做的就是将其添加到我的文件的开头,它起作用了。

g = open('/tmp/myfile.json', 'w')
g.write(json.dumps(bar, indent=4, sort_keys=True))
g.close()
with open('/tmp/myfile.json', 'rb') as f:
client.upload_fileobj(f, 'cloud', 'bar.json')

显然你甚至不需要写一个临时文件;Key.open_write似乎为您提供了一个可写文件,您可以将 JSON.dump到该文件。我仍然不确定它目前是否在 AWS 中实施。

只要您有足够的备用 RAM 用于.dumps(),就应该key.set_contents_from_string工作。

最新更新