概要
Lambdaアプリケーションを構築する上では、Terraform以外に Serverless Framework や AWS SAM といったフレームワークを使うことがあります。
メタップスホールディングスではLambdaのアプリケーション開発にServerless Frameworkを使うことが多いのですが、インフラを構築する上で、Terraformとの使い分けはどうするべきか、という課題が度々発生します。
今回は弊社のプロダクト開発におけるフレームワークの使い分けについて、一例を紹介したいと思います。
Terraformの利点
TerraformはInfrastructure as Code (IaC) の中でもとりわけ人気が高く、多数のクラウドプロバイダーに対応しており、デプロイメントやプロビジョニングを自動化できる利点があります。
弊社のSREチームもAWSを始め、DatadogやGitHub、PagerDutyなど様々なプロバイダーをコード化する上で利用しています。
Terraformはインフラ構築に特化している反面、Lambda関数はビルドパイプラインを通してデプロイすることが多く、TerraformとLambda関数のCI/CDプロセスとの統合における課題が存在します。
Serverless Frameworkの利点
Serverless Frameworkはサーバレスコンピューティングモデルのアプリケーション開発とデプロイメントを最適化するフレームワークであり、豊富なプラグインに加えコントリビューターも多く、非常に人気のあるOSSツールです。
Lambdaの構築を始め、トリガーとなるAPI GatewayやSQSなど関連するリソースをYAMLベースで定義・構築できる利点もあります。
しかしその反面、Lambdaに関連する全てのリソースがServerless Frameworkでサポートされている訳ではなく、Lambda以外のAWSリソースの管理にはCloudFormationテンプレートの補足が必要となる場合があります。
また、あくまで「Lambdaアプリケーションの開発」を起点としたフレームワークであるため、Lambda以外のサーバーレスアーキテクチャの構築 (Fargate、Serverless Application Repositoryなど) には不向きというポイントもあります。
どう使い分けるべきか
結論から述べると、Serverless FrameworkとTerraformは適材適所で使い分けることができます。
私たちのSREチームでは現在新規プロダクトを開発中ですが、イベント駆動アーキテクチャを基軸として次のようなインフラ構成のアプリケーションを構築しています。
Lambda以外にもAPI GatewayやKinesis、EventBridgeなど様々なサービスが登場しますが、ここで重要な点は、内枠で囲ったコンポーネントはシステムの中で単独のマイクロサービスとして動作する点です。
この設計により、マイクロサービスはTerraformから独立して開発、デプロイ、スケーリングが可能となります。
仮に全てのリソースをTerraformで定義した場合は次のようなメリットも考えられます。
- アプリケーションコードとインフラを (ほぼ) 分離できる
- Terraformのリソースをモジュール化することで、他のプロダクトでもコードを流用することができる
- 将来的にアプリケーションを別のフレームワークに移行する際、インフラリソースへの影響がない
実際に一部のリソースをTerraformに移行することも検討しましたが、EventBridgeやKinesis、IAMロールなどのリソースはアプリケーションと密接に連携するため、分離した場合のメリットが希薄化し、Serverless Applicationに集約したほうがメリットが大きいという結論に至りました。
尚、DocumentDBやS3などのデータストアは他のサービスと連携する可能性がある観点から、Serverless Frameworkの管理対象外とし、Terraformで実装しています。
また、図中では記していませんが、アプリケーションのフロントエンドを提供するAmplifyやCloudFront、VPCといったインフラ基盤となるリソースも全てTerraformで管理しています。
結論
Serverless FrameworkやAWS SAMといったフレームワークを利用する場合、どこまでフレームワークでリソースを管理するべきか、Terraformとの境界線が曖昧となることがあります。
システム構成やアプリケーションの規模にもよりますが、システムを構成するコンポーネントをマイクロサービスの単位で切り出し、サービスが機能する上で依存関係のあるリソースはフレームワークに集約させ、他のサービスに影響を与えるリソースや、インフラ基盤 (ネットワーク・データストアなど) に関わるリソースをTerraformなどのIaC基盤に分離する構成は運用面で利便性が高いかなと思います。