Posted at

Serverless Frameworkのハマりポイント色々

More than 1 year has passed since last update.

先日自分が所属しているサンノゼのスタートアップでバックエンドに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です。