「Serverless Framework」と「AWS CDK」の比較検討
一般的にサーバレスアーキテクチャの構成管理としてよく利用されているのは、「Serverless Framework」である。だが齋藤氏たちは「AWS CDK(以下、CDK)」も検討した。AWS CDKは、AWSのインフラストラクチャをTypeScriptやPythonなどの慣れ親しんだプログラミング言語で構築することのできるツールキット。プログラミング言語で記述するため、for文やif文などの構文が利用できたり、CDKのライブラリからAWSの各リソースが抽象化されて提供されたりしているのが特長。CloudFormationと比較し、圧倒的に少ないソースコード量で構成の管理を行える。またデプロイすると、CloudFormationスタックが作成され、リソースを構築できる。
そこで、齋藤氏は両者の比較検討を行った。CDKはあらゆるリソースがシンプルに、少量のコードで記述できる。またAWSが公式にサポートしているので安心感もある。その一方で、CDKに記述した構成でローカル開発環境を構築するための知見も少ない。またCDKはAWSのリソースしか構築できないため、ベンダーロックインに陥るところも気になる。
一方のServerless Frameworkは、Lambdaなどのサーバレスリソースに限ればシンプルな記述で管理することができることや、さまざまなプラグインも充実しており、容易にローカル開発環境を構築できるというメリットがある。だがサーバレスリソース以外のリソースについては、CloudFormationライクな記述をしなければならない。「CloudFormationはCDKと比較してソースコードの量が肥大化しやすい。とはいえファイルを分割しようとしても分割単位の難しさもある。さらにリソース間の関係が見えにくいという短所もあります」(齋藤氏)
双方のメリットを生かして、サーバレスリソースの構成管理にはServerless Framework、その他のリソールにはCDKを利用するという手も検討した。だが複数のIaCツールを使うとなると双方ともに学習コストやメンテナンスコストがかかったり、デプロイ機構が複雑化したり、新規リソースをどちらのツールで管理するかを考えたりなど、さまざまな面で管理が面倒になる。
最終的に、「CDKはサーバレスアーキテクチャのローカル開発環境をクリアできれば、CDKに軍配が上がる。快適なローカル開発環境を構築しつつ、すべてCDKで管理できる」と齋藤氏は考えたという。またベンダーロックインに関しては「アプリケーション要件として、マルチクラウド構成が求められていない場合は目をつむることはできると思った」と説明する。
齋藤氏たちが開発した製品のAWSアーキテクチャは下図の通り。フロントエンドにはAmazon CloudFront(以下、CloudFront)とAmazon S3(以下、S3)を採用。アプリケーションのバックエンドにはサーバレスアーキテクチャを採用し、APIエンドポイントごとに1つのLambdaを割り当てている。また大規模データを処理する製品のため、ETL処理にはGlueとRedshiftを利用している。
「ここではバックエンドのサーバレスアーキテクチャにフォーカスして説明したい」と齋藤氏は前置きし、CDKのアーキテクチャソースコードの紹介を始めた。エンドポイントごとにLambdaリソースの定義が必要になるので、1つのファイルの中でソースが肥大化しないような構成にしたという。
齋藤氏たちが開発している製品は新規プロダクトであることから、速度が重視される。よってチームも2~3人のフルスタックエンジニアで構成された。「各開発者が1つの機能をシームレスに開発できると効率的だと考えた」と齋藤氏は話す。