Kubernetes 上の Azure Event Grid でクラウド イベントを Webhook にルーティングする

このクイックスタートでは、Kubernetes 上の Event Grid でトピックを作成し、トピックのサブスクリプションを作成し、サンプル イベントをトピックに送信してシナリオをテストします。

重要

Azure Arc を使用した Kubernetes 上の Event Grid は、現在パブリック プレビュー中です。 このプレビュー バージョンはサービス レベル アグリーメントなしで提供されています。運用環境のワークロードに使用することはお勧めできません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

前提条件

  1. Kubernetes クラスターを Azure Arc に接続する
  2. Kubernetes クラスターに Event Grid 拡張機能をインストールする。 この拡張機能によって、Event Grid を Kubernetes クラスターにデプロイします。

カスタムの場所を作成する

Azure の場所の拡張としてカスタムの場所を使用すると、Event Grid トピックのようなリソースをデプロイするターゲットの場所として、Azure Arc 対応 Kubernetes クラスターを使用できます。 カスタムの場所はクラスター内の名前空間を表し、トピックとイベント サブスクリプションをデプロイする場所となります。 このセクションでは、カスタムの場所を作成します。

  1. Azure Arc クラスター、リソース グループ、カスタムの場所の名前の値を保持するため、次の変数を宣言します。 これらのステートメントをエディターにコピーし、値を置き換え、コピーして bash ウィンドウに貼り付けます。

    resourcegroupname="<AZURE RESOURCE GROUP NAME>"
    arcclustername="<AZURE ARC CLUSTER NAME>"
    customlocationname="<CUSTOM LOCATION NAME>"
    
  2. Azure Arc に接続されたクラスターのリソース ID を取得します。 コマンドを実行する前に、Azure Arc クラスターの名前とリソース グループ パラメーターの値を更新します。

    hostresourceid=$(az connectedk8s show -n $arcclustername -g $resourcegroupname --query id -o tsv)    
    
  3. Event Grid 拡張機能のリソース ID を取得します。 このステップでは、Event Grid 拡張機能に指定した名前が eventgrid-ext であるものとします。Azure Arc クラスターとリソース グループの名前を更新してから、コマンドを実行します。

    clusterextensionid=$(az k8s-extension show --name eventgrid-ext --cluster-type connectedClusters -c $arcclustername -g $resourcegroupname  --query id -o tsv)    
    
  4. 前の手順の 2 つの値を使用して、カスタムの場所を作成します。 コマンドを実行する前に、カスタムの場所とリソース グループの名前を更新します。

    az customlocation create -n $customlocationname -g $resourcegroupname --namespace arc --host-resource-id $hostresourceid --cluster-extension-ids $clusterextensionid    
    
  5. カスタムの場所のリソース ID を取得します。 コマンドを実行する前に、カスタムの場所の名前を更新します。

    customlocationid=$(az customlocation show -n $customlocationname -g $resourcegroupname --query id -o tsv)    
    

    カスタムの場所の作成の詳細については、「Azure Arc 対応 Kubernetes にカスタムの場所を作成および管理する」を参照してください。

トピックを作成する

このセクションでは、前のステップで作成したカスタムの場所にトピックを作成します。 コマンドを実行する前に、リソース グループと Event Grid トピックの名前を更新してください。 米国東部以外の場所を使用している場合は、場所を更新します。

  1. トピック名を保持するための変数を宣言します。

    topicname="<TOPIC NAME>"
    
  2. 次のコマンドを実行して、トピックを作成します。

    az eventgrid topic create -g $resourcegroupname --name $topicname --kind azurearc --extended-location-name $customlocationid --extended-location-type customlocation --input-schema CloudEventSchemaV1_0 --location $region    
    

    CLI コマンドの詳細については、「az eventgrid topic create」を参照してください。

メッセージ エンドポイントの作成

カスタム トピックのサブスクリプションを作成する前に、イベント メッセージのエンドポイントを作成します。 通常、エンドポイントは、イベント データに基づくアクションを実行します。 このクイックスタートを簡素化するために、イベント メッセージを表示する構築済みの Web アプリをデプロイします。 デプロイされたソリューションには、App Service プラン、App Service Web アプリ、および GitHub からのソース コードが含まれています。

  1. この記事ページで [Deploy to Azure](Azure にデプロイ) を選択して、ソリューションを自分のサブスクリプションにデプロイします。 Azure portal で、パラメーターの値を指定します。

    Button to deploy the Resource Manager template to Azure.

  2. デプロイが完了するまでに数分かかる場合があります。 デプロイが成功した後で、Web アプリを表示して、実行されていることを確認します。 Web ブラウザーで https://<your-site-name>.azurewebsites.net にアクセスします

    デプロイが失敗した場合は、エラー メッセージを確認してください。 Web サイト名が既に取得されていることが原因である可能性があります。 テンプレートを再度デプロイし、サイトに別の名前を選択します。

  3. サイトは表示されますが、イベントはまだ送信されていません。

    View new site

サブスクリプションの作成

サブスクライバーは、トピックに発行されたイベントの受信登録ができます。 イベントを受信するには、関心のあるトピックの Event Grid サブスクリプションを作成する必要があります。 イベント サブスクリプションでは、これらのイベントが送信される宛先を定義します。 サポートされているすべての宛先またはハンドラーの詳細については、「イベント ハンドラー」を参照してください。

WebHook (HTTPS エンドポイント) の宛先を使用してイベント サブスクリプションを作成するには、イベント サブスクリプションの名前を入力し、Web サイトの名前を更新して、次のコマンドを実行します。

topicid=$(az eventgrid topic show --name $topicname --resource-group $resourcegroupname --query id -o tsv)
az eventgrid event-subscription create --name <EVENT SUBSCRIPTION NAME> --source-resource-id $topicid --endpoint https://<SITE NAME>.azurewebsites.net/api/updates

CLI コマンドの詳細については、「az eventgrid event-subscription create」を参照してください。

トピックにイベントを送信する

  1. 次のコマンドを実行して、トピックのエンドポイントを取得します。コマンドをコピーして貼り付けた後、コマンドを実行する前にトピック名リソース グループ名を更新してください。 このトピック エンドポイントにサンプル イベントを発行します。

    az eventgrid topic show --name $topicname -g $resourcegroupname --query "endpoint" --output tsv
    
  2. 次のコマンドを実行して、カスタム トピックのキーを取得します。コマンドをコピーして貼り付けた後、コマンドを実行する前にトピック名リソース グループ名を更新してください。 これはトピックの主キーです。 このキーを Azure portal から取得するには、 [Event Grid トピック] ページの [アクセス キー] タブに切り替えます。 カスタム トピックにイベントを投稿できるようにするには、アクセス キーが必要です。

    az eventgrid topic key list --name $topicname -g $resourcegroupname --query "key1" --output tsv
    
  3. 次の Curl コマンドを実行して、イベントを送信します。 コマンドを実行する前に、手順 1 および 2 で指定したエンドポイントの URL とキーを指定します。

    curl  -k -X POST -H "Content-Type: application/cloudevents-batch+json" -H "aeg-sas-key: <KEY_FROM_STEP_2>" -g <ENDPOINT_URL_FROM_STEP_1> \
    -d  '[{ 
          "specversion": "1.0",
          "type" : "orderCreated",
          "source": "myCompanyName/us/webCommerceChannel/myOnlineCommerceSiteBrandName",
          "id" : "eventId-n",
          "time" : "2020-12-25T20:54:07+00:00",
          "subject" : "account/acct-123224/order/o-123456",
          "dataSchema" : "1.0",
          "data" : {
             "orderId" : "123",
             "orderType" : "PO",
             "reference" : "https://www.myCompanyName.com/orders/123"
          }
    }]'
    

    手順 1 のトピック エンドポイント URL がプライベート IP アドレスの場合 (Event Grid ブローカーのサービスの種類が ClusterIP の場合など)、クラスター内の別のポッド内から Curl を実行して、その IP アドレスにアクセスできます。 たとえば、次の手順を実行できます。

    1. 次の構成でマニフェスト ファイルを作成します。 必要に応じて、dnsPolicy を調整することもできます。 詳細については、「Service と Pod に対する DNS」を参照してください。

      apiVersion: v1
      kind: Pod
      metadata:
          name: test-pod2
      spec:
          containers:
            - name: nginx
              image: nginx
          hostNetwork: true
          dnsPolicy: ClusterFirstWithHostNet       
      
    2. ポッドを作成します。

          kubectl apply -f <name_of_your_yaml_manifest_file>
      
    3. ポッドが実行されていることを確認します。

          kubectl get pod test-pod
      
    4. コンテナーからシェル セッションを開始します。

          kubectl exec --stdin --tty test-pod -- /bin/bash
      

    この時点で、クラスター内の実行中のコンテナーからのシェル セッションが開始され、前の手順で説明した Curl コマンドを実行できます。

    注意

    プログラミング言語を使用してクラウド イベントを送信する方法については、次のサンプルを参照してください。

Event Grid ビューアーでの確認

以上でイベントがトリガーされ、そのメッセージが、Event Grid によってサブスクライブ時に構成したエンドポイントに送信されました。 Web アプリを表示して、送信したイベント確認します。

View received event in Event Grid Viewer

次のステップ

次の記事をご覧ください。