AWS Lambdaでストリームイベントのバッチサイズを変更する

AmazonLambda

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ストリーム系イベントソースのバッチサイズを変更するには?

DynamoDB/Kinesis Stream -> Lambda 連携を運用していて、スループットを上げるために、バッチサイズを上げたくなりました。

マネージメントコンソールから操作しようとすると、バッチサイズの変更画面が存在しないため、一度イベントソースを削除して作り直さなければいけません。 すると、ストリーム情報が失われるため、また一からレコードを再取得となり、ストリーム処理としては好ましくありません。

API UpdateEventSourceMapping を使うと、ストリームの位置を維持したまま、バッチサイズをオンラインで変更出来ます。 マニュアルから引用します。

This is useful if you want to change the parameters of the existing mapping without losing your position in the stream. http://docs.aws.amazon.com/lambda/latest/dg/API_UpdateEventSourceMapping.html

それでは、この変更手順を AWS CLI で確認しましょう。

AWS CLI から UpdateEventSourceMapping API を叩いてみる

まずは list-event-source-mappings で今の設定を確認します。

$ aws lambda list-event-source-mappings --function-name Food
{
    "EventSourceMappings": [
        {
            "UUID": "99999999-dddd-4444-8888-222222222222",
            "StateTransitionReason": "User action",
            "LastModified": 1441078911.0,
            "BatchSize": 100,
            "State": "Enabled",
            "FunctionArn": "arn:aws:lambda:ap-northeast-1:111111111111:function:Food",
            "EventSourceArn": "arn:aws:kinesis:ap-northeast-1:111111111111:stream/Demo",
            "LastProcessingResult": "OK"
        }
    ]
}

"BatchSize": 100 となっています。

$ aws lambda update-event-source-mapping でイベントソースのバッチサイズを500に変更します。 対象ソースは UUID で指定します。

$ aws lambda update-event-source-mapping \
  --uuid "99999999-dddd-4444-8888-222222222222" \
  --batch-size 500
{
    "UUID": "99999999-dddd-4444-8888-222222222222",
    "StateTransitionReason": "User action",
    "LastModified": 1441078933.47,
    "BatchSize": 500,
    "EventSourceArn": "arn:aws:kinesis:ap-northeast-1:111111111111:stream/Demo",
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:111111111111:function:Food",
    "State": "Updating",
    "LastProcessingResult": "OK"
}

State が Enabled から Updating に変更になりました。

もう一度 list-event-source-mappings API を叩いてイベントソースを確認してみましょう。

$ aws lambda list-event-source-mappings --function-name Food
{
    "EventSourceMappings": [
        {
            "UUID": "99999999-dddd-4444-8888-222222222222",
            "StateTransitionReason": "User action",
            "LastModified": 1441078970.0,
            "BatchSize": 500,
            "State": "Enabled",
            "FunctionArn": "arn:aws:lambda:ap-northeast-1:111111111111:function:Food",
            "EventSourceArn": "arn:aws:kinesis:ap-northeast-1:111111111111:stream/Demo",
            "LastProcessingResult": "OK"
        }
    ]
}

BatchSize は 500 で State は Enabled に戻りました。 更新完了です。

DynamoDB Stream の場合も、同じようにバッチサイズを変更できます。

UpdateEventSourceMapping API の制限

UpdateEventSourceMapping API で変更できるのは

  • バッチサイズ
  • イベントソースの有効/無効化

だけです。

  • ストリーム(Stream)
  • ストリーム起点の選び方(Trim Horizon/Latest)

を変更する羽目になったら、イベントソースを作り直しましょう。

References