作成した Amazon EventBridge ルールが AWS Lambda 関数を呼び出しません。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI のエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
EventBridge ルールの CloudWatch メトリクスを確認する
問題の原因を特定するには、Amazon CloudWatch コンソールの AWS/Events 名前空間で、次の EventBridge メトリクスを確認してください。
- TriggeredRules を確認して、スケジュールされたルールが実行されたか、特定のイベントと一致したかどうかを判断します。ルールが正常に実行されると、EventBridge はイベントをターゲットに転送します。
- Invocations を確認して、ルールがターゲットを呼び出したかどうかを判断します。EventBridge は、イベントをターゲットに配信できない場合に複数回試行します。
- FailedInvocations を確認して、EventBridge がターゲットの呼び出しに永続的に失敗したかどうかを判断します。このメトリクスは、ターゲットの設定上の問題点を示します。
Lambda 関数のリソースポリシーに必要なアクセス許可があることを確認する
EventBridge には Lambda 関数を呼び出すアクセス許可が必要です。EventBridge コンソールを使用してルールを作成すると、コンソールは必要なアクセス許可を関数のリソースベースのポリシーに自動的に追加します。AWS CLI、AWS SDK、または AWS CloudFormation を使用してルールを作成した場合は、リソースベースのポリシーにアクセス許可を手動で追加する必要があります。
Lambda コンソールを使用してターゲット関数のアクセス許可を更新するには、次の手順を実行します。
- Lambda コンソールを開きます。
- 目的の Lambda 関数を選択します。
- [設定] タブを選択し、[アクセス許可] を選択します。
- [リソースベースのポリシー] で、そのポリシーが EventBridge による Lambda 関数の呼び出しを許可しているようにします。
- ポリシーに必要なアクセス許可がない場合は、[アクセス許可を追加] を選択します。
- [AWS Service - EventBridge] を選択します。
- (オプション) ポリシーステートメントの識別子としてステートメント ID を入力します。
- [プリンシパル] に events.amazonaws.com と入力します。
- [ソース ARN] に、EventBridge ルールの Amazon リソースネーム (ARN) を入力します。
- [アクション] で [lambda:InvokeFunction] を選択します。
- [保存] を選択します。
GetPolicy API を使用して、関数のリソースベースのポリシーを表示することもできます。または、次の get-policy AWS CLI コマンドを実行します。
aws lambda get-policy \
--function-name my-function
注: my-function を実際の関数名に置き換えてください。
ポリシーを更新するには、AddPermission API を使用してください。または、次の add-permission コマンドを実行します。
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
注: MyFunction を関数名に、myID をステートメント ID に、arn:aws:events:us-east-1:123456789012:rule/MyRule をルールの ARN に置き換えます。
実行ロールに必要なアクセス許可があることを確認する
実行ロールを使用する場合は、そのロールに Lambda 関数を呼び出すアクセス許可があることを確認してください。
EventBridge コンソールを使用してロールを作成すると、コンソールはルールにアタッチされている IAM ロールに必要なアクセス許可を自動的に追加します。AWS CLI、AWS SDK、または CloudFormation を使用してルールを作成した場合は、IAM ロールにアクセス許可を手動で追加する必要があります。
IAM ロールのアクセス許可を確認するには、次の手順を実行します。
- EventBridge コンソールを開きます。
- [ルール] を選択します。
- EventBridge ルールを選択します。
- [ターゲット] タブを選択し、ルールの IAM ロールを選択します。
- [アクセス許可] で、ポリシーが EventBridge による Lambda 関数の呼び出しを許可し、信頼ポリシーがロールによる Lambda へのアクセスを許可していることを確認します。
IAM ポリシーの例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:region:account-id:function:function-name"
]
}
]
}
信頼関係の例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "TrustEventBridgeService",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "account-id",
"aws:SourceArn": "arn:aws:events:region:account-id:rule/rule-name"
}
}
}
]
}
注: arn:aws:lambda:region:account-id:function:function-name を関数の ARN に、account-ID を AWS アカウント ID に、arn:aws:events:region:account-id:rule/rule-name をルールの ARN に置き換えます。
GetRole API を使用して IAM ポリシーを取得することもできます。または、次の get-role コマンドを実行します。
aws iam get-role \
--role-name Test-Role
注: Test-Role を実際のロール名に置き換えてください。
ポリシーまたは信頼関係に必要なアクセス許可がない場合は、IAM コンソールを使用してポリシーと信頼関係を更新してください。
Amazon SQS のターゲットにデッドレターキューを追加する
EventBridge は、Amazon Simple Queue Service (Amazon SQS) のデッドレターキューを使用して、EventBridge がターゲットに配信できなかったイベントを保存します。
呼び出しが失敗した理由に関する詳細情報を取得するには、次の手順を実行してデッドレターキューをターゲットにアタッチします。
- デッドレターキューとして使用する Amazon SQS キューを作成します。
- EventBridge コンソールを開きます。
- [ルール] を選択します。
- EventBridge ルールを選択します。
- [ターゲット] で [編集] を選択し、[追加設定] セクションを展開します。
- [デッドレターキュー] で、[現在の AWS アカウントの Amazon SQS キューを選択してデッドレターキューとして使用する] を選択します。
- SQS キューを選択します。
- 変更内容を確認して、[保存] を選択します。
次に、イベントを再実行してデッドレターキューに記録し、ルールが関数の呼び出しに失敗した理由に関する詳細情報を取得します。
関連情報
My rule ran but my Lambda function wasn't invoked (ルールを実行しても、Lambda 関数が呼び出されません)
Improved failure recovery for Amazon EventBridge (Amazon EventBridge の障害復旧機能が向上しました)