如何使用AWS Lambda通过创建临时文件将“文件”上传到S3?

时间:2017-05-24 19:02:32

标签: python amazon-s3 lambda boto3

我正在编写一个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')

我收到“errorType”:“IOError”,   “errorMessage”:“[Errno 30]只读文件系统:'myfile.json'”

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

2 个答案:

答案 0 :(得分:4)

感谢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')

答案 1 :(得分:0)

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

如果.dumps()有足够的备用内存,key.set_contents_from_string应该有效。