先日自分が所属しているサンノゼのスタートアップでバックエンドにServerless Framework(AWS上でNode.js)を使ったサービスをリリースしたので、ハマりポイントをまとめておこうと思います。
AWSのサービス自体のハマりポイントだったりしますが気にせず行きます。
コールドスタートが遅い
この辺にある通りですが、LambdaFunctionは初回呼び出し時やしばらく呼ばれなかった後に呼ばれたときはresponse timeが数秒になったりします。さらにVPC内で動かす場合は10秒以上になることもあります。なので、(ユーザ数いっぱいのアプリで常にアクセスある場合等を除いて)keepalive的なスクリプトが必要になります。間隔は不明ですが、今の所5分起きくらいに呼んでて特に問題になったことはないです。
ちなみに遅い理由はLambdaFunctionはコンテナ上で動くのでコールドスタート時はコンテナのセットアップに時間が掛かるかららしいです。VPCで特に遅いのはコンテナにENIを割り当てる必要があるからみたいです。
VPC内だとデフォルトでは外に出れない
VPC内で起動するとデフォルトでは外に出れなくなります。外部のAPIを呼ぶ場合等はVPC内にNATGatewayを作ってRoute Tablesを設定する必要があります。
Adminが必要
ここに書いてますが、まだどの権限が必要かが整理されてないので、AdministratorAccessで使ってね、とのことです。必要に応じてAWS自体のアカウントを分けてねみたいなことも書かれてますが、自分の会社はスタートアッププランのフリークレジットで使ってるので分けることができませんでした。
Authorizerで認証エラー
Authorizerを立てて独自の認証を使うことができますが、再デプロイのたびになぜか認証エラーになるという現象に遭遇しました。これはドキュメントの例の通りにTTLを0にしたら解決しました。公式ドキュメントによるとポリシーがキャッシュされるからだそうです。
ちなみに認証・認可にはAuth0を使ってますが、ソーシャル系の認証やAD認証等が使えたり便利機能色々あったりでかなりオススメです(これまたそれなりにハマりポイントあるけど...)。Cognitoは調査開始当初では機能が足りなくて断念しました。Auth0の方が今後AWS以外の選択肢も持てるし良いんじゃないかと思います。
色んなリソース上限に達する
まずServerlessFrameworkは内部的にCloudFormationを使ってますが、CloudFormation自体のリソース上限が200なので、デプロイの際に200を超えるリソースがあるとエラーになります。ちなみに例えばhttpのエンドポイントを作ると、APIGateway、LambdaFunction、CloudWatchが作られて1エンドポイントあたり3リソース必要になります(色々まとめることはできる)。
この辺で色んなWorkaroundが議論されてますが、基本的にはserverless.yml自体を分けるのが良いみたいです。ただそれをするとAPIGatewayのrootが変わってしまうので、クライアント側もURLによって投げ先を変えるみたいなことが必要になります。さらにそれぞれのデプロイがアトミックに行われないので、アトミックに変更したいものは一つのserverless.ymlにまとめないといけません。
あとはデフォルトだと1ファンクションごとに1CloudWatchのログが作られたり、ステージごとにS3にBucketを作ったりするので、この辺もサービスやステージがたくさんあったりするとあっさりBucket上限やCloudWatchの上限にあたります。
今の所ここが一番の制約かなと思います...
ローカル開発が鬼門
前述の通り、Administratorアクセスが必要だったり、色々上限があったりするので、それぞれの開発者が自分専用のステージにデプロイするみたいな使い方は厳しいです。
で、serverless-webpackやらserverless-offlineみたいなプラグインを使ってローカルで動かすようにするんですが、まだまだ新しいものなので色々とバグを踏みます。例えば、queryが空のときローカルだと空のオブジェクトが入ってくるけどデプロイするとnullになってて落ちたりとかありました。
しかもこの手の不具合や前述のリソース上限とかはローカル開発だと遭遇しないけど、いざデプロイしようとすると当たったりするので、リリース直前に大慌てすることになりましたw
でも良いところもいっぱい
いろいろハマったけど良いところもいっぱいあって、デプロイはホント楽だしスケールもする(はずだ)し、開発も活発で機能追加も頻繁だし、AWS以外の選択肢も持てるし、しばらくは乗り換え等は考えずに使っていこうかなと思ってます。
(ApexでGoで書きたい気持ちもあるけど...)
以上、簡単ですが他に使ってる方々の助けになれば幸いです。
また気付いたら(てゆーか、大分書き忘れもあると思うので)追記等したいと思います。
あ、採用もしてますので興味のある方がいたらツイッターとかで連絡ください。
日本からのリモートでも現地でも大丈夫です。
フロントはReact + reduxです。