API GatewayをZappaの管理から外すための試行錯誤

システムデザイン部開発ユニットの前原です。

以前の記事でZappaについて紹介した中で、API Gatewayが上限数に達してしまったため、

"apigateway_enabled": false

としてAPI GatewayをZappaで管理(デプロイ)しないようにするという対策をとったことを書きました。

その際に苦労した点や注意する点を残しておきたいと思います。

 

ZappaでAPI Gatewayを管理することについて

メリット

– 設定のほとんどを自動で行ってくれる

– 個人レベルであればこれで全く問題ない

デメリット

– 1つのLambda関数(ステージ別)に1つのAPIが生成される

– APIを小分けで多数作っている場合には、上限数60に達しやすい

 

背景: API Gatewayの上限数に達してしまった

一度、上限数の緩和申請を提出しましたが、担当者の方から次の理由で他の方法を検討するように推奨されました。

API 管理においては、アカウントレベルでのスロットル制限があり、この制限は緩和することができない

また、他の方法として、以下4つを提案いただきました。

  1. 不要な API を Swagger にエクスポートし、その API を削除する必要な際にインポートして使用する

  2. ビジネス上の目的が似通っている複数の API がある場合には、1 つの API に統合する

  3. (もし可能な場合には)別々の dev/beta (開発用またはベータの) API を作成する代わりに、ステージを使用する

  4. API を複数のアカウントに分ける

以上を検討しましたが、

1, 3では削除できる数に限りがある

4は管理コストが増加する (アカウントを分割のルールの明確化など)

ため、主に2の方法で今まで細かく分割されていたAPIを今後は統合していく方針となり、

Zappaを使い続けるためには最低限dev, prodで分かれていたAPIを1つにまとめる必要が出ました。

 

APIのまとめ方

Zappaが -dev や -prod のようなステージ名のプレフィックスを付けてLambdaを作成するので、以下のようにAPI Gatewayのステージ変数を設定し、

該当ステージのLambdaを呼び出すようにしました。

また、今までかなり細分化された単位でAPIを分けていましたが、それをAPIの中の1リソースに割り当てれば、とりあえずはAPIをまとめることが可能です。

 

Zappaが行うAPI Gatewayの設定再現のために試した方法

最初に「Zappaの作ったAPI Gatewayの設定とGUI上で見比べながら設定する」という方法を取りましたが、かなり苦労しました。

1. API Gatewayの設定は項目が多く煩雑なので、漏れが出る

具体的には

– “設定” の中の “バイナリメディアタイプ” に値 “*/*” を設定する必要があった

(これまで全く気にしたことがない箇所だった)

– 

2. (おそらく)GUI上には存在しない設定が必要な箇所がある

具体的には

– 上記のバイナリメディアタイプと関連すると思われるが、エラー

で動かなかったため調べたところ、Integrationに対しての設定値として

 が必要だとわかったが、GUIからは設定箇所が見当たらなかった

 

そこで、aws cliでZappaの作ったAPI Gatewayの情報を確認し、必要な部分はコマンドラインで補完することで対応しました。

上記2.の CONVERT_TO_TEXT については以下のように設定、確認を行いました。

設定

参考: https://forums.aws.amazon.com/thread.jspa?threadID=256140

確認

 

また、zappa update コマンドでデプロイするたびにAPI GatewayのLambda関数実行権限を手動で付け直す必要が出ました (zappa update のたびにLambda関数が削除→再生成されているため?)。

そこで、zappa update コマンドと aws cli の lambda add-permission コマンドを1つのシェルスクリプトにまとめて実行するようにしました。

 

解決できたこと

– ZappaでデプロイしたLambdaと、手動管理のAPIを接続できた

– 複数のLambdaを1つのAPIにまとめられた

– APIの上限数対策にはなる

– proxyリソースではリソース別のメトリクス (4xxエラー、5xxエラーの件数など) が取得できないようなので、不具合が発生したときに切り分けが面倒になりそう

 

課題

感想として、ZappaがAPI Gatewayに対してやってくれていた設定を再現するのは、調査も含めてかなり面倒でした。

また、コード化されていないため、今回のようなことを毎回行うのは漏れやミスが発生しやすく、問題が多いです。

もっと良いやり方がありそうなので、今後、他の方法も探していきます。