現在、Vueでサーバーレスアプリケーションを作成しています。
フロント側からaxiosでapigatewayにリクエストを投げてそれをlambdaに渡してS3に画像をアップロードしようとしています。
何故経由させているかというと、データベースに画像の情報を登録するためです。
なので、もしかするとS3に直接アップロードしてアップロードトリガーで処理することができるかもしれません。
とりあえずはおいておきます。
フロントエンドのリクエストの部分が以下になります。
vue
1 methods: { 2 onSubmit () { 3 let data = new FormData() 4 data.append('title', 'test') 5 6 for (let i = 0; i < this.files.length; i++) { 7 data.append('image', this.files[i]) 8 } 9 10 let config = { 11 headers: { 12 'Content-Type': 'multipart/form-data' 13 } 14 } 15 16 axios.post('apigatewayUrl', data, config) 17 .then((response) => { 18 console.log(response.data) 19 }) 20 .catch((error) => { 21 console.log(error) 22 }) 23 },
lambda側は以下です。
python
1import json 2import boto3 3import base64 4 5 6def lambda_handler(event, context): 7 # print(json.dumps(event)) 8 9 try: 10 s3 = boto3.resource('s3') 11 bucket = s3.Bucket('backetname') 12 imageBody = base64.b64decode(event['body']) 13 key = "test/cat.png" 14 bucket.put_object( 15 Body = imageBody, 16 Key = key 17 ) 18 print('success!') 19 res = { 20 "isBase64Encoded": True, 21 "statusCode": 200, 22 "headers": {}, 23 "body": json.dumps({"status": 1}) 24 } 25 return res 26 27 except Exception as e: 28 res = { 29 "isBase64Encoded": True, 30 "statusCode": 200, 31 "headers": {}, 32 "body": json.dumps({"message": str(e)}) 33 } 34 return res
実際にリクエストを投げると以下のようなエラーが返ってきます
shell
1string argument should contain only ascii characters
調べてみるとJavascriptのFormDataは独特なパースが必要というのを知りました。
現在、lambdaはpython3を使っていますが、パースする方法が見つかりませんでした。
そもそもFormDataオブジェクトを使用して画像をpostしている例がほとんどなく、
他の方は一体どのように画像をアップロードしているのだろうかと甚だ疑問です。
localhost→apigateway→lambda→S3はちゃんと繋がっているのは確認済みです。
ここで先ほどの余談に戻るのですが、APIGatewayとlambdaを経由させるのは一般的ではないのでしょうか?
S3にトリガーを設定しておいて、そのトリガーでデータベースを更新するのが一般的でしょうか?
教えて欲しいことをまとめると、
- FormDataでpostしたデータをlambda(python)側でパースして保存する方法はあるか
- そもそもFormDataを用いない方法があってそっちの方が便利なのか
- そもそもPythonという選択が間違っているのか
- apigateway→lambdaを経由させる必要はなく、S3にトリガーを仕込むのが普通か?また、その時のデータベースに登録するのに必要な情報等は一緒に送ることができるのか
- 一般的なサーバーレスアプリケーションに置ける画像アップロードの仕組みはどれがメジャーなのか
よろしくお願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/22 05:07
退会済みユーザー
2019/02/22 05:11
2019/03/02 08:45
退会済みユーザー
2019/03/02 09:28