GoでもServerlessできるようにした
AWS LambdaにGoサポートが入ったので使ってみたで書いた通りAWS LambdaでGoがサポートされたので、せっかくだしServerlessしたいなーってことでGo用のものを作った。node.jsならclaudia.js、pythonならzappaがあるのでそれらのGo版ってことで。Githubで公開している:
機能
exampleまだ書けてないけど先にこっちに書いておく。
- API Gatewayのリソース作成・削除・リクエスト発行
- S3のリソース管理
- AWS Lambdaの関数作成・削除・実行(Goランタイムのみ)
- Cloudwatchのスケジューラ登録・Lambdaのログtail
- 上記サービス間の連携設定
大体のServerlessに必要なものは実装した。概ね機能は満たしていると思う。 基本的にはAPI Gatewayのリソースに対してS3、またはLambdaへのプロキシ設定なんかをコマンドで作っていく感じ。
サブパスを含めたリソースリクエストを指定してLambda Functionに渡せるLambdaプロキシ統合というとても便利な機能がいつの間にかできていて、それを設定できるようにしている。
あと、S3も別途API GatewayからHTTPプロキシを通してGETできるように設定可能。昔触った時はAPI Gatewayはバイナリのレスポンスが返せなかったけどそれもいつの間にかできるようになっていた。(設定自動化するの結構面倒だった)
AWS Lambda Go
前述のエントリの通り、GoでLambda Functionを書くのにAPI Gatewayからのプロキシリクエスト/レスポンスが型定義されているのがわかりやすい。
gingerはデプロイ時に各関数のコンパイル・バイナリ生成とアーカイブ化してアップロードまで自動で行う。 普通に外部パッケージも使えてnodeみたいにnode_modulesをバンドルする必要もないのでこの辺はシンプルになった。 API Gateway -> Lambda FunctionやCloudWatch Event -> Lambda Functionの連携もコマンド一発でできる。
VPCサポート入れてないのであとでやるかも。
Deploy hook
Deploy hook機能を実装していて、リソースのデプロイ前に任意のコマンドを発行できる。例えばhugoとかを設定しておけば、デプロイ時にコマンド発行、S3にアップロードしてAPI Gatewayから配信する、とかは簡単にできる。加えて動的なものはLambdaにプロキシしてあげればSPAとかにも使えると思う。
その他
以前Serverlessを使ってたことがあったけど、設定yamlを書くのが結構しんどくて、どちらかといえばコマンドをガシガシ発行して設定を構築するほうが個人的には好みだったので、大体はサブコマンドとオプション引数で設定を作っていく方針にした。細かい設定関連(Lambda Functionのtimeout設定とか)は小さな設定ファイルを配置するのでそれを編集して貰う必要はある。
デプロイにCloud Formationは使ってなくて、設定に基いて各サービスをコツコツ作っていく。Serverlessの時にデプロイ失敗ログが不親切すぎて辛かったので…。
ちょっとエラーハンドリング周りがおざなりになってしまっててリファクタリングしたい気持ちがある。
まとめ
Goのプロジェクトってg入れたくなるのなんでだろう。
現場からは以上です。