2017-05-24 158 views
3

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

任何意见将不胜感激。谢谢!

+0

你试过'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

+0

@ monchitos82非常感谢!没有意识到lambda支持一个文件系统。这对了解 – user5494969

+0

非常有帮助,很高兴帮助@ user5494969您的问题标题有误导性,您可能需要修复该问题以帮助处于相同情况的其他人。 – 2017-05-24 19:22:58

回答

0

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

key.set_contents_from_string这应该工作,只要你有足够的备用RAM .dumps()

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') 
+0

'/tmp'](500MB空间)(https://aws.amazon.com/lambda/faqs/#functions)。清理临时文件是一种很好的做法,因为有时候你会发现你的函数在一个容器中运行,在这个容器中,最近几分钟内已经运行了相同的函数(“容器重用”),并且有足够的可能意外地耗尽了空间。并发调用不共享容器,但可以连续调用。然而,这不是一个安全问题 - 没有人会绊倒你的文件,因为当容器由于不活动而最终被销毁时,它就会被擦除。 –

+0

@ user5494969你可以请张贴包含临时文件创建的最终代码.... – Amaresh

相关问题