33
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

33
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?