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作成します。
バイナリメディアタイプに「multipart/form-data」を設定します。
統合リクエストの設定で、Lambdaプロキシ統合のチェックをオフにします。
HTTPヘッダには以下2つを設定します。
- ‘*/*’
- ‘method.request.header.Content-Type’
マッピングテンプレートで「テンプレートが定義されていない場合 (推奨)」を選択し、「マッピングテンプレートの追加」をクリックします。
「multipart/form-data」を入力して保存、テンプレートの生成で「メソッドリクエストのパススルー」を選択して保存します。
これでデプロイすればcurlで実行するURLが発行されます。
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でテストします。
sample.jsonの中身が返ってきていることが確認できます。
参考サイト
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント