2017-04-27 4 views
0

私はpython2.7とs3とAWS lambdaを使用します。私はs3を置くjpegファイルのキーを取得しようとします。私はboto3を使用します。それから私は問題がある。つまり、私がboto3でキーを取得したときに、キーの内容はファイルへのパスではなく、サフィックス文字列のようなものが追加されます( '/media/test.jpg.dAAAfd01'のように)/ media/test .jpg ")aws s3 by boto3アップロードファイルのキーが何か変わった文字列を追加しました

このエラーを解決するために熱心であれば、教えてください。

エラーメッセージは次のとおりです。

例外IOError:[エラー番号2]このようなファイルまたはディレクトリ:I型 '/media/test.jpg.dAAAfd01'

コード(py2.7)

s3 = boto3.client('s3') 

for record in event['Records']: 
     bucket = record['s3']['bucket']['name'] 
     key_with_extention = str(record['s3']['object']['key']) 
     key = key_with_extention.split(".")[0] + "." + key_with_extention.split(".")[1] 
     download_path = '/tmp/{}'.format(key) 

     s3.download_file(Bucket=bucket, Key=key ,Filename=download_path) #i got error here 

iは分割を使用しようとしましたそれを解決する。このよう 、

キー= '/media/hoge/hoge/test.jpg.dAAAfd01' key.split( " ")[0] +"。JPG"

しかしkey.split( ")")[0]は無効です。

私は混乱しています。

助け私を...

+0

コードにロギングを追加して、値を確認することができます。 http://docs.aws.amazon.com/lambda/latest/dg/python-logging.htmlを参照してください。 – jarmod

+0

ロギングの1つの方法は、ハンドラの先頭に 'print(Records)'を挿入することです。これにより、着信メッセージのコピーがCloudWatchログに保存されます。それから、あなたの質問にロギング情報を追加してください(編集を使用してください)ので、私たちは着信データを見ることができます。 –

+0

あなたのアドバイスをいただきありがとうございます、私は問題を解決し、私は今から記事を置く –

答えて

0

は、キーを取得するために、これを試してみてください:

import urllib 

... 

key = urllib.unquote_plus(record['s3']['object']['key'].encode('utf8')) 
+0

私に助言を与えてくれてありがとう。しかし、それは動作しません...分割メソッドはあまりにも機能しません。 –

0

何回も裁判の後、私はこの結果の原因を得ました。それはAWSラムダの規制です。

AWSラムダでは、 "tmp"ディレクトリのみを使用できます。 AWSではmaltipleディレクトリを禁止しています。私はos.makedirsなどを使って "tmp/foo/bar/foo/bar"のようなパスを保存しようとしましたが、エラーが発生しました。

DOWNLOAD_PATHがmaltipleディレクトリを持っている私の場合

s3.download_file(バケツ=バケット、キー=キー、ファイル名= DOWNLOAD_PATH)は、その後、私はDOWNLOAD_PATHを変更

このエラーをrasingの原因となります"tmp/test.jpg"に私はそれを解決しました。どうもありがとうございます。

関連する問題