2017-05-24 157 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

相關問題