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

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

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

ルールは実行されましたが、Lambda 関数が呼び出されませんでした

Lambda 関数が実行されない理由としては、適切なアクセス許可がないことが考えられます。

Lambda 関数のアクセス許可を確認するには

  1. 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\"}" }
  2. 以下のメッセージが表示される場合。

    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
  3. 出力に SourceAccount フィールドが含まれている場合は、削除する必要があります。SourceAccount 設定により、Eventbridge は関数を呼び出すことができなくなります。

注記

ポリシーが正しくない場合は、そのポリシーを削除してからルールに追加し直すことで、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

ルールを作成または修正したが、テストイベントと一致しない

ルールまたはそのターゲットを変更すると、受信イベントはすぐに、新しい、またはか更新されたルールへのマッチングを開始/停止しないことがあります。変更が有効になるまで、しばらくお待ちください。

しばらくしてもイベントが一致しない場合は、ルールの CloudWatch メトリクス TriggeredRulesInvocationsFailedInvocations を確認します。これらのメトリクスの詳細については、『Amazon EventBridge のモニタリング』を参照してください。

ルールが AWS サービスからのイベントと一致するように意図されている場合、TestEventPattern アクションを使用して、ルールのイベントパターンがテストイベントに一致するかどうかをテストします。詳細については、『Amazon EventBridge API リファレンス』の「TestEventPattern」を参照してください。

ルールが、ScheduleExpression で指定した時刻に実行されなかった

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

良きした時刻にルールが実行されなかった

EventBridge は、設定した開始時間から 1 分以内にルールを実行します。実行時間へのカウントダウンは、ルールを作成するとすぐに開始されます。

Cron 式を使用して、指定した時間にターゲットを起動できます。4 時間ごとの 0 分ごとに実行するルールを作成するには、次のいずれかを実行します。

  • EventBridge コンソールで、cron 式 0 0/4 * * ? * を使用する。

  • AWS CLI を使用して、cron(0 0/4 * * ? *) という式を使用する。

例えば、4 時間ごとに実行される TestRule という名前のルールを作成するには、AWS CLI を使用して、次のコマンドを使用します。

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

5 分ごとにルールを実行するには、次の cron 式を使用します。

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

cron 式を使用する EventBridge ルールの最小の粒度は 1 分です。スケジュールされたルールは、その分のうちに実行されますが、正確に 0 秒に実行されるわけではありません。

EventBridge とターゲットサービスは分散しているため、スケジュールしたルールが実行されてからターゲットサービスがターゲットリソースでアクションを実行するまでの間に数秒の遅延が発生することもあります。

ルールが、IAM API コールと一致しているが実行されなかった

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

ルールが実行されるとき、ルールに関連付けられた IAM ロールが無視される

EventBridge は、Kinesis ストリームにイベントを送信するルールにのみ IAM ロールを使用します。Lambda 関数と Amazon SNS トピックを呼び出すルールの場合、リソースベースのアクセス許可を付与する必要があります。

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

ルールにはリソースに一致することを条件とするイベントパターンがあるが、一致するイベントがない

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

CloudTrail からの AWS API コールイベントなど、一部のイベントではリソースフィールドに何もありません。

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

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

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

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

1 つのイベントに応じてルールが複数回トリガーされた

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

無限ループの防止

Eventbridge では、ルールが繰り返し実行される無限ループにつながるルールが作成されることがあります。無限ループに陥るルールがある場合は、そのルールが実行するアクションが同じルールに一致しないように書き換えてください。

例えば、Amazon S3 バケットで ACL が変更されたことを検出してから、ソフトウェアを実行してそれを新しい状態に変更するルールは、無限ループの原因となります。これを解決する 1 つの方法は、不正な状態の ACL のみにマッチするようにルールを書き換えることです。

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

マイイベントがターゲットの 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 トピックにいずれのメッセージもパブリッシュされない

シナリオ 1

Amazon SNS トピックにメッセージを発行するには、アクセス許可が必要です。AWS CLI を使用して次のコマンドを使用し、us-east-1 を所定のリージョンに置き換え、トピック ARN を使用します。

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\"}]}"

Publish アクセス許可のある events.amazonaws.com が表示されていない場合は、まず現在のポリシーをコピーして、以下のステートメントを追加してください。

{\"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 は、ターゲットで適切なアクセス許可を設定します。

シナリオ 2

SNS トピックが暗号化されている場合は、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 トピックに Eventbridge のアクセス許可がある

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. [アクション] の [アラームが次の時:] で、[状態: 警告] を選択します。

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

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

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