質問: 閲覧いただきありがとうございます。 AWS LambdaでRestfulAPIを作るベストプラクティクスについてに質問です。 Webアプリケーションのバックエンドに使用する技術としてLambdaでサーバーレスにしようか検討しています。さらに、開発を効率化するためにDjangoの導入を考えているのですが、ネットで調べたところあまり事例がないようでした。 そこで以下のことが疑問です。 * AWS LambdaとDjangoを用いてRestfulAPIを作るのはなんらかのデメリットがあるから事例が少ないのでしょうか? * LambdaでRestfulAPIを作成する時に一つのプロジェクトにAPIをまとめるのか、それともマイクロサービスみたいにプロジェクトを別々に分けた方が良いのでしょうか? ご回答よろしくお願いします。
回答: (1) AWS LambdaとDjangoを用いてRestfulAPIを作るのはなんらかのデメリットがあるから事例が少ないのでしょうか? 基本的に API Gateway + lambda の構成では Serverless Framework などのデプロイツールを組み合わせてプロジェクトを作成し、開発することが多いです。 URL のルーティングは API Gateway の設定パラメータで定義することになります。なので、質問者様がイメージなさるような、Webサーバーにアプリを置いてコードでルーティングを設定する、といったものとは少々イメージが異なります。 ルーティングの定義はコードではなくテンプレート (CloudFormation) の側でやってしまうことになるので、Django や Flask などの Webアプリフレームワークはここにはまらず、デプロイツールとの組み合わせによって効率化を図るのが良いでしょう...というのが答えになると思います。 ※Zappa と呼ばれるデプロイツールがあり、これを使う場合ならば Django や Flask を書く要領でAPIを開発できます。よって、一応事例はゼロではないですが、私の把握する限り Zappa は主流の方法では全くないのでよほど強い動機がなければ Serverless Framework を使うのが良いと思います ※Serverless Framework の代替案としては、他に Terraform, AWS CDK などが挙げられます (2) LambdaでRestfulAPIを作成する時に一つのプロジェクトにAPIをまとめるのか、それともマイクロサービスみたいにプロジェクトを別々に分けた方が良いのでしょうか? Serverless Framework を使った開発であれば、1つのAPIサービス郡に対して1つのプロジェクト、という区切りが割と多いと思います。 その他 === API Gateway + lambda の構成を採る場合は1つの path に対して lambda 1本、という対応関係になるよう構築するのが普通です。なので、別の回答者様が仰る「デプロイパッケージサイズ」の問題は、よほど追加パッケージを入れない限りは心配ないと思います。 RDSとの相性が悪い点も、今はかなり解消されましたが別の回答者様が仰る通りです。基本的にはDynamoDBをバックエンドとして想定することになると思いますが、それが開発工数に対してどうか、という点は検討が必要になるでしょう。 また、別の問題として「同時実行数」の制限は少々気にする必要があると思います同じリージョンの中で、同時に実行状態になれるlambda functionのインスタンス数は上限があります(東京リージョンなら1000/1minぐらいだったと思います)。リクエストのピークが高いシステムで採用されるのであれば、非同期なAPI、アーキテクチャ設計によって対処する必要が出てきます。 社内でひっそり使う程度のものであれば、同時実行数の制限は特に問題はないと思います。個人的にはそのユースケースでもサーバーレス構成はよく使うので、できれば使ってみていただきたいですし、良さを体感してほしいなとは思っています(開発環境さえあれば、Hello world的なAPIなら5分でデプロイまでできてしまいます)。 しかし、よくある Web app + RDB な構成とはちょっと勝手が違うことも事実なので、もし開発工数見合なご事情があってのご質問であれば、EC2やECSを使うのが確実かと思います。