AWS Lambdaでサーバーレスを始めよう
はじめに
サーバーの構築や管理、セキュリティの設定、モニタリングなどの運用・保守に関する作業が多くて開発作業に集中できないという悩みを持つ方も多いのではないでしょうか。そんな皆様にとって、AWS Lambdaは解決方法のひとつになる可能性を秘めています。今回は、AWS Lambdaは、どのような特徴を持ち、利用することでどのようなメリットが得られるのかをご紹介させていただきます。
AWS Lambdaとは
AWS Lambdaとは、AWSが提供するサーバーレスコンピューティングサービスです。まずは、その特徴やAmazon EC2との違いについて解説していきます。
AWS Lambdaの特徴
AWS Lambdaでは、プログラムの開発や実行のために必要なサーバーOSやアプリケーションサーバーソフトウェアの準備、および、サーバーやインスタンスを起動し続ける環境が用意されています。また、セキュリティの設定やモニタリング、パッチの適用などのメンテナンスもサービスに含まれます。その結果、ユーザーはサーバー構築や運用に関わる作業を行う必要がなく、実行するプログラムをLambda関数として作成・登録するだけでよくなり、プログラム開発作業に集中して取り組むことが可能になります。
AWS LambdaとAmazon EC2との違い
AWS Lambdaと、同じくAWSで提供されるクラウドサービスのAmazon EC2との違いは以下のようになります。
Amazon EC2
- クラウド上の仮想サーバーを提供
- 利用料金はサーバーを利用している時間で計算
- 実行環境の構築が必要
(仮想サーバー上にミドルウェア、アプリケーションをインストールするなど) - 継続的な運用保守が必要
(ソフトウェアのアップデートの適用、セキュリティ対策、リソース管理など)
AWS Lambda
- サーバーではなく、プログラムの実行環境を提供
- 利用料金はプログラムを実行している時間で計算
- 実行環境は提供されるため、実行環境の構築不要
- 運用保守はサービス内に含まれるため、運用保守が不要
上記のように、AWS LambdaはAmazon EC2と比較して、サービス内に提供される範囲が広く、環境の構築や運用保守などの手間を大幅に減らすことができます。
AWS Lambdaのメリット
AWS Lambdaには、以下のようなメリットがあります。
サーバーの構築や管理が不要
先述したように、AWS Lambdaでは、プログラムの実行環境が提供されるため、サーバーの構築や管理をする必要はなく、そのための工数を削減することが可能です。
自動スケーリング
AWS Lambdaには、アクセス数や負荷に応じて自動的に利用するサーバー数を増減するという自動スケーリング機能があります。これにより、ユーザーはサーバーを意識することなくプログラムを実行することが可能となります。
従量課金制
AWS Lambdaでは、リクエストに応じてプログラムを実行した回数と時間によって料金が発生し、待機時間には課金されないため、処理内容によっては大幅なコストダウンが可能です。また、月間100万リクエストまで、最大320万秒までのコンピューティング時間の無料枠があり、この無料利用枠は無期限で提供されています。
高いセキュリティ
AWS Lambdaでは、サーバーやプラットフォームが公開されていないため、脆弱性をついた攻撃がしづらくなっています。また、メンテナンスの時間帯や定期的なダウンタイムがありません。
多数のプログラミング言語に対応
AWS Lambdaは、Java、Go、PowerShell、Node.js、C#、Python、Rubyのプログラミング言語に対応しています。さらに、拡張機能を利用することで、Erlang、Elixir、COBOL、PHP、C++、Rustにも対応できます。
AWS Lambdaのユースケース
モバイルバックエンド/業務機能API
Amazon API Gatewayとともに使用し、Webサービスや業務システムのバックエンドとして、データベースへの読み書き、業務ロジックの実行、他システムやAPIの呼び出しなどの処理をします。AWS Lambda はWebサービスや業務システムから、Amazon API Gatewayを通じて起動され、処理の結果を返します。
IoTデータ処理
IoT機器からの情報のような今後増大が予測される情報を処理したり、機械学習による予測など、幅広い処理をAWS Lambdaによって実行可能です。
リアルタイムファイル処理
AWS Lambda をトリガーとし、Amazon S3とともに使用してアップロードしたデータを即座に処理することによって、画像のサムネイル作成、ビデオのコード変換、ファイルのインデックス作成、ログの処理、フィルタリングなどをリアルタイムで実行可能にします。
AWS Lambdaの対障害性
AWSのグローバルインフラストラクチャ(infrastructure)は、AWSリージョンとアベイラビティーゾーンを中心として構築されています。AWSリージョンには、低レイテンシー、高いスループット、そして高度の冗長ネットワークで接続されている複数の物理的に独立・隔離されたアベイラビリティーゾーンがあります。アベイラビリティーゾーンでは、アベイラビリティーゾーン間で中断することなく自動的にフェイルオーバーするアプリケーションとデータベースを設計および運用することが可能です。アベイラビリティーゾーンは、従来の単一、複数のデータセンターインフラストラクチャよりも可能性や耐久障害、およびに拡張性が優れています。Lambdaでは、AWSグローバルインフラストラクチャに加えて、データの耐障害性とバックアップのニーズに対応できるように複数の機能を提供しています。
1.バージョニング
バージョニングはLambdaで使用して、開発時に関数のコードと設定を保存できます。エイリアスと合わせてバージョニングを使用して、Blue/Greenデブロイおよびローリングデポロイを実行が可能です。
◆関数のバージョン ◆
バージョンを使用して、AWS Lambda 関数のデプロイを管理することが可能です。例えば、安定した実稼働バージョンのユーザーに影響を与えることなく、ベータテスト用の新しいバージョンの関数を公開が可能です。Lambda関数を公開するたびに、新しいバージョンの関数がシステムで作成されます。新しいバージョンは、関数の未公開バージョンのコピーです。関数のバージョンには、次の情報が含まれています。
- 関数コードを関連するすべての依存関数
- 関数を実行するLambdaランタイム
- 環境変数を含むすべての関数設定
- 関数のこのバージョンを識別する一意のAmazonリソースネーム(ARN)
関数コードと設定は、未公開バージョンの関数でのみ変更が可能です。バージョンを公開すると、そのバージョンのユーザーに一貫したエクスペリエンスを保証するためにコードとほとんどの設定がロックされます。
2.スケーリング
関数が前のリクエストを処理中にリクエストを受け取ると、Lambdaが関数のインスタンスを起動して、増大した負担を処理します。Lambdaは、自動的にスケーリングして、リージョンごとの1000同時実行を処理します。制限は、必要に応じて増やすことが可能です。
◆関数を設定する◆
初めて関数を呼び出すと、AWS Lambdaにより、関数のインスタンスが作成され、イベントを処理するためのハンドラーメソッドが実行されます。関数はレスポンスを返す時に、アクティブなまま待機した上で追加のイベントを処理します。最初のイベントの処理中に関数を再度呼び出すと、Lambdaは別のインスタンスを初期化し、関数は2つのイベントを同時に処理します。さらにイベントが入ってくると、Lambdaは使用可能なインスタンスにそれらを送信し、必要に応じて新しいインスタンスを作成します。リクエストの数が減ると、Lambdaは他の関数のスケーリングキャパシティを開放するため、使われていないインスタンスを停止します。
3.高可用性
Lambdaは、複数のアベイラビリティーゾーンで関数を実行し、1つのゾーンでサービスの中断が発生した場合にも、関数を設定をイベントの処理に使用できることを保証します。お客様アカウントでVirtual Private Cloud(VPC)に接続するように関数を設定する場合は、複数のアベイラビリティーゾーンでサブネットを指数することで、高可用性を確保します。
◆VPC内のリソースにアクセスするようにLambda 関数を設定する◆
アカウントのVirtual Private Cloud(VPC)のプライベートサブネットに接続するように関数を設定することが可能です。Amazon Virtual Cloud(Amazon VPC)を使用して、データベース、キャッシュインスタンス、または内部サービスなどリソースのプライベートネットワークを作成します。実行中にプリベートリソースにアクセスするには、関数をVPCに接続します。
4.リザーブド同時実行
関数が常にスケーリングして、追加リクエストを処理できるようにするため、関数に同時実行の予約が可能です。関数に予約された同時実行を設定することにより、指定した数の同時呼び出し数までスケーリングできますが、これを超えることはありません。これにより、利用できるすべての同時実行数が他の関数に消費されているために、リクエストを失うことがありません。
◆Lambda 関数の同時実行数の管理◆
同時実行数とは、ある時点で関数が処理しているリクエストの数を指します。関数が呼び出されると、Lambdaはその関数のインスタンスを割り当ててイベントを処理します。関数コードの実行が完了すると、別のリスエストを処理できます。リクエストの処理中に関数が再度呼び出されると、別のインスタンスが割り当てられるため、関数の同時実行が増えます。
同時実行数は、リージョン内のすべての関数で共有されるリージョンの制限の影響を受けます。関数の同時実行数が常に一定レベルになるように、関数に予約された同時実行数を設定が可能です。ある関数が予約された同時実行数を使用している場合、他の関数はその同時実行数を使用できません。予約された同時実行数は、関数の最大同時実行も制限し、関数全体(バージョンをエイリアスを含む)に適用されます。
Lambdaが関数のインスタンスを割り当てると、ランタイムは関数のコードをロードし、ハンドラーの外部で定義された初期化コードを実行します。コードと依存関係が大きい場合、または初期化中にSDKクライアントを作成する場合、このプロセスには時間がかかることがあります。関数がスケールアップすると、これにより、新しいインスタンスによって処理されるリクエストの部分は、残りの部分よりも、レイテンシーが長くなります。
レイテンシーの変動なしに関数をスケーリングできるようにするのは、プロビジョニングされた同時実行数を使用します。呼び出しの増加前にプロビジョニングされた同時実行数を割り当てることにより、すべてのリクエストが、非常に短いレイテンシーで、初期化されたインスタンスによって処理されるようにできます。プロビジョニングされた同時実行数は関数のバージョンまたはエイリアスに割り当てることが可能です。
LambdaはApplication Auto Scalingとも統合されます。スケジュールに従って、または使用率に基づいて、プロビジョニングされた同時実行数を管理するようにApplication Auto Scalingを設定が可能です。スケジュールされたスケーリングを使用し、ピークトラフィックを見越して、プロジョニングされた同時実行を増やします。必要に応じてプロビジョニング済み同時実行を自動的に増やすには、Application Auto ScalingAPIを使用してターゲットを登録し、スケーリングポリシーを作成します。
プロビジョニングされた同時実行は、関数の予約された同時実行数とリージョンの制限にカウントされます。関数のバージョンとエイリアスに割り当てたプロビジョニングされた同時実行数が、関数の予約された同時実行数に達すると、すべての呼び出しはプロビジョニングされた同時実行数を使用して実行されます。この設定には、非公開バージョンの関数($LATEST) をスロットリングする効果もあるため、その関数は実行されません。
5.非同期呼び出し
非同期呼び出しと、他のサービスによってトリガーされた呼び出しのサブセットの場合、エラー発生すると、Lambdaは再試行の間に遅延を置きながら、自動的に再試行します。関数を同期的に呼び出すその他のクライアントをAWSのサービスが、再試行の実行を担当します。
◆非同期呼び出し◆
Amazon Simple Storage Service(Amazon S3)やAmazon Simple Notification Service(Amazon SNS)など、AWSのいくつかのサービスでは、関数を非同期的に呼び出してイベントを処理します。関数を非同期的に呼び出す場合は、関数コードからのレスポンスを待機しません。イベントをLambdaに渡すと、Lambdaが残りを処理します。Lambdaでエラーを処理する方法を設定し、呼び出しレコードをダウンストリームのリソースに送信して、アプリケーションのコンポーネントを連鎖させることが可能です。
6.デッドレターキュー
非同期呼び出しでは、すべての再試行に失敗した場合、Lambdaを設定してデッドレターキューにリクエストを送信することが可能です。デッドレターキューは、Amazon SNSのトピックまたはトラブルシューティングまたは再処理のためにイベントを受信するAmazon SQSキューです。
◆Lambda 関数のデッドレターキュー◆
障害発生時の送信先に代わる方法として、配信不能キューを使用して関数を設定し、破棄されたイベントを保持してさらに処理が可能です。配信不能キューは、イベントがすべての処理試行に失敗した場合や処理されずに期限ぎれになった場合に使用されるという点で、障害発生時の送信先と同じように動作します。ただし、配信不能キューは関数のバージョン固有の設定の一部であるため、バージョンを公開するとロックされます。また、障害発生時の送信先は、追加のターゲットをサポートし、関数のレスポンスに関する詳細を呼び出しコードに含めます。
まとめ
AWS Lambdaについて、特徴やメリット、ユースケースなどをご紹介しました。AWS Lambdaを利用することで大幅にサーバー構築・運用の手間が削減されることがおわかりいただけたのではないでしょうか。サーバーレスコンピューティングにご興味がある方は是非ご検討してみてください。