AWS Lambda 対 Amazon EC2:どちらを選ぶべきか?
Amazonは、数十種類に上り、その数は増え続けている多様なクラウドサービスを提供する主要企業の1つです。Amazon EC2はAmazonのサービスの中でも最も人気のあるものの1つであり、2006年に発表されたAmazonのクラウドコンピューティングプラットフォームの中核をなしています。現在、Amazon EC2は広く利用されていますが、Lambda(2014年に導入)と呼ばれる別のAmazonサービスの人気も高まっています。 本日のブログ記事では、AWS LambdaとEC2のプラットフォームを比較し、皆様の環境に適した選択ができるようお手伝いします。
AWS EC2とは?
AWS EC2(Amazon Web Services Elastic Compute Cloud)は、クラウド上で"EC2インスタンス"と呼ばれる仮想マシンを利用し、スケーラビリティを実現するサービスです。ディスク容量、CPU性能、メモリなどを、必要に応じていつでも変更できます。LinuxやWindowsなど、必要なオペレーティングシステム(OS)がプリインストールされたベースイメージを選択し、ほとんどのOS設定の構成やカスタムアプリケーションのインストールを行うことができます。 Amazon EC2インスタンスにはルートアクセス権があり、追加のユーザーを作成することも可能です。必要なすべての管理を行い、インスタンスの再起動やシャットダウンを含め、EC2インスタンスを完全に制御できます。AWS EC2ウェブサービスは、"Infrastructure as a Service(IaaS:インフラストラクチャ・アズ・ア・サービス)"に分類されます。AWS EC2はクラウドホスティングに利用でき、クラウド上に仮想マシン(インスタンス)としてサーバーを展開することができます。
AWS Lambda とは何ですか?
AWS Lambda は、Java、JavaScript、Python といったサポートされているプログラミング言語のいずれかで記述されたコードを、イベントに紐付けられたトリガーが発動した際に実行できるコンピューティングプラットフォームです。作成したアプリケーションを実行するために、仮想サーバーや環境を設定する必要はありません。プログラムコード(いわゆる ラムダ関数 (この場合)AWS Lambda インターフェースで、Lambda 関数をイベントに関連付け、サーバーの管理や環境設定を気にすることなく、必要に応じてクラウド上でアプリケーションを実行できます。これにより、サーバーの管理ではなくアプリケーションの開発に集中できます。これが、AWS Lambda が サーバーレス。
アプリケーションが実行されるきっかけとなるイベントとしては、Amazon S3 バケットへのファイルのアップロード、DynamoDB テーブルへの変更、API Gateway サービスへの HTTP リクエストの受信などが挙げられます。イベント発生時に関数が実行されるように設定すると、新しいイベントが発生するたびにアプリケーションが自動的に実行されます。
分類に関しては、LambdaはAmazonによるFunction as a Service(FaaS)の実装です。以下の表では、物理サーバーの使用から始まる各サービスタイプの管理レベルを確認し、比較することができます。最も低いレベル(ユーザーによる管理が必要)は緑色で、より高いレベル(プロバイダーによる管理が提供される)は青色で示されています。したがって、物理サーバーを使用する場合、ハードウェアおよびそれより上のすべてのレベルを管理することができます。 AWS EC2などのInfrastructure as a Service(IaaS)を利用する場合、提供された仮想マシン(EC2インスタンス)上のオペレーティングシステムを管理できます。Platform as a Service(PaaS)レベルでは、実行前にコンパイルが必要なアプリケーションを実行できます。 AWS LambdaなどのFunction as a Service(FaaS)を利用する場合、アプリケーションをコンパイルする必要はなく、MSP(マネージドサービスプロバイダー)が提供するインターフェースにコードを記述するだけで済みます。表で比較対象として挙げられているSaaS(Software as a Service)では、シンクライアントやWebブラウザを使用して、クラウド上の既製アプリケーション(ベンダーが作成したアプリケーション)を利用するのみとなります。
AWS EC2 対 Lambda:活用事例
AWS EC2は、このサービスを利用する際にほぼすべての設定が可能であるため、幅広いユースケースがあります。AWS EC2の最も一般的なユースケースは以下の通りです:
- ウェブサイトのホスティング
- アプリケーションや複雑な環境の開発およびテスト
- ハイパフォーマンス・コンピューティング
- 災害復旧
AWS Lambda の一般的な利用例:
- タスクの自動化
- Amazon S3 にアップロードされたオブジェクトの処理
- リアルタイムログ分析
- データのリアルタイムフィルタリングと変換
具体的な例を考えてみましょう。あなたのウェブサイトが、画像、動画、音声ファイルなどのコンテンツを保存するためにAmazon S3バケットを使用していると仮定します。新しい画像や動画ファイルがアップロードされると、ウェブページ用に、フルサイズの画像や動画ファイルへのリンクとして使用されるプレビュー画像を作成する必要があります。プレビュー画像を手作業で作成するのは、退屈で時間のかかる作業になりがちです。 このような場合、アップロードされた画像に基づいて自動的に画像のサイズを変更し、その画像の名前を変更して、適切なディレクトリに保存するLambda関数を作成することができます。このLambda関数は、Webサイトで使用しているAmazon S3バケットに元の画像ファイルがアップロードされた直後に実行されるように設定できます。
AWS EC2 対 Lambda:動作原理
EC2. ご存じの通り、AWS EC2 を使用する際は、EC2 インスタンスと呼ばれる仮想マシン(VM)を操作します。EC2 インスタンスには、仮想ハードウェア(仮想ディスク、ネットワークインターフェース、プロセッサ、メモリ)を追加できるほか、VM インスタンスの起動、停止、再起動を行うこともできます。EC2 インスタンスでは、Elastic Block Storage(EBS)と S3 バケットという 2 種類のストレージを利用できます。 OSがインストール済みの事前構成済みイメージを使用したり、カスタマイズしたAmazon Machine Image(AMI)を作成したりすることができます。EC2クラウドサービスは、自動スケーリングとロードバランシング機能を提供します。EC2インスタンスは、S3、ECS、Route53、CloudWatchなど、他のほとんどのAmazon Web Servicesと連携して動作させることができます。.
ラムダ. AWS Lambda を使用する場合、アプリケーション(Lambda 関数)は、ユーザーにとってシームレスなコンテナ内で実行されます。このコンテナには、コードとライブラリが含まれています。リソースはアプリケーションのニーズに応じて Amazon によって提供され、スケーリングは自動的かつシームレスに行われます。アプリケーションを実行しているコンテナも、そのコンテナが実行されている EC2 インスタンスも、ユーザーが制御することはできません(Amazon Lambda ユーザーには基盤となるインフラストラクチャへのアクセス権がないため、これらに関する情報は一切得られません)。 上の表を参照してください。
AWS Lambdaは、アプリケーションを表すコードを実行するためにコンテナを使用する、EC2 Container Service(ECS)のフレームワークと見なすことができます。各コンテナのライフサイクルは短いです。実行中のLambda関数はその状態を保存しません。結果を保存したい場合は、Amazon S3バケットなどのデータストレージに保存する必要があります。 Lambda関数に対して、たとえばAmazon RDS(Amazon Relational Database Service)に接続するためなどに、仮想ネットワークを設定することが可能です。Lambdaは、レイヤー、関数環境、ハンドラーという複数の部分で構成されています。トリガーはLambdaを起動する要素です。Lambdaは、トリガーからのクエリによって実行される単一の関数です。
利用可能なトリガーの完全なリスト:
- APIゲートウェイ
- AWS IoT
- Alexa Skills Kit
- Alexa スマートホーム
- アプリケーション・ロード・バランサー
- CloudFront
- CloudWatch Events
- CloudWatch Logs
- CodeCommit
- Cognito Sync トリガー
- DynamoDB
- キネシス
- S3
- SNS
- SQS
API Gateway は、開発者がさまざまな非 AWS アプリケーションを AWS アプリケーションやその他のリソースに接続できるようにする特別なサービスです。
AWS EC2 対 Lambda:バージョン/スナップショット
EC2. 複雑なシステムである スナップショット AWS EC2インスタンスのEBS(Elastic Block Storage)ボリュームで利用可能です。増分スナップショットを作成したり、 必要な状態に戻す EC2インスタンスの。マルチボリュームスナップショットは、複数のEBSボリュームを使用するデータベースなど、重要なワークロードに利用できます。
ラムダ. Lambda 関数の管理を容易にするため、便利なバージョン管理システムがサポートされています。アップロードしたコードの各コピーにバージョン番号を割り当て、そのバージョンに対応するエイリアスを追加することができます。バージョン番号は 1 から始まり、順次増加していきます。例えば、Lambda 関数をアルファ版、ベータ版、本番環境版などに分類することができます。Amazon Resource Name(ARN)は、公開時に各 Lambda 関数のバージョンに割り当てられ、後から変更することはできません。
AWS EC2 対 Lambda:セキュリティ
EC2. EC2インスタンスおよびインスタンス内のすべてのコンポーネントについては、ご自身で管理する必要があります。EC2インスタンスのファイアウォールは手動で設定可能です。Amazonでは、クラウド上のEC2インスタンスのトラフィックを制御し、セキュリティを確保するためのVPC(Virtual Private Cloud)ファイアウォールを提供しています。 EC2インスタンス向けに、ウイルス対策ソフトウェアを手動でセットアップおよび設定したり、IAMロールを作成したり、権限を指定したり、セキュリティグループを作成したりすることができます。AWS Systems Manager Patch Managerを使用すると、OSの更新プログラムやセキュリティパッチを自動的にインストールできます。パッチや更新プログラムをインストールする前にスナップショットを作成するようにAWSを設定し、問題の発生を防ぐことも可能です。必要に応じて、EC2インスタンスにアクセスするためのキーペアを作成してください。AWS Lambdaを使用する場合に比べ、AWS EC2を使用する際はセキュリティに一層注意を払う必要があります。
ラムダ. Lambda がデフォルトでアクセスできる AWS サービスには、アクセス権限が設定されています。IAM ロールは、Lambda 関数で利用可能にする必要があるサービスを定義するために使用されます。 各Lambda関数について、その関数が実行される際に代弁するIAMロールを設定する必要があります。つまり、IAMロールを設定することで、キーやその他の認証パラメータを使用せずに、定義されたAmazonサービスにLambda関数を接続できるようになります。
KMSキーを使用して、Lambda関数とS3の間、およびAPIゲートウェイとLambdaの間で暗号化を設定することが可能です。 Lambda関数を作成すると、デフォルトの暗号化キーが作成されます。ただし、独自のKMSキーを作成することを推奨します。
EC2インスタンスと比較して、Lambda関数にはセキュリティ更新やパッチの適用が不要です。基盤となるコンテナやオペレーティングシステムは、Amazonによって自動的に更新されます。これが、セキュリティの観点からLambda関数を利用するメリットです。
AWS EC2 対 Lambda:パフォーマンスと可用性
EC2. EC2インスタンスの電源を入れた後、そのインスタンスは、手動で停止するか、シャットダウンタスクをスケジュールするまで実行され続けます。EC2インスタンスが実行中の場合、そのインスタンス上でアプリケーションはほぼ瞬時に実行されます。EC2インスタンスのパフォーマンスが許す限り、任意の数のアプリケーションを同時に実行することができます。EC2インスタンス上でアプリケーションを実行することは、1日を通して定期的にアプリケーションを実行する必要がある場合に適したソリューションです。
ラムダ. Lambda関数は常に利用可能ですが、常時実行されているわけではありません。デフォルトでは、Lambda関数は非アクティブ状態です。イベントに紐付けられたトリガーが作動すると、アプリケーション(Lambda関数)が起動します。Lambda関数の実行可能時間(タイムアウト)は、最大900秒(15分)に制限されています。 したがって、AWS Lambda で長時間実行されるアプリケーションを実行することは推奨されません。正常に完了するまでに 900 秒以上かかるアプリケーションや、実行時間が変動するアプリケーションを実行する必要がある場合は、AWS EC2 の使用を検討してください。実行中の Lambda 関数に対するもう 1 つの制限は、最大メモリ量が 3008 MB であることです。
リージョンによっては、1000 ~ 3000 の Lambda インスタンスを同時に実行できます。 より多くのインスタンスを同時に実行したい場合は、AWSサポートにお問い合わせください。
AWS Lambdaでは、リクエストの送信からアプリケーションの実行までの遅延が最大100ミリ秒生じますが、EC2インスタンス上で実行されるアプリケーションにはこのような遅延はありません。100msは長い時間ではありませんが、アプリケーションの種類によっては、この時間が決定的な要因となる場合があります。 アプリケーションがAmazon S3バケットからデータをダウンロードする必要がある場合、アプリケーションの実行までにさらに1~3秒かかる可能性があります。AWS Lambdaを使用してアプリケーションを実行する計画を立てる際は、この遅延時間を念頭に置いてください。
コールドスタートアップ時間は、Lambda関数の欠点の一つです。 レイテンシーは、関数が長期間実行されていない場合に発生し、Amazon Cloud上でコンテナを起動して関数を実行するのに時間がかかるためです。ワークロードにばらつきがあり、1日のうち異なる時間帯にアプリケーションを実行する必要があり、アプリケーションの実行間に長い休止期間がある場合には、AWS Lambdaを使用してアプリケーションを実行するのが良い解決策となる可能性があります。
AWS Lambda 対 EC2:料金体系
EC2とLambdaの両クラウドサービスは、従量課金制を採用しています。しかし、その詳細や違いについて考えてみましょう。
EC2. AWS EC2インスタンスが稼働している間は、関数やアプリケーションが実行されているかどうかにかかわらず、その時間分の料金が発生します。1時間あたりの料金は、EC2インスタンスが使用するCPU性能、メモリ容量、グラフィックカードの性能、およびストレージ容量によって決まります。定期的なリクエストの数が多いため、関数やアプリケーションを常に利用可能な状態にしておく必要がある場合、AWS EC2インスタンスを利用することが経済的に合理的である可能性があります。
ラムダ. アプリケーションの実行回数と、実行完了までに要した時間に応じて課金されます。アプリケーションの実行1秒あたりの料金は、そのアプリケーションに割り当てられたメモリ量に応じて決まり、1ギガバイト秒あたり0.00001667ドルです。アプリケーションの実行時間は、アプリケーションの開始から結果が返されるまで、またはタイムアウト後に停止するまでの間をカウントします。 時間は、100ミリ秒の倍数となる最も近い値に切り上げられます。オンデマンドでの可用性が必要な場合は、AWS Lambda を使用して関数やアプリケーションを実行する方が費用対効果が高い場合があります。
結論
AWS EC2は、従来のクラウドインフラストラクチャ(IaaS)を代表するサービスであり、EC2インスタンスをVMとして実行したり、環境を構成したり、カスタムアプリケーションを実行したりすることができます。
AWS Lambdaは、Amazonが提供するFunction as a Service(FaaS)であり、基盤となるインフラストラクチャを気にすることなくアプリケーションを実行できます。AWS Lambdaはサーバーレスアーキテクチャを提供し、イベントトリガーが作動した後にクラウド上でコードを実行することを可能にします。 AWS Lambda を使用すると、バージョン管理機能を備えた、スケーラブルで軽量かつ低コストな関数を利用できます。インフラストラクチャの設定ではなく、コードの記述に集中できます。
常に稼働している EC2 インスタンス上でアプリケーションのアイドル時間が長いと試算された場合は、AWS Lambda の利用を検討してください。AWS Lambda であれば、アプリケーションを実行するリクエストがない場合、アイドル時間の料金を支払う必要がありません。 アプリケーションの実行リクエストが定期的に多く発生する場合は、常時稼働しているEC2インスタンスにアプリケーションをデプロイする方が適している場合があります。
AWS EC2は、高性能なアプリケーション、長時間実行されるアプリケーション、および起動時に遅延が許されないアプリケーションの実行に適しています。AWS EC2インスタンスを使用する場合は、データ損失を防ぐためにバックアップを忘れないようにしてください。 NAKIVO Backup & Replication これは、VMware vSphere VM、Hyper-V VM、物理サーバーに加え、EC2インスタンスも保護できるオールインワンのデータ保護ソリューションです。
