はじめに
今回は、下記イベント配信失敗時の動作確認をしてみます。
動作確認
いくつかのケース動作確認してみます。
ターゲット先のLambdaが失敗したとき
まず、常に例外が発生するLambdaをターゲットに指定して、動作確認してみます。
def lambda_handler(event, context):
# ゼロ除算エラーを発生させる
result = 1 / 0
return {
"statusCode": 200,
}
配信自体は完了。FailedEntryCountは0です。
ターゲットの処理は非同期処理のため、処理結果までは見ていない模様です。
{
"FailedEntryCount": 0,
"Entries": [
{
"EventId": "3205b679-d932-b5d5-bd08-c251b967029b"
}
]
}
対象のルールにDLQの配信設定をしているのですが、DLQの配信がされていません。
Lambdaログを見てみると、2回呼び出しがされています。
START RequestId: 9aee35c5-4a3b-4686-9c3d-ca70e99ed419 Version: $LATEST
START RequestId: 9aee35c5-4a3b-4686-9c3d-ca70e99ed419 Version: $LATEST
これはLambda側の非同期呼び出しの仕組みが適用されている模様です。
Lambda側の非同期呼び出し失敗時にDLQには配信されてました。
なお、Lambda側の非同期処理については、以前まとめているので紹介しておきます!
ターゲットの呼び出しに失敗したとき
次はターゲットの実行ルールをからラムダの実行権限を除き、そもそも実行できないようにしてみます。
この場合でも、FailedEntryCountは増えません。
{
"FailedEntryCount": 0,
"Entries": [
{
"EventId": "4bd6d9fa-14ee-bf55-8d0d-25a3ce7f7599"
}
]
}
ただし、DLQにはメッセージが配信されています。
メッセージを見てみると、Lambdaの実行権限がないよ!的な内容がわかります。
またDLQ配信時には、InvocationsSentToDlq
のメトリックスが発行されるみたいです。
イベントとして認識できないデータを送った時
次はペイロードからSource
、DetailType
を除き、イベントとして成立していないデータを送ってみます。
aws events put-events \
--entries '[{
"Detail": "{\"instance-id\": \"i-abcd1111\", \"state\": \"running\"}",
"EventBusName": "arn:aws:events:ap-northeast-1:xxxxxxxxxxxx:event-bus/default"
}]' \
--region ap-northeast-1
FailedEntryCountが1になり、エラー内容が表示されるようになりました。
{
"FailedEntryCount": 1,
"Entries": [
{
"ErrorCode": "InvalidArgument",
"ErrorMessage": "Parameter Source is not valid. Reason: Source is a required argument."
}
]
}
なお、DLQへの配信はありません。
どのルールにも一致しないイベントを送ってみる。
最後に、Source
、DetailType
がいずれのルールにも一致しないイベントを送ってみます。
FailedEntryCountは0、DLQ配信も無しでした。
{
"FailedEntryCount": 0,
"Entries": [
{
"EventId": "1dc41457-f6dd-68f7-d29b-9011a24f901c"
}
]
}
この挙動については、明記がされていました。
まとめ
各種動作確認をして以下のような感じになってそうです。
- イベントの配信自体ができなかった場合
- FailedEntryCountに加算
- イベントの配信はできたが、ターゲットへの配信ができない場合
- FailedEntryCountに加算無し。DLQ配信あり
- イベント、ターゲットへの配信はできたが、ターゲットがエラー
- FailedEntryCountに加算無し。DLQ配信無し
- ターゲット側の再試行ポリシーに従う。
- FailedEntryCountに加算無し。DLQ配信無し
ただ、イベントブリッジ側の再試行の動作確認ができなかった事が残念です。
ドキュメントを読む限り、ネットワークエラーなどリトライで成功する見込みがあるエラーのみ、再試行がされるようです。