このトピックでは、EventBridge を使用して ECS イベントをサブスクライブし、それらをダウンストリームサービスに配信する方法について説明します。
背景情報
EventBridge は、Alibaba Cloud 上のイベントハブです。Alibaba Cloud サービスとアプリケーション、およびアプリケーション同士を接続するための統合イベントセンターを提供します。EventBridge は標準の CloudEvents 1.0 プロトコルを使用します。Alibaba Cloud サービス、Software as a Service(SaaS)アプリケーション、およびお客様のビジネスアプリケーションから発生するイベントを EventBridge を使用して管理できます。EventBridge は、アップストリームの Alibaba Cloud サービスからのイベント品質を保証し、イベントサブスクリプション体験を向上させ、データ配信の信頼性を高めます。EventBridge は、データ信頼性 99.99999999 %、サービス可用性 99.95 % を保証するサービスレベルアグリーメント(SLA)を提供します。
EventBridge を使用したイベントのサブスクライブは、ECS の DescribeInstanceHistoryEvents API オペレーションを呼び出して新規イベントをポーリングする方法と比較して、以下の利点があります:
-
適時性の向上:特定タイプのイベントが検出されると、ミリ秒単位で特定の操作をトリガーできます。
-
コストの削減:イベントを定期的にポーリングする必要がなく、不要なオーバーヘッドを回避できます。

シナリオ
-
特定の ECS イベントをサブスクライブして、DingTalk、ショートメッセージ、またはメールによる通知をトリガーできます。
-
特定の ECS イベントをインターネットまたは VPC 経由でダウンストリームの HTTP/HTTPS サービスにプッシュできます。
-
複数の Alibaba Cloud アカウントから発生する ECS イベントを集約できます。
-
特定の ECS イベントが発生した際に、Function Compute を使用して特定のアクションをトリガーできます。
-
イベント遅延が大きい場合やイベントボリュームが大きい場合に、Simple Message Queue (formerly MNS) に ECS イベントを配信し、サブスクライブできます。
前提条件
-
DingTalk ロボットを作成し、その Webhook URL とキーを記録します。
-
Simple Message Queue (formerly MNS) キューを作成します。詳細については、「Simple Message Queue (旧称:MNS) の有効化と権限付与」および「キューの作成」をご参照ください。
ステップ 1:専用の Alibaba Cloud サービスイベントバスの選択
システムイベントバスは、EventBridge が自動的に作成する `default` バスです。Alibaba Cloud サービスはリアルタイムでイベントを `default` バスに配信します。Alibaba Cloud サービスから発生するイベントは、`default` バス上で検索およびサブスクライブできます。
EventBridge コンソール にログインします。左側のナビゲーションウィンドウで、イベントバス をクリックします。
上部のナビゲーションバーで、リージョンを選択します。
-
EventBridge ページで、default をクリックします。
ステップ 2:ECS イベントのイベントルールの作成
-
EventBridge ページで、左側のナビゲーションウィンドウから イベントルール をクリックし、その後 ルールの作成 をクリックします。
-
ルールの作成 パネルで、以下の手順を実行します。
-
[基本情報の設定] タブで、名前 テキストボックスに名前を入力し、説明 テキストボックスに説明を入力します。次に、次へ をクリックします。
-
イベントパターンの設定 タブで、イベントパターンを構成します。その後、次へ をクリックします。
-
Alibaba Cloud サービスイベントソース タブをクリックします。
-
イベントソース のドロップダウンリストから、acs.ecs を選択します。
-
イベントタイプ のドロップダウンリストから、サブスクライブするイベントタイプを選択します。複数のイベントタイプを選択できます。
-
イベントパターンのデバッグ セクションでは、選択したイベントタイプのサンプルを表示できます。たとえば、インスタンスのライフサイクル状態変更のための ecs.Instance.StateChange を選択すると、次のサンプルが表示されます。
{ "id": "45ef4dewdwe1-7c35-447a-bd93-fab****", "source": "acs.ecs", "specversion": "1.0", "subject": "acs.ecs:cn-hangzhou:123456789098****:215672", "time": "2020-11-19T21:04:41Z", "type": "ecs:Instance:StateChange", "aliyunaccountid": "123456789098****", "aliyunpublishtime": "2020-11-19T21:04:42Z", "aliyuneventbusname": "default", "aliyunregionid": "cn-hangzhou", "aliyunpublishaddr": "172.25.XX.XX", "data": { "instanceName": "iZ0jl0kyquo46h****", "instanceType": "ecs.c6.large", "privateIpAddress": "172.21.XX.XX", "publicIpAddress": "8.37.XX.XX", "resourceId": "i-0jl0kyquo46****", "resourceType": "ALIYUN::ECS::Instance", "spotStrategy": "SpotWithPriceLimit", "state": "Running" } }
-
-
ターゲットの設定 タブで、サービスタイプ を選択し、プッシュシナリオを構成します。
シナリオ 1: Simple Message Queue (formerly MNS) へのプッシュ
イベントのレイテンシーが高い、またはイベントのボリュームが大きいシナリオでは、Simple Message Queue (formerly MNS) を使用してイベントをサブスクライブすることができます。Simple Message Queue (formerly MNS) の課金に関する詳細については、「課金」をご参照ください。
-
サービスタイプ: Simple Message Queue (formerly MNS) を選択します。
-
キュー:作成済みのキューを選択します。
-
メッセージ本文 : **完全なイベント** を選択します。
-
Base64 デコードの有効化: はい を選択します。Base64 エンコーディングを有効化すると、Simple Message Queue (formerly MNS) の宛先キューに配信される前にデータがエンコードされます。
**サービスタイプ** を Simple Message Queue (formerly MNS) に設定した場合、NetworkInterfaceDemo.zip を使用して Simple Message Queue (formerly MNS) からのメッセージをリッスンし、イベントを取得できます。
シナリオ 2:DingTalk へのプッシュ
-
サービスタイプ: DingTalk を選択します。
-
アドレス:DingTalk ロボットの Webhook URL を入力します。
-
秘密鍵:DingTalk ロボットのキーを入力します。
-
プッシュ内容:EventBridge のテンプレート機能を使用して、イベントからパラメーターを抽出し、DingTalk ロボットにプッシュできます。たとえば、ECS インスタンスのインスタンス名(`instanceName`)および実行状態(`state`)をプッシュするには、以下のパラメーターを構成します:
-
Parameters:JSONPath 式を使用して、イベントから取得するフィールドを指定し、変数名を設定します。
{ "instanceName":"$.data.instanceName", "state":"$.data.state" } -
Template:DingTalk ロボットで必要な形式でテンプレートを定義し、定義した変数を参照します。
{ "msgtype": "text", "text": { "content": "${instanceName} の状態は ${state} です" } }
-
シナリオ 3:ダウンストリームの HTTP サービスへのプッシュ
-
サービスタイプ: http または https を選択します。
-
URL:イベントを受信する URL を構成します。
-
Body:イベントコンテンツの形式を構成します。EventBridge はイベントを変換し、必要な形式で HTTP ターゲットにプッシュできます。サポートされる変換形式は、**完全なイベント**、**部分的なイベント**、**静的フィールド**、および **テンプレート** です。詳細については、「イベント変換」をご参照ください。
-
ネットワークタイプ:
-
インターネット:インターネット経由でターゲット URL にアクセスします。
-
VPC:ターゲット URL がインターネットに公開されていない場合に選択します。VPC ID、VSwitch ID、セキュリティグループ ID を指定する必要があります。
-
シナリオ 4:プッシュ後のアクションのトリガー
ECS イベント発生時にさらにカスタマイズされたアクションをトリガーしたい場合は、サービスタイプを Function Compute に設定します。イベントを特定の関数にプッシュし、Function Compute 内でコードを記述してカスタムアクションを定義できます。
-
サービスタイプ: Function Compute を選択します。
-
サービス:Function Compute で作成したサービスの名前です。
-
関数:Function Compute で作成した関数の名前です。
-
イベント:イベントコンテンツの形式を構成します。EventBridge はイベントを変換し、必要な形式で Function Compute にプッシュできます。サポートされる変換テンプレートは、完全なイベント、部分的なイベント、静的フィールド、および テンプレート です。詳細については、「イベント変換」をご参照ください。
-
実行方法:
-
同期: Function Compute がイベントを受信します。関数がイベントを処理した後、リクエストは成功とみなされます。
-
非同期: Function Compute がイベントを受信した時点で、リクエストは成功とみなされます。
詳細については、「Function Compute へのルーティング」をご参照ください。
-
シナリオ 5:複数の Alibaba Cloud アカウントからの ECS イベントの集約
EventBridge は、異なるアカウントおよびリージョンから発生する ECS イベントを、単一のアカウントおよびリージョン内のイベントバスに集約できます。これを行うには、サービスタイプを **EventBridge イベントバス** に設定します。
-
ターゲットタイプ:
-
同一アカウントのイベントバス:現在のアカウント内の別のバスにイベントを配信します。
-
クロスアカウントイベントバス:他のアカウント内のバスにイベントを配信します。このオプションを選択した場合、必要な権限を付与する必要があります。詳細については、「EventBridge へのイベントのルーティング」をご参照ください。
-
-
リージョン:中国本土内のリージョン間、および中国本土以外のリージョン間でのクロスリージョン配信がサポートされています。
-
Event Bus:ターゲットイベントバスの名前です。
-
イベント:デフォルトでは完全なイベントが配信されます。これは変更できません。
ターゲットの設定 タブの下部で、必要に応じて再試行ポリシーおよびデッドレターキューを構成できます。「再試行およびデッドレターキュー」をご参照ください。
その他のシナリオについては、「ターゲットサービスタイプ」をご参照ください。
-
-
ステップ 3:イベントのトリガー
このトピックでは、インスタンスのライフサイクル状態変更のための ecs.Instance.StateChange イベントタイプを例として使用します。このイベントをトリガーするには、ECS インスタンスの実行状態を変更します。
-
ECS コンソール にログインします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
上部のナビゲーションバーで、ターゲットリソースが配置されているリージョンを選択します。
-
対象の ECS インスタンスを検索します。操作 列で、 を選択し、インスタンスの実行状態を変更します。
ステップ 4:配信結果の確認
-
ECS イベントが生成されたかどうかを確認します。
EventBridge を使用すると、時間範囲、イベントタイプ、ルール名、またはイベント ID を指定して ECS イベントを検索できます。イベント ID は ECS イベント ID と同じです。「イベントの照会」をご参照ください。
-
ECS イベントサブスクリプションの配信結果を確認します。
前のステップで取得したイベント ID を使用して、イベント追跡 をクリックすることで、イベントのプッシュ追跡を表示できます。操作 列の イベント追跡 をクリックすると、プッシュ先、ステータス、プッシュ回数、時間などの詳細を含む追跡情報が表示されます。

イベントのモニタリングとアラート
EventBridge のモニタリングダッシュボードでは、作成した ECS イベントサブスクリプションタスクの呼び出し回数、プッシュ成功率、およびプッシュ遅延を確認できます。また、ビジネスシナリオに応じてアラートポリシーを構成することもできます。
-
CloudMonitor コンソール にログインします。
-
左側のナビゲーションウィンドウで、 を選択します。
-
クラウドサービス監視 ページで、左側のナビゲーションウィンドウから ミドルウェア をクリックします。その後、ミドルウェア セクションで、イベントバス の上にポインターを移動し、イベントバス - EventBus をクリックします。

-
イベントバス - EventBus ページで、リージョンを選択します。その後、default バスの 操作 列にある モニタリングチャート をクリックして、モニタリングの詳細を表示します。

モニタリングページでは、EventBridge リソースに対してアラートルールを設定できます。リソースがアラートルールの条件を満たすと、CloudMonitor が自動的にアラート通知を送信します。「アラートルールの設定」をご参照ください。
再試行およびデッドレターキュー
イベントがイベントバスに書き込まれた後、EventBridge は、イベントをダウンストリームサービスに少なくとも 1 回はプッシュすることを保証します。ダウンストリームの受信側がダウンタイム、サービスの利用不可、ネットワークジッターなどの例外によりイベントを受信できない場合、EventBridge は、再試行ポリシー、フォールトトレランスポリシー、デッドレターキューなど、これらの例外を処理するための複数の方法を提供します。ステップ 2:ECS イベントのイベントルールの作成 で再試行およびデッドレターポリシーを構成することで、イベントが正しく配信されることを保証できます。
-
再試行ポリシー
ダウンストリームの受信側がイベントを受信できない場合、EventBridge がイベントをプッシュする際に例外が発生します。この場合、EventBridge で再試行ポリシーを構成して、プッシュ成功率を最大化できます。
-
バックオフ再試行:3 回再試行します。再試行間隔は 10~20 秒のランダム値です。
-
指数減衰再試行:176 回再試行します。再試行間隔は指数関数的に増加し、最大で 512 秒になります。総再試行時間は 1 日です。再試行間隔は 1、2、4、8…と 512 秒まで増加します。
-
-
デッドレタープロセスポリシー
最大再試行回数に達してもイベントが配信されない場合、EventBridge はデフォルトでイベントを破棄します。イベントを保持したい場合は、デッドレターキューに送信するように構成できます。EventBridge は、以下のデッドレターキューをサポートしています:ApsaraMQ for RocketMQ、Simple Message Queue (formerly MNS)、ApsaraMQ for Kafka、および EventBridge です。
-
フォールトトレランスポリシー
イベントを順序通りに処理する必要がある場合、例外が発生したときにタスクを一時停止し、イベントが正常にプッシュされるまで待機する必要があります。そうしないと、イベントが順不同で処理される可能性があります。この場合、フォールトトレランスの禁止を選択します。順序性を必要としないシナリオでは、最大同時プッシュ能力を確保するために、フォールトトレランスの許可を選択することを推奨します。
-
フォールトトレランスの許可:例外が発生した場合、実行はブロックされません。再試行ポリシーが使い果たされた後、メッセージは構成に基づいてデッドレターキューに配信されるか、破棄されます。
-
フォールトトレランスの禁止:例外が発生し、再試行ポリシーが使い果たされた場合、実行がブロックされます。
-