前書き
最近業務でAWSのLambdaとServerless Frameworkを使うことが多いです。
業務の流れが早く、次から次へと新しいツールを触ってすべて忘れていきそうなので、個人的なまとめとして、記事を作成します。
言語はnode.js, TypeScriptを使用しています。
multipart/form-dataとは?
multipart/form-dataは、前述の通り複数の種類のデータを一度に扱える形式で、主な利用シーンはHTMLフォームです。特にファイルアップロードでよく利用されます。
引用元:
[フロントエンド] multipart/form-dataを理解してみよう
https://www.yoheim.net/blog.php?q=20171201
ボディはBoundaryという区切り文字で、ファイル送信時に指定したnameごとに区切られます。
------WebKitFormBoundaryO5quBRiT4G7Vm3R7
Content-Disposition: form-data; name="message"
Hello
------WebKitFormBoundaryO5quBRiT4G7Vm3R7
Content-Disposition: form-data; name="file"; filename="a.txt"
Content-Type: text/plain
aaa
------WebKitFormBoundaryO5quBRiT4G7Vm3R7--
curl
curl -X POST -F file=@./sample.csv https~(Lambda関数のエンドポイント(URL)) --output output.csv
(引用元同じ)
serverless.tsでの設定
constserverlessConfiguration:Serverless={service:{name:'sls-test',},frameworkVersion:'1',custom:{webpack:{webpackConfig:'./webpack.config.js',includeModules:true},// ここapiGateway:{binaryMediaTypes:['multipart/form-data']}},
これで、APIGatewayの設定→バイナリメディアタイプという欄に、multipart/form-dataが設定されるようになります。
Lambda関数内での処理
node.jsで、aws-lambda-multipart-parserというnpmモジュールを使って、multipart/form-data形式のデータを解析しています。
他の言語でも、「言語名 multipart/form-data」と調べれば、同じようなライブラリを検索できると思います。
// 受け取ったevent.bodyがbase64エンコードされているのでデコードevent.body=Buffer.from(event.body,'base64').toString('binary');// multipart/form-dataをパースするconstmultipartBuffer=Multipart.parse(event,true);// 再度base64エンコードされているのでデコードletdata:string=Buffer.from(multipartBuffer.file.content,'base64').toString('binary');
後書き
他にも、serverless-jest-pluginというnpmモジュールを使ってテストを構築する方法や、そもそもBufferについても勉強してまとめたいのですが、一旦止めておきます。
参考
serverlessを使ってLambdaにmultipart/form-dataでバイナリデータをアップロードする
https://qiita.com/YoukyMurakami/items/a1da42b394970979ad1e
base64ってなんぞ??理解のために実装してみた
https://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4
Node.jsのバッファについて
http://info-i.net/buffer#i-2