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の大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^






コメント