AWS コマンドライン (AWS CLI) を使用して作成した Amazon EventBridge ルールが AWS Lambda 関数を呼び出さないことについてのトラブルシューティングをしたいです。
簡単な説明
次の手順を使用して問題を特定します。
- イベントソースがイベントを公開し、関連する Amazon EventBridge ルールをトリガーしたかどうかを確認します。
- EventBridge ルールが設定されたターゲットを呼び出したかどうかを確認します。
- ターゲットの呼び出しに失敗した場合は、AWS Lambda 関数のリソースポリシーに適切なアクセス権限があるかを確認してください。
解決策
**注:**AWS CLI コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用しているか確認してください。
EventBridge ルールの CloudWatch メトリクスを確認する
- Amazon CloudWatch コンソールを開きます。
- 左側のナビゲーションペインの [指標] で、[すべての指標] を選択します。
- AWS/イベント名前空間を選択します。
- 問題のルールの TriggerRules、呼び出し、および FailedInvocations (利用可能な場合) メトリックを選択します。必要に応じて、これらのメトリクスを SUM 統計とともに表示します。
**注:**TriggerRules データポイントは、イベントが EventBridge ルールをトリガーしたことを示しています。呼び出しデータポイントは、EventBridge ルールが対応するターゲットを呼び出したことを示します。メトリクスに FailedInvocations データポイントが含まれている場合、これらはルールがターゲットを呼び出せなかった可能性があることを示しています。**FailedInvocations ** は永続的な障害であり、権限が正しくないか、ターゲットが正しく構成されていないことが原因である可能性があります。
Lambda 関数のリソースポリシーに適切なアクセス権限があるかを確認します
Lambda 関数をターゲットとして EventBridge ルールを作成するときは、次の点に注意してください。
- Amazon EventBridge コンソールを使用してルールを作成すると、コンソールは適切なアクセス権限を関数のリソースポリシーに自動的に追加します。
- AWS CLI・SDK・AWS CloudFormation を使用してルールを作成する場合、リソースポリシーのアクセス権限を手動で適用する必要があります。
このアクセス権限により、Amazon EventBridge サービスに Lambda 関数を呼び出すことができるアクセス権限が付与されます。
ターゲット Lambda 関数に関連付けられている権限を確認する
以下の手順に従います。
- AWS Lambda コンソールを開きます。
- ターゲットの Lambda 関数を選択します。
- [設定] タブを選択し、[権限] を選択します。
- リソースベースのポリシーセクションで、ポリシードキュメントを確認します。
または、GetPolicy API または get-policy AWS CLI コマンドを適切な入力とともに使用して、Lambda 関数のリソースポリシーを取得します。
次の例は、EventBridge が Lambda 関数を呼び出すことを許可するリソースポリシーを示しています。
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:region:account-id:function:function-name",
"Principal": {
"Service": "events.amazonaws.com"
},
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:events:region:account-id:rule/rule-name"
}
},
"Sid": "InvokeLambdaFunction"
}
**注:**ARN を適切なリージョン、アカウント ID、リソース名に置き換えます。
リソースポリシーの更新
リソースポリシーを更新する必要がある場合は、次の手順に従ってください。
- AWS Lambda コンソールを開きます。
- ターゲットの Lambda 関数を選択します。
- [設定] タブを選択し、[権限] を選択します。
- 「リソースベースのポリシー」セクションで、[権限を追加] を選択します。
- AWS サービス - EventBridge (CloudWatch イベント) を選択します。
- ポリシーステートメントのオプションの識別子として、Statement ID (Sid) を指定します。
- プリンシパルを events.amazonaws.com として提供してください。
**注:**通常、これは自動入力されます。
- **ソース ARN ** を EventBridge ルールの ARN として指定します。
- [アクション] では、ドロップダウンリストから [Lambda: 関数の呼び出し] を選択します。
- [保存] を選択します。
AddPermission API または AWS Lambda 追加権限の AWS CLI コマンドを使用してポリシーを更新することもできます。
例:
aws lambda add-permission \--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:123456789012:rule/MyRule
Amazon SQS デッドレターキューをターゲットに追加します
EventBridgeは、Amazon Simple Queue Service (Amazon SQS) DLQ を使用して、ターゲットに配信できなかったイベントを保存します。Amazon SQS DLQ をFailedInvocations についてレポートしているターゲットにアタッチします。DLQ からイベントを取得して分析し、問題に関する詳細なコンテキストを取得します。修復後、失敗したイベントをターゲットに再送信して処理することができます。
- EventBridge コンソールで関連するルールを開きます。
- [ターゲット] から [編集] を選択し、[その他の設定] セクションを展開します。
- デッドレターキューで、[現在の AWS アカウントの Amazon SQS キューを選択してデッドレターキューとして使用する] を選択します。
- DLQ として使用する SQS キューを選択します。
- DLQ を割り当てたら、[ルールを編集] セクションの残りの手順を実行して変更を保存します。
関連情報
ルールは実行されたが、Lambda 関数が呼び出されなかった
Amazon EventBridge のリソースベースのポリシーの使用: AWS Lambda 権限
イベント再試行ポリシーとデッドレターキューの使用
Amazon EventBridge の障害復旧機能の向上