トラブルシューティング Amazon EventBridge - Amazon EventBridge
ルールはトリガーされたが、Lambda 関数が呼び出されなかったルールを作成/修正したが、テストイベントと一致しなかったScheduleExpression に指定されている時間にルールが自己トリガーされなかった予期した時間にルールがトリガーされなかったルールは IAM API 呼び出しに一致するが、トリガーされなかったルールがトリガーされるときに、ルールに関連付けられている IAM ロールが無視されるため、ルールが機能しないリソースに一致することを条件とする EventPattern を使用してルールを作成したが、このルールに一致するいずれのイベントも表示されないターゲットへのイベントの配信で遅延が発生した一部のイベントがターゲットに配信されない1 つのイベントに応じてルールが複数回トリガーされました。EventBridge で、ルールのトリガーまたはターゲットへのイベントの提供で何が保証されますか。無限ループの防止マイイベントがターゲットの Amazon SQS キューに配信されないルールがトリガーされているが、Amazon SNS トピックにいずれのメッセージもパブリッシュされません。Amazon SNS トピックに関連付けられたルールを削除した後でも、Amazon SNS トピックに EventBridge のアクセス権限があるEventBridge で使用できるIAM 条件キーEventBridge ルールが壊れているときに通知するアラームを作成する方法

トラブルシューティング Amazon EventBridge

このセクションの手順を使用して、Amazon EventBridge のトラブルシューティングを行うことができます。

トピック

ルールはトリガーされたが、Lambda 関数が呼び出されなかった

Lambda 関数に対する適切なアクセス権限が設定されていることを確認します。AWS CLI を使用して以下のコマンドを実行します (関数名を実際の関数に置き換え、関数がある AWS リージョンを使用します)。

aws lambda get-policy --function-name MyFunction --region us-east-1

以下のような出力が表示されます。

{ "Policy": "{\"Version\":\"2012-10-17\", \"Statement\":[ {\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:events:us-east-1:123456789012:rule/MyRule\"}}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:123456789012:function:MyFunction\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Sid\":\"MyId\"} ], \"Id\":\"default\"}" }

以下のように表示された場合:

A client error (ResourceNotFoundException) occurred when calling the GetPolicy operation: The resource you requested does not exist.

または、出力が表示されたが、信頼できるエンティティとして events.amazonaws.com がポリシーにない場合は、以下のコマンドを実行します。

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
注記

ポリシーが正しくない場合は、そのポリシーを削除してからルールに追加し直すことで、EventBridge コンソールでルールを編集することもできます。EventBridge コンソールで、ターゲットに対する適切なアクセス権限を設定します。

特定の Lambda エイリアスまたはバージョンを使用する場合は、aws lambda get-policy および aws lambda add-permission コマンドに --qualifier パラメータを追加する必要があります。

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 --qualifier alias or version

Lambda 関数がトリガーに失敗するもう 1 つの理由は、get-policy の実行中に表示されるポリシーに、SourceAccount フィールドが含まれている場合です。SourceAccount の設定により、EventBridge は関数を呼び出すことができなくなります。

ルールを作成/修正したが、テストイベントと一致しなかった

ルールまたはそのターゲットを変更すると、受信イベントはすぐに、新しいか更新されたルールへのマッチングを開始/停止しないことがあります。変更が有効になるまで、しばらくお待ちください。しばらく待っても、イベントがまだ一致しない場合は、ルールの CloudWatch メトリクス (TriggeredRulesInvocationsFailedInvocations など) を確認して、さらなるデバッグを行うことができます。カスタムメトリクスの詳細については、『Amazon CloudWatch ユーザーガイド』の「Amazon CloudWatch Eventsメトリクスとディメンション」を参照してください。

ルールが AWS サービスからのイベントによってトリガーされる場合は、TestEventPattern アクションを使用して、テストイベントでルールのイベントパターンをテストすることで、ルールのイベントパターンが正しく設定されていることを確認することもできます。詳細については、『Amazon CloudWatch Events API リファレンス』の「TestEventPattern」を参照してください。

ScheduleExpression に指定されている時間にルールが自己トリガーされなかった

ScheduleExpressions は UTC です。UTC タイムゾーンで自己トリガーするルールのスケジュールが設定されていることを確認します。ScheduleExpression が正しい場合は、「ルールを作成/修正したが、テストイベントと一致しなかった」の手順に従います。

注記

キャッシュによっては、スケジュールされたルールの最初のインスタンスが削除されることがあります。

ルールが有効になるまでに短い期間がかかることがあります。この期間内に到着したトリガーは、作成または更新されたスケジュールと一致しない可能性があります。

予期した時間にルールがトリガーされなかった

EventBridge では、期間ごとに実行するルールを作成するときに、正確な開始時間の設定がサポートされません。実行時間へのカウントダウンは、ルールを作成するとすぐに開始されます。

Cron 式を使用して、指定した時間にターゲットを起動できます。たとえば、Cron 式を使用して、4 時間おきのちょうど 0 分にトリガーされるルールを作成することができます。CloudWatch コンソールでは Cron 式 0 0/4 * * ? * を使用し、AWS CLI では Cron 式 cron(0 0/4 * * ? *) を使用できます。たとえば、AWS CLI を使用して、4 時間ごとにトリガーされる TestRule という名前のルールを作成するには、コマンドプロンプトで次のように入力します。

aws events put-rule --name TestRule --schedule-expression 'cron(0 0/4 * * ? *)'

0/5 * * * ? * Cron 式を使用して、5 分ごとにルールをトリガーできます。以下に例を示します。

aws events put-rule --name TestRule --schedule-expression 'cron(0/5 * * * ? *)'

EventBridge は、スケジュール式で秒レベルの精度を提供しません。Cron 式を使用した最小の解決は分です。EventBridge とターゲットサービスが持つ分散性の特質により、スケジュールされたルールがトリガーされてから、ターゲットサービスがターゲットリソースの実行を優先するまでの遅延は、数秒となる可能性があります。スケジュールされたルールは、その分のうちにトリガーされますが、正確に 0 秒にトリガーされません。

ルールは IAM API 呼び出しに一致するが、トリガーされなかった

IAM サービスは 米国東部 (バージニア北部) リージョン でのみ使用できるため、IAM からの AWS API 呼び出しイベントはそのリージョンでのみ使用できます。詳細については、「サポートされている AWS サービスからの EventBridge イベントの例」を参照してください。

ルールがトリガーされるときに、ルールに関連付けられている IAM ロールが無視されるため、ルールが機能しない

ルールの IAM ロールは、Kinesis ストリームにのみイベントを関連付けるために使用します。Lambda 関数と Amazon SNS トピックの場合、リソースベースのアクセス権限を付与する必要があります。

リージョンの AWS STS エンドポイントが有効になっていることを確認します。EventBridge は、指定された IAM ロールを引き受けるときに、リージョンの AWS STS エンドポイントに問い合わせます。詳細については、『IAM ユーザーガイド』の「AWS リージョンでの AWS STS のアクティブ化と非アクティブ化」を参照してください。

リソースに一致することを条件とする EventPattern を使用してルールを作成したが、このルールに一致するいずれのイベントも表示されない

AWS のほとんどのサービスでは、Amazon リソースネーム (ARN) 内のコロン (:) またはスラッシュ (/) は同じ文字として扱われます。ただし、EventBridge では、イベントパターンおよびルールで完全一致が使用されます。イベントパターンの作成時に正しい ARN 文字を使用して、一致させるイベント内の ARN 構文とそれらの文字が一致するようにしてください。

また、必ずしもすべてのイベントでリソースフィールドが入力されているわけではありません (CloudTrail からの AWS API コールイベントなど)。

ターゲットへのイベントの配信で遅延が発生した

ターゲットリソースが制約されているシナリオを除き、EventBridge は、最大 24 時間にわたりターゲットにイベントを配信しようとします。最初の試行は、イベントがイベントストリームに到達するとすぐに行われます。ただし、ターゲットサービスに問題がある場合、EventBridge は自動的に別の配信を再スケジュールします。イベントの到着から 24 時間が経過すると、それ以上の試行はスケジュールされず、FailedInvocations メトリクスが CloudWatch で発行されます。FailedInvocations メトリクスに基づいて CloudWatch アラームを作成することをお勧めします。

一部のイベントがターゲットに配信されない

EventBridge ルールのターゲットが長時間制約されている場合、EventBridge は配信を再試行しない可能性があります。たとえば、ターゲットが受信イベントのトラフィックを処理するようにプロビジョニングされておらず、ターゲットサービスが、EventBridge がユーザーの代わりに行うリクエストをスロットリングしている場合、EventBridge は配信を再試行しない可能性があります。

1 つのイベントに応じてルールが複数回トリガーされました。EventBridge で、ルールのトリガーまたはターゲットへのイベントの提供で何が保証されますか。

まれに、単一のイベントまたはスケジュールされた期間に対して同じルールを複数回トリガーしたり、特定のトリガーされたルールに対して同じターゲットを複数回起動したりする場合があります。

無限ループの防止

EventBridge では、ルールが繰り返し開始される無限ループにつながるルールを作成する可能性があります。たとえば、S3 バケットで ACL が変更されたことを検出し、ソフトウェアをトリガーして ACL を目的の状態に変更するルールがあるとします。このルールが慎重に記述されていない場合は、その後 ACL を変更するとルールが再び開始され、無限ループが作成されます。

これを防ぐには、トリガーされたアクションが同じルールを再び開始しないようにルールを記述します。たとえば、変更された後ではなく、エラー状態にある ACL が見つかった場合にのみ、ルールが開始されるようにします。

無限ループにより、予想よりも高い料金がすぐに発生する可能性があります。指定した制限を料金が超えるとアラートで知らせる予算設定を使用することをお勧めします。詳細については、「予算によるコストの管理」を参照してください。

マイイベントがターゲットの Amazon SQS キューに配信されない

Amazon SQS キューが暗号化されている可能性があります。暗号化された Amazon SQS キューをターゲットとして使用してルールを作成する場合、その暗号化されたキューにイベントを正常に配信するには、KMS キーポリシーに次のセクションが含まれている必要があります。

{ "Sid": "Allow CWE to use the key", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" }

ルールがトリガーされているが、Amazon SNS トピックにいずれのメッセージもパブリッシュされません。

Amazon SNS トピックに対する適切なアクセス権限が設定されていることを確認します。AWS CLI を使用して以下のコマンドを実行します (トピック ARN を実際のトピックに置き換え、トピックがある AWS リージョンを使用します)。

aws sns get-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic"

ポリシーには以下のような属性があります。

"{\"Version\":\"2012-10-17\", \"Id\":\"__default_policy_ID\", \"Statement\":[{\"Sid\":\"__default_statement_ID\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"*\"}, \"Action\":[\"SNS:Subscribe\", \"SNS:ListSubscriptionsByTopic\", \"SNS:DeleteTopic\", \"SNS:GetTopicAttributes\", \"SNS:Publish\", \"SNS:RemovePermission\", \"SNS:AddPermission\", \"SNS:Receive\", \"SNS:SetTopicAttributes\"], \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\", \"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"123456789012\"}}},{\"Sid\":\"Allow_Publish_Events\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Action\":\"sns:Publish\", \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\"}]}"

以下のようなポリシーがある場合は、デフォルトのポリシーのみが設定されています。

"{\"Version\":\"2008-10-17\", \"Id\":\"__default_policy_ID\", \"Statement\":[{\"Sid\":\"__default_statement_ID\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"*\"}, \"Action\":[\"SNS:Subscribe\", \"SNS:ListSubscriptionsByTopic\", \"SNS:DeleteTopic\", \"SNS:GetTopicAttributes\", \"SNS:Publish\", \"SNS:RemovePermission\", \"SNS:AddPermission\", \"SNS:Receive\", \"SNS:SetTopicAttributes\"], \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\", \"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"123456789012\"}}}]}"

ポリシーに events.amazonaws.com に対するパブリッシュアクセス権限がない場合は、AWS CLI を使用してトピックポリシー属性を設定します。

現在のポリシーをコピーし、ステートメントのリストに以下のステートメントを追加します。

{\"Sid\":\"Allow_Publish_Events\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Action\":\"sns:Publish\", \"Resource\":\"arn:aws:sns:us-east-1:123456789012:MyTopic\"}

新しいポリシーは前に説明したようになります。

AWS CLI で以下のようにトピック属性を設定します。

aws sns set-topic-attributes --region us-east-1 --topic-arn "arn:aws:sns:us-east-1:123456789012:MyTopic" --attribute-name Policy --attribute-value NEW_POLICY_STRING
注記

ポリシーが正しくない場合は、そのポリシーを削除してからルールに追加し直すことで、EventBridge コンソールでルールを編集することもできます。EventBridge は、ターゲットで適切なアクセス権限を設定します。

Amazon SNS トピックに関連付けられたルールを削除した後でも、Amazon SNS トピックに EventBridge のアクセス権限がある

ターゲットとして Amazon SNS でルールを作成すると、EventBridge はユーザーに代わって Amazon SNS トピックにアクセス権限を追加します。作成後すぐにルールを削除すると、EventBridge は Amazon SNS トピックからアクセス権限を削除できなくなる場合があります。その場合は、aws sns set-topic-attributes コマンドを使用してトピックからアクセス権限を削除できます。イベントを送信するためのリソースベースのアクセス権限の詳細については、「EventBridge のリソースベースのポリシーを使用する」を参照してください。

EventBridge で使用できるIAM 条件キー

EventBridge では、AWS 全体の条件キー (IAM ユーザーガイドの「使用可能なキー」を参照) に加え、以下のサービス固有の条件キーがサポートされています。詳細については、「詳細に設定されたアクセスコントロールのための IAM ポリシー条件の使用」を参照してください。

EventBridge ルールが壊れているときに通知するアラームを作成する方法

以下のアラームを使用して、EventBridge ルールが壊れているときに通知されるようにすることができます。

ルールが壊れているときに警告するアラームを作成するには

  1. https://console.aws.amazon.com/cloudwatch/ にある CloudWatch コンソールを開きます。

  2. [Create Alarm] を選択します。[CloudWatch Metrics by Category] ペインで [Events Metrics] を選択します。

  3. メトリクスのリストで、[FailedInvocations] を選択します。

  4. グラフの上で、[Statistic]、[Sum] を選択します。

  5. [Period] で、値 (例: 5 分) を選択します。[次へ] を選択します。

  6. [Alarm Threshold] の下の [Name] に一意のアラーム名 (例: myFailedRules) を入力します。[Description] に、アラームの説明として、たとえば「Rules are not delivering events to targets」と入力します。

  7. [is] で [>=] および [1] を選択します。[for] に「10」と入力します。

  8. [Actions] の [Whenever this alarm] で、[State is ALARM] を選択します。

  9. [通知の送信先] で、既存の Amazon SNS トピックを選択するか、新しいトピックを作成します。新しいトピックを作成するには、[新しいリスト] を選択します。新しい Amazon SNS トピックの名前 (例: myFailedRules) を入力します。

  10. [Email list] に、アラームが ALARM 状態に変わったら通知する E メールアドレスを、カンマ区切りのリストに入力します。

  11. [Create Alarm] を選択します。