AWS アカウント間のイベントの送受信 - Amazon CloudWatch Events

AWS アカウント間のイベントの送受信

注記

Amazon EventBridge is the preferred way to manage your events. CloudWatch イベント and EventBridge are the same underlying service and API, but EventBridge provides more features. Changes you make in either CloudWatch or EventBridge will appear in each console. For more information, see Amazon EventBridge.

他の AWS アカウントとの間でイベントを送受信するように AWS アカウントを設定できます。これは、アカウントが同じ組織に属している、パートナーである組織に属している、または同様の関係を持っている場合に役立ちます。

イベントを送受信するようにアカウントを設定する場合は、イベントの送信先または受信元の AWS アカウントを指定できます。AWS Organizations 機能を使用する場合は、組織を指定し、その組織内のすべてのアカウントにアクセス許可を付与できます。詳細については、AWS Organizations ユーザーガイド の「AWS Organizations とは」を参照してください。

全体の手順は次のとおりです。

  • ​受信側アカウントで、指定した AWS アカウント、組織、またはすべての AWS アカウントが受取側アカウントにイベントを送信できるように、デフォルトのイベントバスに対するアクセス許可を編集します。

  • 送信側アカウントで、受信側アカウントのデフォルトのイベントバスをターゲットとする 1 つ以上のルールを設定します。

    送信側アカウントが、アクセス許可を持つ AWS 組織に属するため、イベントを送信するアクセス許可を持っている場合、送信側アカウントには、受信側アカウントにイベントを送信するためのポリシーが適用された IAM ロールも必要です。AWS マネジメントコンソール を使用して受信側アカウントをターゲットとするルールを作成する場合、このロールは自動的に作成されます。AWS CLI を使用する場合は、このロールを手動で作成する必要があります。

  • 受信側アカウントで、送信側アカウントからのイベントに一致する 1 つ以上のルールを設定します。

受信側アカウントがデフォルトのイベントバスにアクセス権限を追加する AWS リージョンは、送信側アカウントが受信側アカウントにイベントを送信するためのルールを作成するリージョンと同じである必要があります。

1 つのアカウントから別のアカウントに送信されたイベントは、カスタムイベントとして送信側アカウントに課金されます。受信側アカウントには課金されません。詳細については、Amazon CloudWatch 料金表をご覧ください。

受信側アカウントで、送信側アカウントから受信したイベントを第三のアカウントに送信するルールが設定されていても、それらのイベントは第三のアカウントには送信されません。

AWS アカウントで他の AWS アカウントからイベントを受信できるようにする

他のアカウントまたは組織からイベントを受信するには、まずアカウントのデフォルトのイベントバスに対するアクセス許可を編集する必要があります。デフォルトのイベントバスは、AWS のサービス、他の承認された AWS アカウント、および PutEvents コールからイベントを受け入れることができます。

他の AWS アカウントにアクセス許可を付与するように、デフォルトのイベントバスに対するアクセス許可を編集するときは、アカウント ID または組織 ID でアカウントを指定できます。または、すべての AWS アカウントからイベントを受信する選択ができます。

警告

すべての AWS アカウントからイベントを受信することを選択した場合、他のアカウントから受信するイベントにのみ一致するルールを慎重に作成してください。より安全なルールを作成するには、各ルールのイベントパターンに、Account フィールドと、イベントの受信元の 1 つ以上のアカウントのアカウント ID が必ず含まれるようにします。アカウントフィールドを含むイベントパターンを持つルールは、Account フィールドにリストされていないアカウントから送信されたイベントと一致しません。詳細については、「CloudWatch イベント のイベントパターン」を参照してください。

コンソールを使用して、アカウントで他の AWS アカウントからイベントを受信できるようにするには

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

  2. ナビゲーションペインで、[イベントバス]、[アクセス許可の追加] を選択します。

  3. [AWS アカウント] または [Organization (組織)] を選択します。

    [AWS アカウント] を選択した場合は、イベントの受信元 AWS アカウントの 12 桁のアカウント ID を入力します。他のすべての AWS アカウントからイベントを受信するには、[全員(*)] を選択します。

    [Organization (組織)] を選択した場合は、[自分の組織] を選択して、現在のアカウントが属する組織内のすべてのアカウントにアクセス許可を付与します。または、[Another organization (別の組織)] を選択し、その組織の組織 ID を入力します。組織 ID を入力するときは、o- プレフィックスを含める必要があります。

  4. [追加] を選択します。

  5. これらの手順を繰り返して、他のアカウントや組織を追加できます。

AWS CLI を使用して、アカウントで他の AWS アカウントからイベントを受信するには

  1. 1 つの特定の AWS アカウントでイベントの送信を有効にするには、次のコマンドを実行します。

    aws events put-permission --action events:PutEvents --statement-id MySid --principal SenderAccountID

    AWS 組織がイベントを送信できるようにするには、以下のコマンドを実行します。

    aws events put-permission --action events:PutEvents --statement-id MySid --principal \* --condition '{"Type" : "StringEquals", "Key": "aws:PrincipalOrgID", "Value": "SenderOrganizationID"}'

    他のすべての AWS アカウントでイベントを送信を有効にするには、次のコマンドを実行します。

    aws events put-permission --action events:PutEvents --statement-id MySid --principal \*

    aws events put-permission を複数回実行して、個々の AWS アカウントと組織の両方にアクセス許可を付与できますが、1 つのコマンドで個々のアカウントと組織の両方を指定することはできません。

  2. デフォルトのイベントバスに対するアクセス許可を設定したら、オプションで describe-event-bus コマンドを使用してそれらのアクセス許可を確認できます。

    aws events describe-event-bus

別の AWS アカウントへのイベントの送信

別のアカウントにイベントを送信するには、別の AWS アカウントのデフォルトのイベントバスをターゲットとする CloudWatch イベント ルールを設定できます。その受信側アカウントのデフォルトのイベントバスも、アカウントからイベントを受信するように設定する必要があります。

コンソールを使用してアカウントから別の AWS アカウントにイベントを送信するには

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

  2. ナビゲーションペインで、[イベント]、[ルールの作成] の順に選択します。

  3. [イベントソース] で、[イベントパターン] を選択し、他のアカウントに送信するサービス名とイベントタイプを選択します。

  4. [ターゲットの追加] を選択します。

  5. [ターゲット] で、[別の AWS アカウントのイベントバス] を選択します。[アカウント ID] に、イベントの送信先 AWS アカウントの 12 桁のアカウント ID を入力します。

  6. 受信側アカウントが組織全体にアクセス許可を付与しているため、この送信側アカウントがイベントを送信するアクセス許可を持っている場合は、IAM ロールが必要です。

    • 自動的に IAM ロールを作成するには、[この特定のリソースに対して新しいロールを作成する] を選択します。

    • または、[既存のロールの使用] を選択します。ビルドを呼び出すのに十分なアクセス許可をすでに持つロールを選択します。CloudWatch イベント は、選択したロールに追加のアクセス許可を付与しません。

  7. ページの下部で、[設定の詳細] を選択します。

  8. ルールの名前と説明を入力し、[ルールの作成] を選択します。

AWS CLI を使用して別の AWS アカウントにイベントを送信するには

  1. 送信側アカウントが、受信側アカウントによってアクセス許可を付与される先の AWS 組織に属するため、イベントを送信するアクセス許可を持っている場合、送信側アカウントには、受信側アカウントにイベントを送信するためのポリシーが適用されたロールも必要です。この手順では、そのロールを作成する方法について説明します。

    送信者アカウントに、組織ではなく AWS アカウント ID を通じてイベントを送信するアクセス許可が付与されている場合、この手順はオプションです。ステップ 2 に進めます。

    1. 送信側アカウントに組織を通じてアクセス許可が付与されている場合は、必要な IAM ロールを作成します。まず、以下の内容で assume-role-policy-document.json というファイルを作成します。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. ロールを作成するには、以下のコマンドを入力します。

      $ aws iam create-role \ --profile sender \ --role-name event-delivery-role \ --assume-role-policy-document file://assume-role-policy-document.json
    3. 以下の内容で permission-policy.json という名前のファイルを作成します。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "events:PutEvents" ], "Resource": [ "arn:aws:events:us-east-1:${receiver_account_id}:event-bus/default" ] } ] }
    4. このポリシーをロールにアタッチするには、以下のコマンドを入力します。

      $ aws iam put-role-policy \ --profile sender \ --role-name event-delivery-role \ --policy-name EventBusDeliveryRolePolicy --policy-document file://permission-policy.json
  2. put-rule コマンドを使用して、他のアカウントに送信するイベントタイプに一致するルールを作成します。

  3. 他のアカウントのデフォルトのイベントバスを、ルールのターゲットとして追加します。

    送信側アカウントに、アカウント ID を通じてイベントを送信するアクセス許可が付与されている場合、ロールを指定する必要はありません。次のコマンドを実行します。

    aws events put-targets --rule NameOfRuleMatchingEventsToSend --targets "Id"="MyId","Arn"="arn:aws:events:region:$ReceiverAccountID:event-bus/default"

    送信側アカウントに組織を通じてイベントを送信するアクセス許可が付与されている場合は、以下の例のようにロールを指定します。

    aws events put-targets --rule NameOfRuleMatchingEventsToSend --targets "Id"="MyId","Arn"="arn:aws:events:region:$ReceiverAccountID:event-bus/default","RoleArn"="arn:aws:iam:${sender_account_id}:role/event-delivery-role"

別の AWS アカウントからのイベントに一致するルールの作成

アカウントが他の AWS アカウントからイベントを受信するように設定されている場合、それらのイベントに一致するルールを作成できます。他のアカウントから受信するイベントに一致するルールのイベントパターンを設定します。

ルールのイベントパターンで account を指定した場合を除き、アカウントのルール (新規と既存の両方) のうち、他のアカウントから受信したイベントに一致するすべてのルールがトリガーされます。別のアカウントからイベントを受信し、自分のアカウントから生成されたときにそのイベントパターンのみでルールがトリガーされるようにするには、account を追加し、自分のアカウント ID をルールのイベントパターンに指定する必要があります。

すべての AWS アカウントからイベントを受け入れるように AWS アカウントを設定する場合、アカウントの各 CloudWatch イベント ルールに account を追加することを強くお勧めします。これにより、アカウントのルールで、不明な AWS アカウントからのイベントによるトリガーの発生を防止できます。ルールで account フィールドを指定するときは、1 つ以上の AWS アカウントのアカウント ID をフィールドで指定できます。

アクセス許可を付与した AWS アカウントの一致するイベントに対してルールをトリガーするには、ルールの [account] フィールドに * を指定しないでください。これにより、* はイベントの account フィールドに表示されないため、どのイベントとも一致しません。代わりに、ルールから account フィールドを省略します。

コンソールを使用して、別のアカウントからのイベントに一致するルールを作成するには

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

  2. ナビゲーションペインで、[イベント]、[ルールの作成] の順に選択します。

  3. [イベントソース] で、[イベントパターン] を選択し、ルールで一致するサービス名とイベントタイプを選択します。

  4. [イベントパターンのプレビュー] の近くにある [編集] を選択します。

  5. 編集ウィンドウで、このイベントを送信するどの AWS アカウントがルールと一致するかを指定する Account 行を追加します。たとえば、編集ウィンドウの元の表示が次のようであるとします。

    { "source": [ "aws.ec2" ], "detail-type": [ "EBS Volume Notification" ] }

    EBS ボリューム通知を送信する AWS アカウント 123456789012 および 111122223333 がルールと一致するようにするには、以下の行を追加します。

    { "account": [ "123456789012","111122223333" ], "source": [ "aws.ec2" ], "detail-type": [ "EBS Volume Notification" ] }
  6. イベントパターンを編集し、[保存] を選択します。

  7. 通常どおりルールの作成を終了し、アカウントで 1 つ以上のターゲットを設定します。

AWS CLI を使用して、別の AWS アカウントからのイベントに一致するルールを作成するには

  • put-rule コマンドを実行します。ルールのイベントパターンの Account フィールドに、ルールに一致するようにする他の AWS アカウントを指定します。次の例では、ルールは AWS アカウント 123456789012 および 111122223333 の Amazon EC2 インスタンスの状態変更に一致します。

    aws events put-rule --name "EC2InstanceStateChanges" --event-pattern "{\"account\":["123456789012", "111122223333"],\"source\":[\"aws.ec2\"],\"detail-type\":[\"EC2 Instance State-change Notification\"]}" --role-arn "arn:aws:iam::123456789012:role/MyRoleForThisRule"

送信側と受信側の関係を移行して AWS Organizations を使用する

送信側アカウントのアカウント ID にアクセス許可が直接付与されている場合、これらのアクセス許可を取り消して (組織にアクセス許可を付与することで) 送信側アカウントにアクセス権を与える場合は、追加のステップを実行する必要があります。これらのステップでは、送信側アカウントからのイベントが依然として受信側アカウントに到達できることを確認します。これは、組織を介してイベントを送信するアクセス許可を持つアカウントは、イベントを送信するために IAM ロールも使用する必要があるためです。

送信側と受信側の関係を移行するために必要なアクセス許可を追加するには

  1. 送信側アカウントで、IAM ロールを作成します。このロールには、受信側アカウントにイベントを送信することを許可するポリシーを割り当てます。

    1. 以下の内容で assume-role-policy-document.json という名前のファイルを作成します。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. IAM ロールを作成するには、次のコマンドを入力します。

      $ aws iam create-role \ --profile sender \ --role-name event-delivery-role \ --assume-role-policy-document file://assume-role-policy-document.json
    3. 以下の内容で permission-policy.json という名前のファイルを作成します。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "events:PutEvents" ], "Resource": [ "arn:aws:events:us-east-1:${receiver_account_id}:event-bus/default" ] } ] }
    4. このポリシーをロールにアタッチするには、以下のコマンドを入力します。

      $ aws iam put-role-policy \ --profile sender \ --role-name event-delivery-role \ --policy-name EventBusDeliveryRolePolicy --policy-document file://permission-policy.json
  2. 送信側アカウントの既存のルールのうち、受信側アカウントのデフォルトのイベントバスをターゲットとする各ルールを編集します。ステップ 1 で作成したロールをターゲット情報に追加することで、ルールを編集します。次のコマンドを使用します。

    aws events put-targets --rule Rulename --targets "Id"="MyID","Arn"="arn:aws:events:region:$ReceiverAccountID:event-bus/default","RoleArn"="arn:aws:iam:${sender_account_id}:role/event-delivery-role"
  3. 受信側アカウントで、次のコマンドを実行します。これにより、受信側アカウントにイベントを送信するアクセス許可を組織のアカウントに付与します。

    aws events put-permission --action events:PutEvents --statement-id Sid-For-Organization --principal \* --condition '{"Type" : "StringEquals", "Key": "aws:PrincipalOrgID", "Value": "SenderOrganizationID"}'

    必要に応じて、最初に送信側アカウントに直接付与されたアクセス許可を取り消すこともできます。

    aws events remove-permission --statement-id Sid-for-SenderAccount