前書き
最近業務で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での設定
const serverlessConfiguration: 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をパースする
const multipartBuffer = Multipart.parse(event, true);
// 再度base64エンコードされているのでデコード
let data: 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