EventBridgeのイベント配信失敗時の動作確認してみる。

## はじめに

今回は、下記イベント配信失敗時の動作確認をしてみます。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-rule-retry-policy.html

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-rule-dlq.html

## 動作確認

いくつかのケース動作確認してみます。

### ターゲット先のLambdaが失敗したとき

まず、常に例外が発生するLambdaをターゲットに指定して、動作確認してみます。

```Python
def lambda_handler(event, context):
    # ゼロ除算エラーを発生させる
    result = 1 / 0    
    return {
        "statusCode": 200,
    }
```

配信自体は完了。FailedEntryCountは0です。

ターゲットの処理は非同期処理のため、処理結果までは見ていない模様です。

```
{
    "FailedEntryCount": 0,
    "Entries": [
        {
            "EventId": "3205b679-d932-b5d5-bd08-c251b967029b"
        }
    ]
}
```

対象のルールにDLQの配信設定をしているのですが、DLQの配信がされていません。

![スクリーンショット 2025-02-26 3.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/f236672c-1840-441e-857d-bffe2dcbc015.png)

Lambdaログを見てみると、２回呼び出しがされています。

```
START RequestId: 9aee35c5-4a3b-4686-9c3d-ca70e99ed419 Version: $LATEST

START RequestId: 9aee35c5-4a3b-4686-9c3d-ca70e99ed419 Version: $LATEST
```

これはLambda側の非同期呼び出しの仕組みが適用されている模様です。

![スクリーンショット 2025-02-27 4.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/fba75c28-3a8c-4462-8e9e-55ff16bcd8f1.png)

Lambda側の非同期呼び出し失敗時にDLQには配信されてました。

![スクリーンショット 2025-02-27 4.16.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/e2b311f8-bd24-4592-966e-fcc252c5f8a0.png)

なお、Lambda側の非同期処理については、以前まとめているので紹介しておきます！

https://qiita.com/s_moriyama/items/731d3faebb7b313ee614

### ターゲットの呼び出しに失敗したとき

次はターゲットの実行ルールをからラムダの実行権限を除き、そもそも実行できないようにしてみます。

![スクリーンショット 2025-02-26 3.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/96df404a-312d-41a4-8540-9c2c965c94be.png)

この場合でも、FailedEntryCountは増えません。

```
{
    "FailedEntryCount": 0,
    "Entries": [
        {
            "EventId": "4bd6d9fa-14ee-bf55-8d0d-25a3ce7f7599"
        }
    ]
}
```

ただし、DLQにはメッセージが配信されています。

![スクリーンショット 2025-02-26 3.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/daea9ea0-0653-44c8-963c-8ea977f80dd3.png)

メッセージを見てみると、Lambdaの実行権限がないよ！的な内容がわかります。

![スクリーンショット 2025-02-26 3.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/05ca4634-fd77-45c5-a959-17f660419085.png)

またDLQ配信時には、`InvocationsSentToDlq`のメトリックスが発行されるみたいです。

![スクリーンショット 2025-02-27 3.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/24d4d900-8bf9-4270-91a2-1e2d76a40ac4.png)


### イベントとして認識できないデータを送った時

次はペイロードから`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"
        }
    ]
}
```

この挙動については、明記がされていました。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-putevents.html

![スクリーンショット 2025-02-27 4.33.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/eae7bcdf-bac9-45b3-8858-1f7ba2145939.png)

## まとめ

各種動作確認をして以下のような感じになってそうです。

* イベントの配信自体ができなかった場合
    * FailedEntryCountに加算
* イベントの配信はできたが、ターゲットへの配信ができない場合
    * FailedEntryCountに加算無し。DLQ配信あり
* イベント、ターゲットへの配信はできたが、ターゲットがエラー
    * FailedEntryCountに加算無し。DLQ配信無し
        * ターゲット側の再試行ポリシーに従う。


ただ、イベントブリッジ側の再試行の動作確認ができなかった事が残念です。

ドキュメントを読む限り、ネットワークエラーなどリトライで成功する見込みがあるエラーのみ、再試行がされるようです。