2017-05-24 12 views
3

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の秘密やアクセスキーをどこにでも置くことに熱心ではありません。 「例外IOError」、 「にErrorMessage」:「[

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」を取得:私は、私は以下のような何かをしようとすると、私は、マシン上のファイルを作成することはできませんラムダを使用していますので、私は仮定しますErrno 30]読み取り専用ファイルシステム: 'myfile.json' "

アドバイスをいただければ幸いです。ありがとう!

+0

あなたは 'StringIO'または' tempfile'を試しましたか?あなたのインスタンスはどれだけのメモリを持っていますか? Lambdaは '/ tmp'に書き込むことで、あなたがFSに書き留めたい場合にあなたのパスに追加します:[redditのスレッド](https://www.reddit.com/r/aws/comments/5mlgp4/ aws_lambda_s3_and_temporary_files /) –

+0

@monchitos82ありがとうございました!ラムダがファイルシステムをサポートしていることを認識していませんでした。これは非常に助けて – user5494969

+0

@ user5494969あなたの質問のタイトルが誤解を招くように助けてくれることを嬉しく思います。同じ状況で他の人を助けるためにこれを修正したいかもしれません。 –

答えて

0

明らかに、一時ファイルを書き込む必要はありません。 Key.open_writeは書き込み可能なファイルを与えるようです。.dump JSON。現在AWSに実装されているかどうかはまだ分かりません。

に十分なスペアRAMがあれば、動作するはずのkey.set_contents_from_stringがあります。

4

monchitos82のおかげで、ラムダで/ 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'(https://aws.amazon.com/lambda/faqs/#functions)には[500MBのスペースがあります。一時ファイルをクリーンアップすることをお勧めします。これは、関数が過去数分間で最近実行されたコンテナ(「コンテナの再利用」)で実行されていることがあります。意外にもスペースを使い果たす可能性があります。並行呼び出しはコンテナを共有しませんが、連続した呼び出しはコンテナを共有できます。しかし、セキュリティ上の問題ではありません。あなたのファイルは、非アクティブなためにコンテナが最終的に破棄されたときに消去されるため、他の誰もあなたのファイルを見つけられません。 –

+0

@ user5494969あなたは一時ファイルの作成を含む最終コードを投稿してください.... – Amaresh

関連する問題