LoginSignup
3
3

More than 3 years have passed since last update.

Lambda & Serverless Frameworkで、multipart/form-data形式のデータを受け取る

Last updated at Posted at 2020-10-10

前書き

最近業務で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での設定

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」と調べれば、同じようなライブラリを検索できると思います。

handler.ts
// 受け取った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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3