サーバーレスのAWS FargateとAWS Lambdaの使い分けについて
はじめに
AWSのサーバーレスコンピューティングを利用する際に、いずれもサーバーレスの利点を提供するという共通点から、AWS FargateとAWS Lambdaのどちらを選択するか悩むことはないでしょうか。そこで本記事では、AWS FargateとAWS Lambdaの比較を行います。前半では、それぞれの概要と利点を紹介し、後半では、いくつかの項目で比較を行い、使い分けの例を紹介します。
AWS Fargateとは
AWS Fargateは、Amazon ECS(Dockerコンテナに対応したコンテナ管理サービス)とAmazon EKS(フルマネージドのKubernetes サービス)の両方で動作する、コンテナ向けサーバーレスコンピューティングエンジンです。 Amazon ECSとAmazon EKSはいずれも、AWS Fargateによってプロビジョニングされたコンテナを使用します。ユーザーは、スケーリング、負荷分散、コンテナ利用のためのスケジュール管理などをすることなく、コンテナをデプロイできます。
AWS Fargateの利点を紹介します。
サーバーレス
AWS Fargateを利用すると、ユーザーは、サーバーのスケーリングや、パッチ適用、保護、管理に関わる運用上の作業から解放されます。コンテナのみの操作で済むため、Amazon ECSもしくはAmazon EKSで実行するアプリケーションの構築と運用に集中することができます。また、コンテナが実行されるインフラストラクチャは、必要なパッチにより常に最新の状態に保たれます。
適切なサイズのリソース
AWS Fargateでは、ユーザーが指定したリソース要件に一致するように、コンテナに対してコンピューティングを起動し、スケーリングします。
設計段階からのワークロードの分離
各ECSタスクまたは各EKSポッドは、専用カーネルのランタイム環境でそれぞれ実行されます。リソース(CPUや、メモリ、ストレージ、ネットワーク)が他のタスクやポッドと共有されることはありません。これにより、各タスクまたは各ポッドでワークロードの分離とセキュリティの向上が可能となります。
他のAWSサービスやサードパーティ製ツールによるオブザーバビリティ
AWS Fargateでは、Amazon CloudWatch Container Insightsなどの他のAWSサービスと連携することで、すぐに利用できるオブザーバビリティを得ることができます。また、Prometheusのようなオープンなインターフェースを有する幅広いサードパーティ製ツールを介して、メトリックやログを収集し、アプリケーションをモニタリングすることができます。
AWS Lambdaとは
AWS Lambdaは、イベント発生時にアップロードされたコードを実行し、基盤となるコンピューティングリソースをAWS Lambdaが管理する、サーバーレスコンピューティングサービスです。AWS Lambdaは、例えば次の作業を行います。
- サーバーやOS管理
- キャパシティのプロビジョニングと自動スケーリング
- コードとセキュリティパッチのデプロイ
- モニタリングとロギング
そのため、AWS Lambdaを利用すると、こういった作業に煩わされることなく、コードを実行できます。それでは、AWS Lambdaの利点を紹介します。以下で登場するAWS Lambda関数とは、AWS Lambdaで実行するコードのことです。
他のAWSサービスとの拡張性
AWS Lambdaを使用すると、Amazon S3バケット、Amazon DynamoDBテーブルなどのAWSリソースにカスタムロジックを追加できます。AWS Lambda関数をトリガーする特定のAWSリソースを指定することで、リソースに変更があると、AWS LambdaはAWS Lambda関数を実行し、コンピューティングリソースを開始して管理し、受信リクエストに対応します。
カスタムバックエンドサービスの作成
AWS Lambdaを使用すると、アプリケーションに対する新規バックエンドサービスを作成し、Amazon API Gatewayで構築したLambda APIまたはカスタムAPIエンドポイントを使用してオンデマンドでトリガーできます。
複数のコードをサポート
AWS Lambdaでは、ネイティブライブラリも含め、サードパーティのライブラリを使用できます。AWS Lambdaは、Java、Go、PowerShell、Node.js、C#、Python、Rubyのコードをネイティブサポートしています。またLambda Runtime APIを利用すると、その他の言語を使用してAWS Lambda関数の作成をすることができます。
RDBへの接続
Amazon RDS プロキシを使用すると、RDBへの数千の同時データベース接続を効率的に管理し、スケーラブルで安全なAWS Lambdaベースのサーバーレスアプリケーションを容易に構築することができます。
ここで、Amazon RDS プロキシとは、Amazon RDS向けの高可用性フルマネージド型データベースプロキシで、アプリケーションの拡張性やデータベース障害に対する回復力と安全性を高めることができます。
パフォーマンスのきめ細かな制御
Provisioned Concurrency(プロビジョニングされた同時実行)により、サーバーレスアプリケーションのパフォーマンスを詳細に制御できます。Provisioned Concurrencyは、コードを変更することなく利用できます。コンピューティングリソースを管理することなく、必要に応じてレイテンシーの影響を受けやすいアプリケーションに、一貫したパフォーマンスを保持させることができます。
共有ファイルシステムへの接続
AWS Lambda向けAmazon EFSを利用すると、規模に関わらず、低レイテンシーで大量のデータの安全な読み取りや書き込み、保持が可能になります。一時ストレージにダウンロードするためのコードの記述は不要です。
AWS FargateとAWS Lambdaの比較
環境構築
AWS Fargate - コンテナベースのコンピューティングサービスであり、事前にバッチアプリケーションを含んだDockerイメージを用意する必要があります。
AWS Lambda - コードをアップロードすると、実行環境が構築され、イベント発生時にアップロードされたコードを実行します。
実行環境
AWS Fargate - ユーザーが用意したDockerコンテナを使用してアプリケーションを実行することができるため、開発言語に制限がなく、実行環境の構築の自由度が高いです。
AWS Lambda - 前述のように使用できるランタイムは決まっています。それ以外を使用するには、開始方法はシンプルですが、Lambda Runtime APIを利用してカスタムランタイムを構築する必要があります。
リソース
AWS Fargate - 割り当て可能なvCPUとメモリリソースの組み合わせは、用意されており、ユーザーはその中から選択します。vCPUは0.25 vCPUから4vCPU、メモリは0.5GBから30GBまであります。ただし、vCPUに対して選択可能なメモリは決まっており、0.25vCPUに30GBのメモリといった選択はありません。
AWS Lambda - AWS Lambda関数のメモリ割り当てや、AWS Lambda関数タイムアウトをはじめとする、AWS Lambda関数の設定、デプロイ、実行には制限があり、変更することはできません。
以上のように、AWS FargateとAWS Lambdaは一長一短であり、目的に応じた使い分けをおすすめします。
使い分けの例
AWS Fargate - 比較的大きな規模の処理への利用や、ウェブやモバイル、PaaSなどのプラットフォーム向けマイクロサービスバックエンドなどの長時間実行されるプロセスへの利用に最適です。
AWS Lambda - データの変更や、システム状態の変化、ユーザーによるアクションにリアルタイムに応答する必要があるイベントドリブンのアプリケーションへの利用や、小規模ですぐに動かした入り処理への利用に最適です。
まとめ
本記事では、サーバーレスという点で共通するAWS FargateとAWS Lambdaについて紹介し、両サービスの比較を行いました。一見、AWS Fargateは制限が少なく便利な一方で、AWS Lambdaは制限が多く扱いにくいように思うかもしれません。
しかし、Amazon DynamoDBやAmazon S3をはじめとする、複数のデータストアとの統合や、複数のイベントソースのサポートがされているAWS Lambdaでは、イベントドリブンのようなアプリケーションの利用に最適です。そのため、繰り返しになりますが、適材適所で目的に応じた使い分けをおすすめします。