読者です 読者をやめる 読者になる 読者になる

LambdaとAPI Gatewayまとめて管理するやつ

LambdaとAPI Gatewayの自動化ツールの開発がそれぞれ進んできたので、そろそろまとめて管理するための1つのツールをつくろうとしてる。servant-app/JAWSawslabs/aws-apigateway-swagger-importer などのツールはSwaggerというスキーマファイルに全てのエンドポイントのインターフェースをまとめて定義するという方法になっているけれど、元々1つのエンドポイントあたりの情報量が多いし、エンドポイントの数が増えるにつれてSwaggerのファイルの内容量がどんどん増えて編集しづらくなっていくことが容易に想像できる。

そこで、各エンドポイント (ここではHTTPメソッドとURLで特定できる GET /recipes みたいな単位のことをエンドポイントと呼んでいる) ごとにディレクトリを分け、それぞれのディレクトリ内に package.json, config.json, index.js を配置する、というルールにしようと考えている。Swaggerは最初は使ってみるけれど、最終的には使うのをやめるかも。勿論、内部で利用する表現形式からSwaggerを生成することは出来ると思うので、Swaggerの恩恵が受けられなくなるというわけではないが、ユーザに直接書いてもらうところでSwaggerを見せるのはやめとこうかなという感じ。以下がファイル構成の例。

.
|-- README.md
|-- actions
|   |-- show_top_page
|   |   |-- package.json
|   |   |-- config.json
|   |   `-- index.js
|   |-- list_articles
|   |   |-- package.json
|   |   |-- config.json
|   |   `-- index.js
|   `-- show_article
|       |-- package.json
|       |-- config.json
|       `-- index.js
|-- lib
`-- global-config.json
`-- package.json

actionsというディレクトリの中に、show_top_page や list_articles、show_article といったディレクトリがある。actionという名前を付けたのはRails由来で、RailsではControllerクラスに定義されてリクエストを処理することになるメソッドのことをactionと呼ぶので、ここでもactionという名前を使うことにした。functionsでは汎用的ずぎてAPI Gatewayに関する情報も含まれているということが分かりづらいし、 かといってendpointsとかだとLambda感が薄れてしまうので難しい。servant-app/JAWS ではうちでいうactionsの代わりにapiというディレクトリを使うことになっているみたい。actionの名前はディレクトリ名で表現するということにする。actionsディレクトリの中に全てのactionが置かれるということはactionの名前は一意になるので、特定のactionだけデプロイしたいとかそういうときに deploy show_article みたいな感じで指定できるようになりそう。

各action用のディレクトリにはconfig.jsonを配置するようになっているが、このファイルにはそのactionがAPI Gateway上でどういうエンドポイントとして提供されかという情報と、Lambda上でどう実行されるかという設定をそこに書いてもらうためにそれを置いた。index.js にはLambdaで実行されるべき関数を定義してもらう。package.jsonは、少し面倒だと思われるかもしれないがそれぞれのactionごとに別々で用意させるようにしてある。複数のactionで共通するロジックは、lib以下において適当にrequireしてもらおうと思っている。package.json に独自のメタデータを付け加えることは、文化はともかく仕様では一応許されているみたいなので、もしかしたら package.json に統一させるかもしれない。node.js - Add custom metadata or config to package.json, is it valid? - Stack Overflow

前に Amazon Lambdaにまとめてアップロードするやつ - ✘╹◡╹✘ で実験したときのコードによって、複数のディレクトリでそれぞれ npm install させたりコンパイルしたりZIPにしてLambdaにデプロイしたりするというのは自動化できるようになってるんで、今度はactionの名前を指定して特定のactionだけデプロイするとか、ローカル環境でサーバを立ち上げて試せるようにするとか、その辺のツールをつくっていくつもり。