サーバー構築不要なプログラムの実行環境を提供
AWS Lambda(以下Lambda)とは、サーバーを構築することなく直接プログラムコードを実行できるAWSのサービスです。アップロードしたコード(Lambda関数)が実行されている時間だけ課金される、従量制のサービスです。
従来のソフトウェア開発では、サーバー構築に必要なコンピュータの調達やOS、ミドルウェア、ライブラリのインストールなど、開発を始める前の環境構築に、コストと時間と手間がかかりました。Lambdaはそうした負担なく、Java、Go、PowerShell、Node.js、C#・Python、Rubyのコードを直接アップロードして実行できます。S3(ストレージ)やデータベース、Amazon API GatewayなどのAWS マネージドサービスと組み合わせることで、さまざまなシステムが構築できます。
Lambda以前とLambda以後で大きく変化したクラウドでの開発
Lambdaが登場したのは2014年です。コードをアップロードしてそのまま実行できるシンプルな仕組み、他のAWSサービスと簡単に連携できる統合性、必要な時に必要なリソースのみを利用できるコストパフォーマンスの良さ、といったポイントが大きなセンセーションを引き起こしました。「サーバーを意識せずにシステムを設計できる」をサービスとして初めて実現したLambdaの誕生は、サーバーレスアーキテクチャを一気に普及させました。社会がスマホ以前と以後で変化したように、クラウド上でのシステム開発はLambda前とLambda後で大きく変化しました。
クラウドの誕生は、サーバーやネットワークなどITインフラの調達にかかる金銭的・時間的コストを大きく下げました。サーバーレスはさらにもう一つ上のレイヤーとなるITシステムの構築運用の手間とコストを引き下げ、ソフトウェア開発者は開発だけにフォーカスしてエンジニアリング作業ができます。このことが、開発をスピーディかつ低コストで進めたいチームにとって強い味方となり、新たなアイデアを元にしたインターネットサービスを提供するスタートアップが数多く誕生する下地にもなりました。
AWSは、サーバーレスサービスとしてさまざまなサービスを提供しています。Lambdaを中心としてそれらを組み合わせることで、EC2を利用しなくてもほとんどのシステムがサーバーレスで構築可能となっています。
<Lambda以外のサーバーレスサービスの例>
機能 | サービス名 |
ストレージ | AWS S3 |
APIゲートウェイ | AWS API Gateway |
データベース | Amazon DynamoDB |
メッセージングサービス | AWS SQS |
認証サービス | AWS Cognito |
モニタリング | AWS CloudWatch |
Lambdaの特徴
コード実行時間だけの課金: LambdaはLambda関数の実行時間とメモリ使用量に基づき課金されます。100ミリ秒単位でCPUが動いている時間だけ精算されるので、非常に細かい粒度でコストを管理できます。対して、EC2の場合は、インスタンスが起動している時間単位で課金され、その中にはサーバーのセットアップにかかる時間や、プログラムを実行せず待機している時間も含まれます。多くのユースケースでEC2よりもLambdaの方が安くなりますが、特に利用量が変動するアプリケーションやバッチ処理でコスト削減効果が高くなります。
インフラ管理不要:OSやソフトウェアのバージョン管理、セキュリティパッチの適用などのサーバー管理やプロビジョニング、障害対応など、インフラ管理は全てAWSが行いますので、開発者はアプリケーションのロジックにフォーカスできます。AWSのグローバルインフラ上に構築されているので、可用性や耐障害性も高くなっています。
スケーリング不要:EC2は重い処理やアクセスの集中などが発生した場合はインスタンスの多重化などのスケーリングが必要でした。Lambdaは負荷に応じて自動的にスケールアップ・スケールダウンするので、ユーザーがスケーリングを気にする必要がなくなります。
Lambdaのメリットを最大に引き出すには
オンプレミスからクラウド(仮想サーバー)への移行メリットは、ハードウェアの管理が不要になることでした。仮想環境への移行にあたって、ソフトウェアの設計を変える必要はありません。
対して、Lambdaの場合、ソフトウェアの入れ物であった「サーバー」そのものがなくなりますので、今までのようにサーバー上でソフトウェアを動かすイメージでシステムを設計すると、サーバーレスのメリットを引き出すことが難しくなります。
Lambdaのメリットを活かすためのキーワードは「クラウドネイティブ」です。管理せず、使うことにフォーカスすれば良い、というクラウド環境の特性を最大限に活用するには、マネージドサービスの中から必要な機能だけを選択してブロックのように組み合わせて使うサーバーレスアーキテクチャがマッチしています。
クラウド環境において既存のソフトウェア資産を活用することが前提となる条件ではEC2が適していますが、これからクラウド上で新規にシステムを開発する場合はLambdaを中心としたサーバーレスで開発することも良い選択肢の一つでしょう。
利便性が高く柔軟に利用できるLambdaですが、設計にあたっては制約事項を考慮する必要があります。代表的な例をいくつか紹介します。
1. 実行時間の制約
Lambdaでは、アップロードされた実行可能なコードを関数と呼びます。ひとつの関数の実行時間は最大15分までとなります。長時間の処理が必要な関数は、並列化や分散処理などを設計段階で考慮する必要があります。
2. メモリーの制約
Lambda関数の実行時に使用できるメモリーは10GB以内で設定する必要があります。メモリ制限を超えるとエラーになるので、大量のデータ処理やメモリ保有型タスクにはLambdaは向いていません。
3. 同時実行数の制約
初期値では、同時に実行できる関数は1アカウントあたり1,000が上限となります。大量のリクエストが発生するようなシステムでは、上限を超えないように調整するか、AWSに緩和申請が必要です。
4. デプロイメントパッケージサイズの制約
アップロードできるコードをまとめたZIPファイルのサイズは50MBまで(S3経由の場合250MBまで)、解凍後のサイズは512MBまでが制限となります。外部ライブラリーやデータを含む場合はサイズが大きくなりがちなので注意が必要です。
5. Lambda関数の状態保持ができない
Lambda関数はステートレスであり、関数間の状態保持ができません。必要な場合は、S3やDynamoDBなどの外部ストレージを利用して状態管理する必要があります。
こうした制約を考慮した設計やサービスの組み合わせを活用することで、Lambdaのメリットを最大限に引きだすことが可能となります。
まとめ
AWS Lambdaを利用することで、開発者はインフラを気にせず開発に集中できるようになり、インフラの調達、維持、管理に必要だったリソースを他に振り向けられるようになります。特に事業会社が内製化に取り組む際には、不足している人的リソースを開発そのものに集中できるLambdaとサーバーレスの利用は大きなメリットがあります。その際には、オンプレミスの延長ではなく、クラウドネイティブな思想で設計を進める必要があります。