Kinesisの刃 無限Lambda列車編

記事タイトルとURLをコピーする

f:id:swx-matsui:20211104151007p:plain

こんにちは!サーバーワークスの松井です!

今回は少し奇怪な現象が起こったので記事にしたいと思います。

奇怪な現象というのは、Lambdaが無限の眠りについてしまったということなんです。

Kinesis Data StreamsをトリガーにLambdaを実行していた時のことでした。

f:id:swx-matsui:20211103111827p:plain

Kinesis Data Streamsにランダムなデータを流しこんで新しいデータが入ってくるたびにLambdaがメッセージを処理するという仕組みにしていました。

流していたメッセージの一例

{
    "ONDO": [
        {
            "SAUNA": 40,
            "WATER": 17
        },
    ],
    "TIMESTAMP": "20xx-10-xxT13:52:16"
}

いつもなら新しいデータをどんどん処理してくれるのですが、ある時Lambdaのプログラムを改修した際にエラーが起こるようになってしまいました。

それ以降Lambdaはエラーになった際と同じタイムスタンプを持ったデータを永遠に取り込んで処理し、新しいメッセージを受け取らなくなってしまいました。

Lambdaのコンテナが再利用されているのかと思いきや再デプロイをしてもまったく変化はありません。

Lambdaがの中へ行ってしまいました....

調査結果

レコードの最長有効期間という項目があることが判明しました。

f:id:swx-matsui:20211103113330p:plain

Lambda が処理のために関数に送信するレコードの最長有効期間です。有効期間は最長 604,800 秒(7 日間)まで設定でき、-1 を入力すると最長有効期間の制限を解除できます。

この値はデフォルトで-1となっており、これが原因でLambdaが無限に古い同じレコードを無限に処理するという現象が起こってしまっていたわけです。

解決策

原因がわかったところで、さあ鬼退治をしましょう。

トリガーの再作成を実施します。

レコードの最長有効期間を例えば60秒に指定してやります。

すると再びLambdaは新しいKinesis Data Streams内のレコードを取りに行くようになりました。

AWSドキュメントにはレコードの最長有効期間について特に詳しい記載はないので同じ現象にあった時はこの記事を参考に設定を見直してみてください。

AWS Lambda は Kinesis および DynamoDB イベントソースの障害処理機能をサポートします

レコードの最大有効期間 Lambda 関数は、最大レコード経過時間 (60 秒から 7 日間まで設定可能) に達したときにデータレコードの処理をスキップできます。

※以下正式名称(記事では略称にて記載)
AWS Lambda
Amazon Kinesis Data Streams

松井 宏司

アプリケーションサービス部

AWS認定11冠

好きなお笑い芸人:トム・ブラウンとハイツ友の会