Function Compute + API GatewayでPOSTのエンドポイントを作る

アリババクラウド のFunction Compute + API GatewayでPOSTのエンドポイントを作ってリクエストボディを拾うのが大変でした。

今回のソースコード

// index.js
const atob = require('atob');

const createMessage = (parameters) => {
  // データを保存するなりなんなりと
}

module.exports.handler = (event, context, callback) => {
  const query = JSON.parse(event.toString('utf8'))
  createMessage(JSON.parse(atob(query["body"])));
  callback(null, { statusCode: 201, body: 'success!' });
};

ここでポイントが2つあります。

  • fc-helperhookは使うことができない
  • リクエストボディを拾うのに手間がかかる

それぞれに関して補足します。

fc-helperhookが使えない

hookを使うときはhook(async (ctx) => {})のようなインターフェイスで使うのですが、API GatewayからFunction Computeにリクエストボディが渡らないためにctx.reqが空になってしまうので使い物になりません。

ですので(event, context, callback) => {})のスタイルを使いましょう。

fc-helper使えないならテストがめんどくさいですね・・・

改善を期待します。

リクエストボディを拾うのに手間がかかる

やたらと遠くにいて拾いにくいです。

> const request = JSON.parse(event.toString('utf8'))
{"body":"CxxxxxxxxxxxxogInxxxxxxxxxxlIGJvZHkgfSB9In0K","headers":{"X-Ca-Api-Gateway":"101CFC98-4F9C-46EF-BBDF-36D280F45D33","X-Real-IP”:”xxx.xxx.xxx.xxx”,”X-Forwarded-Proto":"http","X-Forwarded-For":"xxx.xxx.xxx.xxx","User-Agent":"curl/7.54.0","Content-Type":"application/json","Accept":"*/*","CA-Host":"10ba8f4b3ea74xxxxxx0e5c4-cn-shanghai.alicloudapi.com"},"httpMethod":"POST","isBase64Encoded":true,"path":"/","pathParameters":{},"queryParameters":{}}
> atob(request["body"])
CxxxxxxxxxxxxogInxxxxxxxxxxlIGJvZHkgfSB9In0K

さらに注意

本題とはあまり関係ありませんが、callbackの引数に気をつけましょう。第二引数のオブジェクトのstatusCodebodyは必須です。

API GatewayのmethodをPOSTにするのを忘れないようにしましょう。template.ymlを使いまわしてGETのままで少し詰まりました。