[AWS]Lambda vs Fargate. APIを実装する場合に思うこと
目次
はじめに
AWSを利用してAPIを作る場合に Lambda + API Gateway を利用するケースと、 Fargate を利用するケースが多いのかなと想像します。
サービス開発の中で、今後の運用や保守を考えて不安に思うところがあり、前者から後者の構成に置き換えを実行する機会があったので、所感を書いていきます。
※どちらかのサービスが良いとかdisるという内容では無いです。
コストについて (Lambdaの方が安い?)
料金形態が異なることから簡単には比較はできませんが、Lambdaは毎月リクエスト 100 万件の無料枠があることから、想定呼び出し回数次第ではLambdaの方が安く済ませられるケースが多いと考えていました。
サービスを開発していく中でDBにRDSを採用したことで、LambdaをVPCに配置してRDS Proxyを噛ませる必要が発生したり、レスポンス速度を上げるためにコールドスタートを止めてProvisioned Concurrencyを適用したことによりコストが高くなり、結果としてLambdaの方が圧倒的に安いと言える状況ではなくなりました。
もちろん、DBが不要だとかDynamoDBを利用するとかであれば問題ないので、 コストの観点からLambdaを選択すべきかどうかよりは、採用するDBに依存すると思いました。
スケーラビリティ
Lambdaはスケーラビリティに優れていますが、 スケールアウトを必要とするようなサービスで無ければこのメリットは生かされません。
実装の難易度
Lambdaの制約を理解していれば、コードの実装は進められると思いますし、 取っ付き易さはあると思います。 しかし、この"制約"という部分に中々辛い部分があると思います。
例えば、デプロイパッケージの制限が250MBであったり、LambdaLayerの仕組みがあったり、ウォームスタートがあったり、/tmp
の話など実装を進めていく中で、こういったハマりどこりに当たりました。
そして、上記でも触れたように、VPCに置くとかRDSを参照するとか、この辺りの要素の有無で考慮すべき箇所が増えていくと思います。
また、これだけでなくLambdaによるAPI開発に必須なAPI Gatewayについても多くのハマりどころがあります。
このあたりを十分に考慮して開発を進められる体制で無ければ、比較的に汎用な知識で開発を進められるコンテナ(Fargate)の方が良いと思いました。
ただし、Fargateもコンテナ周りの知識は必要となります。
デプロイ
Lambdaのデプロイについては、Serverless Framework(以下、sls)等様々な手段がある中で、AWS CDK を利用していました。 CDKの場合は、バンドルやビルド周りの処理を上手いこと片付けてくれる仕組みがあるため、この辺りの体験は良かったです。
これについてはFargateも同様で、CDKを使ったデプロイが比較的良かったです。 ただし、CDKのリポジトリとコンテナのリポジトリを切り離して進める必要があったので、 aws cli でShellを組んでデプロイすることにしました。
CDKを選択するかはインフラ開発の体制や運用体制に影響すると思います。
言いたかったこと
- Lambdaを選ぶ基準はコストではなくDB要因の方が大きくなると思う
- Lambdaは技術的なハマりポイントを理解している開発体制でないと難しい
- コンテナはAWSの知識と切り離して開発できる
- 結局は開発体制次第
- CDKは良かった
この構図はクラウドネイティブにするか否かという点にも共通すると思います。
以上。