ここまでの説明でサーバレスアーキテクチャの概要は理解いただけたかと思います。ここからは、サーバレスアーキテクチャを代表するAWSのサービス、Lambdaを紹介します。
AWSには、Lambdaというイベントドリブンなマネージドサービスが存在し、「FaaS(Function as a Service)」などと呼ばれています。これはプログラムの実行環境がサービスとして提供されるもので、ユーザーはプログラムを用意しLambdaへデプロイするだけで実行できます。
Lambdaを利用することでサーバレスアーキテクチャの疎結合を、よりシームレスに実現できます。AWSの公式チュートリアルでも紹介されていますが、S3へ画像をアップロードした際に自動でサムネイル画像を用意したいユースケースがあったとします。これは以下の3つの手順で実現できます。
Lambdaには実行時間とメモリ割り当てに制限があり、実行時間の最大値は5分間で、メモリは1536MBまでとなっています。プログラムの実行中に、タイムアウトやメモリ上限を迎えた場合は、プログラムが強制終了します。そのため、1つのプログラム内で全てを処理しようとはせずに、複数のプログラムが次々と呼び出される構成が推奨されます。
例えば、「Amazon SES(Simple Email Service)でメールを受信したときにメールをデータベースへと登録し、『登録ありがとうございました』と自動応答メールを送信したい」とします。この場合には、「メールをデータベースへ登録する処理」と「自動応答メールの送信処理」の2つのLambdaプログラムを用意することが望ましいです。
Lambdaのイベントトリガーとして利用されるAWSサービスは下記の通りです(2017年2月現在)。
サービス | 概要 |
---|---|
S3 | オブジェクトの作成、更新、削除 |
DynamoDB | レコードの追加、更新、削除 |
Kinesis Streams | Kinesisストリームのレコード投稿 |
SNS(Amazon Simple Notification Service) | SNSトピックへのメッセージ発行 |
SES | メールの受信 |
Cognito | データセットの同期 |
CloudWatch Logs | ログの記録 |
CloudFormation | スタックの作成、更新、削除 |
CloudWatch Events | AWSリソースの状態変化(EC2の起動、停止など)、スケジュール |
Code Commit | ブランチやタグの作成、リソースのプッシュ |
Config | リソースの作成、削除、変更 |
API Gateway | HTTPSリクエスト |
Lambdaでは以下の言語が利用可能です(2017年2月現在)。
言語 | バージョン |
---|---|
Node.js | v0.10.36、v4.3.2(推奨) |
Java | Java 8 |
Python | Python 2.7 |
C# | .NET Core 1.0.1 |
ここまでLambdaの特徴や推奨する構成方法について説明しましたが、留意点についても説明しておきます。
Lambdaはコンテナサービスによって実現されています。そのため、「Lambda作成後の初回実行時」「プログラムや設定更新後の初回実行時」にプログラムのコンテナロード処理が走り、若干の遅延が発生します。
また、前回の実行からある程度時間が経過した後に再実行される場合にも、初回実行時同様にプログラムのコンテナロード処理が走ります。
コンテナロード処理が実行される間隔はAWSから公表されていませんが、定期的にLambdaを実行するポーリングの仕組みを導入することで、ある程度の改善は可能となります。
Lambdaにデプロイされたプログラム処理が失敗した場合、基本的には自動で3回再試行されます。再試行の条件は前述のタイムアウトやメモリ不足などが該当します。
LambdaをNode.jsで作成した場合に限り、「context.fail()」が呼び出されると処理が失敗したと判断され再試行が走ります。「context.done()」を呼び出すことで再試行せずに処理を終了することも可能です。再試行に伴う実行回数や実行時間も課金対象となるため、注意が必要です。
今回は、AWSとサーバレスアーキテクチャの概要とLambdaについて紹介しました。次回からは、Lambdaプログラムの作成方法とLambdaを活用したサーバレスアーキテクチャの構築方法について解説していきます。お楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.