API Gateway(REST API)+Lambda(node.js v16)でファイル送信したデータを受け取る方法

API Gateway(REST API)+Lambda(node.js v16)でファイル送信したデータを受け取る方法

curl

curlでローカルにあるsample.jsonファイル送信します。

sample.json

{
  "name": "takahashi",
  "age": 20
}

今回は1ファイルだけとします。

curl -X POST -F file1=@sample.json https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/

API Gateway

API Gatewayの設定を行います。REST APIのPOSTメソッドでAPI作成します。

API Gateway(REST API)+Lambda(node.js v16)でファイル送信したデータを受け取る方法

バイナリメディアタイプに「multipart/form-data」を設定します。

API Gateway(REST API)+Lambda(node.js v16)でファイル送信したデータを受け取る方法 API Gateway(REST API)+Lambda(node.js v16)でファイル送信したデータを受け取る方法 API Gateway(REST API)+Lambda(node.js v16)でファイル送信したデータを受け取る方法

統合リクエストの設定で、Lambdaプロキシ統合のチェックをオフにします。

HTTPヘッダには以下2つを設定します。

  • ‘*/*’
  • ‘method.request.header.Content-Type’

マッピングテンプレートで「テンプレートが定義されていない場合 (推奨)」を選択し、「マッピングテンプレートの追加」をクリックします。

「multipart/form-data」を入力して保存、テンプレートの生成で「メソッドリクエストのパススルー」を選択して保存します。

これでデプロイすればcurlで実行するURLが発行されます。

API Gateway(REST API)+Lambda(node.js v16)でファイル送信したデータを受け取る方法

Lambda

次にLambda(node.js v16)でjsonデータを受け取ります。

parse-multipart-dataモジュールを使用します。

npm i parse-multipart-data

Lambdaには以下のようなデータが渡ってきます。

event["body-json"].toString()
↓
[
  {
    filename: 'sample.json', // ローカルファイル名
    type: 'application/octet-stream',
    name: 'file1', // curlで指定したファイル名
    data: 
  }
]

event.params.header['content-type']
↓
multipart/form-data; boundary=------------------------5be85402ae18ca66

この値(event.params.header[‘content-type’])からまずboundaryを取得します。

const boundary = multipart.getBoundary(event.params.header['content-type'])
console.log(boundary) // ------------------------5be85402ae18ca66

multipart.parseします。第二引数にboundaryを指定します。

const part = multipart.parse(Buffer.from(datas, "base64") ,boundary)
↓
[
  {
    filename: 'sample.json',
    type: 'application/octet-stream',
    name: 'file1',
    data: 
  }
]

配列で来るのは、curlで複数ファイルを送信することができる為で、今回は1つのsample.jsonのみ送信しているので1要素となっています。

あとは、part.dataをBuffer→Stringに変換すればローカルのsample.jsonを扱う事が可能となります。

Lambdaソースです。

import multipart from 'parse-multipart-data'
import { StringDecoder } from "string_decoder"
const decoder = new StringDecoder("utf-8")
export async function handler(event, context) {
  const boundary = multipart.getBoundary(event.params.header['content-type'])
  const part = multipart.parse(Buffer.from(event["body-json"].toString(), "base64") ,boundary)
  const ret = decoder.write(part[0].data) // buffer→string
  return {
    statusCode: 200,
    body: `${ret}`
  }
}

テスト

最後にcurlでテストします。

API Gateway(REST API)+Lambda(node.js v16)でファイル送信したデータを受け取る方法

sample.jsonの中身が返ってきていることが確認できます。

参考サイト

multiplepart/from-data: AWS API Gateway + Lambda
How to handle binary & string data types using Python
[Lambda] API Gateway + Lambda 를 이용하여 S3 에 이미지 업로드
aws-sdk 를 사용하여 코드 상에서 직접 업로드하는 기능을 추가하여 이미지 업로드 API 를 만들 수도 있지만, API Gateway 와 Lambda 를 이용하여 좀더 쉽고 빠르게 업로드하는 방법을 구현해보려고 ...
parse-multipart-data
A javascript/nodejs multipart/form-data parser which operates on raw data.. Latest version: 1.5.0, last published: 2 yea...

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました