Amazon Web Services ブログ

Kinesis と DynamoDB をイベントソースにする際の AWS Lambda の新しいスケーリング管理

AWS Lambda は、Amazon Kinesis Data StreamsAmazon DynamoDB ストリームのイベントソースで利用可能な、新しいスケーリングパラメータを導入しました。Parallelization Factor は、各シャードにおける Lambda 関数呼び出しの同時実行数を増やす設定を可能にします。このパラメータは、デフォルトでは 1 です。これによって、処理されるレコードの順序を保証しながら、シャード数を過大にスケールすることなく、より高速なストリーム処理が可能になります。

一般的な最適化のシナリオには、高トラフィックと低トラフィックの2つがあります。たとえば、オンラインビジネスでは、季節的なトラフィックの急増が発生する場合があります。この新しい機能は、今後のホリデーシーズンに向けてビジネスを適切に拡張するために役立ちます。

Parallelization Factor による高トラフィックの処理

A diagram showing how Parallelization Factor maintains order.

各シャードには、一意に識別された一連のデータレコードが格納されています。各レコードには、順序を保証するパーティションキーが含まれており、そのキーに基づいて個別のシャードに振り分けられるように構成されています。同じパーティションキーを持つレコードを順序通りに処理するには、各シャードのレコードをポーリングする必要があります。

大量のデータトラフィックがある場合には、できるだけ早くレコードを処理する必要があります。このリリース以前は、Kinesis Data Streams のシャード数を更新することで、この問題を解決していました。シャード数を増やすと、シャードに対してデータを処理する関数の数が増えます。1つの Lambda 関数呼び出しは、一度に1つのシャードを処理します。

そこで、新しい Parallelization Factor パラメータを使用して、Lambda が単一のシャードからポーリングする際の同時実行数を指定できるようになりました。 この機能により、 Lambda と Kinesis のスケーリングオプションがより柔軟になります。デフォルトの係数である 1 は、今までと同じ動作を表します。係数が 2 の場合、例えば、100個の Kinesis Data Streams のシャードに対して最大200回の同時呼び出しが可能になります。Parallelization Factor は 10 までスケールできます。

並列化された各シャードには、同じパーティションキーを持つレコードが含まれます。つまり、同一のパーティションキーではレコード処理の順序が維持され、並列化された各シャードにおいては、次のデータを処理するためには前のデータ処理を完了する必要があります。

Parallelization Factor の利用

Parallelization Factor はイベントソースマッピングにすぐに設定されるため、オンデマンドで増減させることができます。こうして、ストリーム処理において完全に自動化されたスケーリングが可能になりました。

例えば、Amazon CloudWatch を使用してトラフィックの変化を監視できます。トラフィックが多いと、IteratorAge メトリクスが増加し、一定の期間で続いた場合にはアラームを発報できます。アラームは、UpdateEventSourceMapping API を使用して Parallelization Factor を増やす Lambda 関数をトリガーできます。同様に、トラフィックが減少した場合には Parallelization Factor を減らすようにアラームを設定することもできます。

AWS Lambda のコンソール上で、Kinesis または DynamoDB のイベントソースを作成または更新することで、Parallelization Factor を有効化できます。[追加設定] を選択し、Concurrent batches per shard を目的の係数(1~10)に設定します。

Configuring the Parallelization Factor from the AWS Lambda console.

AWS Lambda のコンソール上での Parallelization Factor の設定

また、AWS CLI でイベントソースマッピングを作成または更新するときに、--parallelization-factor パラメータを使用してこの機能を有効にすることもできます。

$ aws lambda create-event-source-mapping --function-name my-function \
--parallelization-factor 2 --batch-size 100 --starting-position AT_TIMESTAMP --starting-position-timestamp 1541139109 \
--event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream
{
	"UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
	“ParallelizationFactor”: 2,
	"BatchSize": 100,
	"MaximumBatchingWindowInSeconds": 0,
	"EventSourceArn": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream",
	"FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
	"LastModified": 1541139209.351,
	"LastProcessingResult": "No records processed",
	"State": "Creating",
	"StateTransitionReason": "User action"
}

Batch Windowによる低トラフィックの処理

以前は、Batch Size を使用して、少量のデータを処理したり、あるいは処理時間に機微ではないタスクを処理したりすることができました。Batch Size は、シャードから読み取るレコード数を最大10,000までの値で設定します。 1回の呼び出しにおけるペイロードの制限は6MBです。

9月には、Batch Window の機能を発表しました。これにより、Lambda 関数が呼び出されるタイミングを微調整できます。通常では、Lambda は特定の間隔で Kinesis Data Streams からレコードを読み取ります。この機能は、データが疎で、バッチの作成に時間がかかる場合に最適です。

Batch Window を使用すると、バッチが作成されるまで最大300秒待機するように関数を設定できます。つまり、ペイロードサイズが制限に達したり、バッチのサイズが最大値に達した場合など、特定の条件で処理を実行するように関数を設定できます。Batch Window を使用すると、各呼び出しで関数によって処理されるレコード数の平均を管理できます。これによって、各関数における処理の効率を高め、関数呼び出しの総数を減らすことができます。

Batch Window は、AWS Lambda のコンソール上で新しいイベントトリガーを追加するときに設定できます。

Adding an event source trigger in the AWS Lambda console

AWS Lambda のコンソール上でのイベントソースの追加

また、AWS CLI で --maximum-batching-window-in-seconds パラメータを使用して設定することもできます。

$ aws lambda create-event-source-mapping --function-name my-function \
--maximum-batching-window-in-seconds 300 --batch-size 100 --starting-position AT_TIMESTAMP --starting-position-timestamp 1541139109 \
--event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream
{
	"UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
	"BatchSize": 100,
	"MaximumBatchingWindowInSeconds": 300,
	"EventSourceArn": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream",
	"FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
	"LastModified": 1541139209.351,
	"LastProcessingResult": "No records processed",
	"State": "Creating",
	"StateTransitionReason": "User action"
}

まとめ

Amazon Kinesis および Amazon DynamoDB ストリームの処理において、スケールを管理するための新しいオプションが追加されました。Batch Window パラメータを使用すると、バッチを処理するまでの待機時間を調整できます。トラフィックが少ない場合や、時間に依存しないタスクに最適です。Parallelization Factor パラメータを使用すると、シャード毎に並行した Lambda 関数呼び出しを利用して、順序付けされた大量のレコードを高速にストリーム処理できます。どちらの機能も、ストリーム処理をより効率的に行うために役立ちます。

原文: New AWS Lambda scaling controls for Kinesis and DynamoDB event sources
翻訳: ソリューションアーキテクト 山﨑