このトピックでは、EventBridgeを使用してElastic Compute Service (ECS) イベントをサブスクライブし、そのイベントをダウンストリームサービスに配信する方法について説明します。
背景情報
EventBridgeは、Alibaba Cloudのイベントを一元管理するためのプラットフォームです。 EventBridgeは、標準のCloudEvents 1.0仕様を使用して、クラウドサービスとアプリケーションを接続します。 EventBridgeを使用して、クラウドサービス、Software as a Service (SaaS) サービス、およびビジネスアプリケーションで生成されるイベントを管理できます。 EventBridgeは、99.99999999% のデータ信頼性と99.95% のサービス可用性を提供します。 これにより、アップストリームクラウドサービスからのイベントの品質、イベントサブスクリプションでのユーザーエクスペリエンス、およびデータ配信の信頼性が保証されます。
ECSが提供するDescribeInstanceHistoryEvents
APIと比較して、EventBridgeが提供するイベントサブスクリプション機能には次の利点があります。
より高い適時性: 特定のタイプのイベントが検出されると、特定の操作をミリ秒以内にトリガーできます。
低コスト: イベントが生成されるかどうかを確認するために定期的なポーリングは必要ありません。 これは不必要なコストを防ぐ。
シナリオ
特定のタイプのECSイベントを購読し、そのイベントを使用してDingTalk、Short Message Service、およびAlibaba Mailからの通知の送信をトリガーします。
特定のタイプのECSイベントを、インターネット経由または仮想プライベートクラウド (VPC) 内のダウンストリームHTTPまたはHTTPSサービスにプッシュします。
複数のAlibaba Cloudアカウントで生成されたECSイベントを集約します。
特定のタイプのECSイベントが発生したら、Function Computeを使用して特定の操作をトリガーします。
ECSイベントのレイテンシが高く、ECSイベントの数が多い場合は、イベントをSimple Message Queue (formerly MNS) (SMQ) に配信し、SMQを使用してイベントをサブスクライブします。
前提条件
EventBridgeがアクティブ化され、必要な権限がResource Access Management (RAM) ユーザーに付与されます。 詳細については、「EventBridgeの有効化とRAMユーザーへの権限付与」をご参照ください。
DingTalkチャットボットが作成されます。 DingTalkチャットボットのwebhook URLとシークレットトークンが記録されます。
function Computeで関数とサービスが作成されます。 詳細については、「サービスの管理」および「機能の管理」をご参照ください。
SMQが起動され、SMQキューが作成される。 詳細については、「SMQを有効にしてRAMユーザーにSMQへのアクセスを許可する」および「キューベースのメッセージングを開始する」をご参照ください。
手順1: システムイベントバスの選択
デフォルトでは、EventBridgeは名前がdefaultのシステムイベントバスを作成します。 Alibaba Cloudサービスで生成されたイベントは、さまざまなチャネルを使用してリアルタイムでシステムイベントバスに配信されます。 システムイベントバス上のイベントを照会してサブスクライブすることができます。
EventBridgeコンソールにログインします。 左側のナビゲーションウィンドウで、[イベントバス] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。
[イベントバス] ページで、システムイベントバスを見つけ、その名前 [default] をクリックします。
ステップ2: ECSイベントのサブスクリプションルールの作成
システムイベントバスの詳細ページの左側のナビゲーションウィンドウで、[イベントルール] をクリックし、[ルールの作成] をクリックします。
[ルールの作成] ウィザードで、次の手順を実行します。
[基本情報の設定] ステップで、[名前] フィールドにルール名を入力し、[説明] フィールドにルールの説明を入力します。 [次のステップ] をクリックします。
[イベントパターンの設定] ステップで、パラメーターを設定し、[次のステップ] をクリックします。 次の項目は、パラメータについて説明します。
[イベントソースタイプ] パラメーターに Alibaba Cloud サービスイベントソース を選択します。
[イベントソース] ドロップダウンリストから [acs.ecs Elastic Compute Service (ECS)] を選択します。
[イベントタイプ] ドロップダウンリストから、購読するイベントのタイプを選択します。 複数の種類のイベントを選択できます。
[イベントパターンのデバッグ] コードエディターで、サブスクライブするイベントのサンプルコードを表示できます。 たとえば、[イベントタイプ] ドロップダウンリストから [ecs:Instance:StateChange Instance Status Changes Within Lifecycle] を選択した場合、次のサンプルコードが [イベントパターンデバッグ] コードエディターに表示されます。
{ "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: ECSイベントをSMQにプッシュする
イベントのレイテンシが高く、イベントの数が多いシナリオでは、SMQを使用してイベントをサブスクライブできます。 SMQの課金については、「課金」をご参照ください。
サービスタイプ: [SMQ] を選択します。
キュー: 作成したSMQキューを選択します。
メッセージ本文 : [完了イベント] を選択します。
Base64 デコードの有効化: [はい] を選択します。 Base64エンコードを有効にすると、データは宛先SMQキューに配信される前にBase64形式でエンコードされます。
サービスタイプパラメーターをSMQに設定した場合、NetworkInterfaceDemo.zipファイルをダウンロードしてSMQメッセージをリッスンし、イベントを取得できます。
シナリオ2: DingTalkへのECSイベントのプッシュ
サービスタイプ: [DingTalk] を選択します。
アドレス: DingTalkチャットボットのwebhook URLを入力します。
秘密鍵: DingTalkチャットボットのキーを入力します。
プッシュ内容: カスタムテンプレートを指定してから、テンプレートでDingTalkチャットボットにプッシュするECSイベントパラメーターを指定できます。 たとえば、instanceNameパラメーターとstateパラメーターを設定し、パラメーターをDingTalkチャットボットにプッシュできます。 サンプルコード:
変数: JSONPathを使用して、プッシュするECSイベントパラメーターに関するフィールド情報を取得し、変数名を指定します。
{ "instanceName":"$.data.instanceName", "state":"$.data.state" }
テンプレート: DingTalkチャットボットで必要な形式でテンプレートを定義し、変数コードエディターで定義されている変数をテンプレートに導入します。
{ "msgtype": "text", "text": { "content": "${instanceName} state is ${state}" } }
シナリオ3: ECSイベントをダウンストリームのHTTPまたはHTTPSサービスにプッシュする
サービスタイプ: [HTTP] または [HTTPS] を選択します。
URL: イベントの受信に使用するURLを指定します。
Body: 受信するイベントの内容を指定します。 EventBridgeを使用すると、イベントを必要な形式に変換してから、送信先のHTTPサービスにイベントをプッシュできます。 有効な値: Complete Event、Partial Event、Fixed Value、Template。 詳細については、「イベント変換」をご参照ください。
ネットワークタイプ:
インターネット: インターネット経由で宛先URLにアクセスします。
VPC: 宛先URLでインターネットアクセスが有効になっていない場合、この値を選択できます。 この値を選択した場合、VPC、vSwitch、およびセキュリティグループのパラメーターを設定する必要があります。
シナリオ4: 特定のタイプのECSイベントをプッシュして操作をトリガーする
特定のタイプのECSイベントが発生したときに特定の操作をトリガーする場合は、移行先サービスとしてFunction Computeを選択します。 これにより、指定されたタイプのECSイベントをFunction Compute関数にプッシュし、関数のコードでトリガーする操作を指定できます。
サービスタイプ: [Function Compute] を選択します。
サービス: Function Computeで作成したサービスの名前を選択します。
関数: Function Computeで作成した関数の名前を選択します。
イベント: 受信するイベントの内容を指定します。 EventBridgeを使用すると、イベントを必要な形式に変換してから、イベントをFunction Computeにプッシュできます。 有効な値: Complete Event、Partial Event、Fixed Value、Template。 詳細については、「イベント変換」をご参照ください。
実行方法:
同期: イベントがFunction Computeによって受信され、関数によって処理された場合にのみ、リクエストが成功したと見なされます。
Asynchronous: Function Computeがイベントを受信した後、リクエストは成功したと見なされます。
詳細については、「Function Computeへのイベントのルーティング」をご参照ください。
シナリオ5: 複数のAlibaba Cloudアカウントで生成されたECSイベントの集計
EventBridgeを使用すると、さまざまなAlibaba Cloudアカウントおよびリージョンで生成されたECSイベントを、特定のリージョンの1つのAlibaba Cloudアカウントを使用して作成されたイベントバスに集約できます。 この場合、移行先サービスとしてEventBridgeを選択する必要があります。
ターゲットタイプ:
同一アカウントのイベントバス: 同じAlibaba Cloudアカウントを使用して作成された別のイベントバスにイベントを配信します。
クロスアカウントイベントバス: 別のAlibaba Cloudアカウントを使用して作成されたイベントバスにイベントを配信します。 クロスアカウントのイベントバスを選択した場合、RAMユーザーに必要な権限を付与する必要があります。 詳細については、「EventBridgeへのイベントのルーティング」をご参照ください。
リージョン: 中国本土のリージョンで作成されたイベントは中国本土の別のリージョンにのみ配信でき、中国本土以外のリージョンで作成されたイベントは中国本土以外の別のリージョンにのみ配信できます。
イベントバズ: イベントを配信するイベントバスの名前を選択します。
イベント: デフォルト値のComplete Eventを使用します。 このパラメーターの値は変更できません。
[ターゲットの設定] ステップの [再試行ポリシーと無効文字キュー] セクションでは、ビジネス要件に基づいて再試行ポリシーと無効文字キューを指定できます。 詳細については、「ポリシーと無効キューの再試行」をご参照ください。
EventBridgeを使用してECSイベントをサブスクライブするその他のシナリオについては、「ターゲットサービスタイプ」をご参照ください。
ステップ3: イベントをトリガーする
この例では、ECS: Instance:StateChange Instance Status Changes Within Lifecycle
タイプのecsイベントがトリガーされます。 このタイプのイベントをトリガーするには、ECSインスタンスのステータスを変更する必要があります。
ECS コンソールにログインします。
左側のナビゲーションウィンドウで、 .
上部のナビゲーションバーで、管理するECSインスタンスが存在するリージョンを選択します。
管理するECSインスタンスを見つけ、インスタンスのステータスを変更するには、[操作] 列で
を選択します。
ステップ4: 配信結果の表示
指定されたタイプのECSイベントが生成されるかどうかを照会します。
EventBridgeでは、時間範囲、イベントタイプ、サブスクリプションルール名、イベントIDでECSイベントをクエリできます。 詳細については、「イベントIDによるイベントの照会」をご参照ください。
ECSイベントの配信結果を照会します。
前の手順で照会したイベントの [操作] 列の [イベントトレース] をクリックすると、配信トレースが表示されます。 配信トレースには、イベントの宛先、配信ステータス、イベントが配信された回数、およびイベントが配信された時刻が含まれます。
イベントのモニタリングとアラート
EventBridgeのダッシュボードで、サブスクライブしたECSイベントのAPI呼び出し数、配信成功率、配信待ち時間を確認できます。 ビジネス要件に基づいてアラートルールを設定できます。
CloudMonitor コンソールにログインします。
左側のナビゲーションウィンドウで、
を選択します。[クラウドサービスモニタリング] ページの左側のナビゲーションツリーで、[ミドルウェア] をクリックします。 表示されるページの [ミドルウェア] セクションで、ポインターを [EventBridge] に移動し、[EventBus] をクリックします。
EventBusページの左上隅で、リージョンを選択します。 次に、既定のイベントバスの [操作] 列で [モニタリングチャート] をクリックし、モニタリングの詳細を表示します。
表示されるページで、EventBridgeリソースのアラートルールを設定できます。 設定されたアラートルールに基づいてアラートがトリガーされると、CloudMonitorはアラート通知を送信します。 詳細については、「アラートルールの設定」をご参照ください。
再試行ポリシーとデッドレターキュー
イベントがイベントバスに書き込まれた後、EventBridgeは、イベントが少なくとも1回は下流サービスにプッシュされるようにします。 サーバーの障害、サービスの利用不能、ネットワークのジッターなどの例外により、下流のサービスが期待どおりにイベントを受信できない場合、EventBridgeでは、再試行ポリシー、フォールトトレランスポリシー、およびデットレターキューを設定して例外を処理できます。 手順2: ECSイベントのサブスクリプションルールの作成でサブスクライブしたECSイベントの再試行ポリシーと無効キューを設定して、イベントが期待どおりに配信されるようにすることができます。
再試行ポリシー
ダウンストリームサービスが期待どおりにイベントを受信できない場合、EventBridgeからプッシュされるイベントで例外が発生します。 この場合、EventBridgeコンソールでイベントの再試行ポリシーを設定して、ダウンストリームサービスへのイベント配信の成功率を最大化できます。
Backoff Retry: 失敗したイベントは最大3回まで再試行できます。 2つの連続した再試行の間隔は、10秒から20秒の間のランダムな値です。
指数減衰再試行: 失敗したイベントは、1〜512秒の範囲の増分間隔で176回再試行できます。 再試行は1日まで続くことができます。 具体的な間隔は、1秒、2秒、4秒、8秒、16秒、32秒、64秒、128秒、256秒、512秒である。 値512秒は、167の再試行に使用されます。
デッドレターキュー
指定された最大リトライ回数に達してもイベントのプッシュに失敗した場合、EventBridgeはイベントを自動的に破棄します。 イベントを保持する場合は、デットレターキューを指定して、イベントをキューに送信できます。 EventBridgeでは、ApsaraMQ for RocketMQ、SMQ、ApsaraMQ for Kafkaのキューと、EventBridgeのイベントバスをデッドレターキューとして使用できます。
フォールトトレランスポリシー
ビジネスでイベントを順番にプッシュする必要がある場合、イベントのプッシュに失敗した場合は、失敗したイベントがプッシュされるまでプッシュタスクを一時停止する必要があります。 この場合、フォールトトレランスを禁止する必要があります。 ビジネスでイベントを順番にプッシュする必要がない場合は、フォールトトレランスを許可して最大のプッシュ同時実行性を確保することを推奨します。
許容障害: 許容障害です。 イベントで例外が発生した場合、イベント処理はブロックされません。 再試行ポリシーで指定されている再試行の最大数に達した後にイベントのプッシュに失敗した場合、イベントはデットレターキューに配信されるか、破棄されます。
フォールトトレランス禁止: フォールトトレランスは許可されていません。 イベントで例外が発生し、再試行ポリシーで指定された最大再試行回数に達した後にイベントのプッシュに失敗した場合、イベント処理はブロックされます。