Event Grid 名前空間の MQTT と HTTP のホスト名にカスタム ドメイン名を割り当てる

Event Grid 名前空間には、作成時に HTTP ホスト名が自動的に割り当てられます。 名前空間で MQTT が有効になっている場合、MQTT ホスト名も名前空間に割り当てられます。 クライアントは、これらのホスト名を使って Event Grid 名前空間と通信します。

Event Grid 名前空間の MQTT と HTTP のホスト名に、既定のホスト名と共にカスタム ドメイン名を割り当てることができます。 カスタム ドメインを構成すると、セキュリティとコンプライアンスの要件を満たすのに役立つだけでなく、ドメインに既にリンクされているクライアントを変更する必要がありません。

前提条件

名前空間でカスタム ドメインを使うには、次の前提条件が必要です。

  • 自分が所有していて、そのドメイン ネーム システム (DNS) レコードを変更できるカスタム ドメイン。 DNS レコードを変更するには、ドメイン プロバイダー (GoDaddy など) の DNS レジストリにアクセスできる必要があります。
  • パブリックまたはプライベート CA からの、カスタム ドメイン用の Secure Sockets Layer (SSL) 証明書。
  • カスタム ドメイン用の SSL 証明書をホストするための Azure Key Vault アカウント。

手順の概要

名前空間にカスタム ドメインを使うには、次の手順のようにします。

  1. カスタム ドメインを Event Grid 名前空間エンドポイントに向けさせる DNS エントリを追加します。
  2. Event Grid 名前空間でマネージド ID を有効にします。
  3. カスタム ドメイン用のサーバー証明書をホストする Azure Key Vault アカウントを作成します。
  4. 名前空間のマネージド ID に Azure Key Vault でのロールの割り当てを追加します。
  5. カスタム ドメイン名、証明書名、キー コンテナー インスタンスの参照を指定して、Event Grid 名前空間とカスタム ドメインを関連付けます。
  6. ユーザーがカスタム ドメインの所有権を証明するために使う TXT レコードが、Event Grid 名前空間によって生成されます。
  7. 前のステップで Event Grid によって生成された値に基づいて TXT レコードを作成し、ドメインの所有権を証明します。
  8. Event Grid は、クライアントが使うカスタム ドメインをアクティブにする前に、カスタム ドメインの TXT レコードを検証します。
  9. クライアントは、カスタム ドメインを介して Event Grid 名前空間に接続できます。

制限事項

  • カスタム ドメインの構成は、MQTT と HTTP のホスト名全体について、リージョンごとに一意です。
  • 同じ名前空間に含まれる MQTT と HTTP のホスト名で、カスタム ドメインの構成を同じにすることはできません。
  • カスタム ドメインの構成は、同じリージョン内の名前空間に対するどの MQTT または HTTP ホスト名とも、競合することはできません。

DNS エントリを追加する

ドメインに関連付ける Event Grid 名前空間のホスト名を指す DNS レコードをドメインに作成します。 詳しくは、「Azure クラウド サービスのカスタム ドメイン名の構成」をご覧ください。

名前空間の HTTP ホスト名の形式は次のとおりです: <namespace name>.centraluseuap-1.eventgrid.azure.net

名前空間の MQTT ホスト名の形式は次のとおりです: <namespace name>.centraluseuap-1.ts.eventgrid.azure.net

Event Grid 名前空間でマネージド ID を有効にする

名前空間は、マネージド ID を使用して Azure Key Vault インスタンスにアクセスし、カスタム ドメインのサーバー証明書を取得します。 次のコマンドを使って、Event Grid 名前空間でシステム割り当てマネージド ID を有効にします。

az eventgrid namespace update --resource-group <resource group name> --name <namespace name> --identity "{type:systemassigned}" 

Azure portal を使用したシステムとユーザー割り当て ID の構成の詳細については、「Event Grid 名前空間でマネージド ID を有効にする」を参照してください。

Azure Key Vault アカウントを作成し、サーバー証明書をアップロードします

  1. 次のコマンドを使って Azure Key Vault アカウントを作成します。

    az keyvault create --name "<your-unique-keyvault-name>" --resource-group "<resource group name>" --location "centraluseaup" 
    
  2. 次のコマンドを使って、証明書を Azure Key Vault にインポートします

    az keyvault certificate import --vault-name "<your-key-vault-name>" -n "<cert name>" -f "<path to your certificate pem file> " 
    

    Note

    証明書では、DNS のサブジェクトの別名にドメイン名が含まれている必要があります。 詳細については、「チュートリアル: Azure Key Vault に証明書をインポートする」を参照してください。

名前空間のマネージド ID に Azure Key Vault でのロールの割り当てを追加する

次の手順を使って、Azure Key Vault アカウントにアクセスするためのアクセス権を、名前空間に提供する必要があります。

  1. 次のコマンドを使って、Event Grid 名前空間のシステム マネージド ID のプリンシパル ID を取得します

    $principalId=(az eventgrid namespace show --resource-group <resource group name> --name <namespace name> --query identity.principalId -o tsv) 
    
  2. Azure Key Vault リソース ID を取得します。

    $keyVaultResourceId=(az keyvault show --resource-group <resource group name> --name <your key vault name> --query id -o tsv) 
    
  3. 名前空間のマネージド ID に対し、Key Vault でのロールの割り当てを追加します。

    az role assignment create --role "Key Vault Certificate User" --assignee $principalId --scope $keyVaultResourceId 
    

    Key Vault アクセスとポータルでの操作の詳細については、「Azure のロールベースのアクセス制御を使用して Key Vault のキー、証明書、シークレットへのアクセス権を付与する」を参照してください。

Event Grid 名前空間とカスタム ドメインを関連付ける

このステップでは、検証されていないカスタム ドメインと名前空間を関連付けますが、次のステップでユーザーがカスタム ドメインの所有権を証明するまで、それを使うことはできません。

Azure Portal の使用

次の手順のようにして、カスタム ドメインを追加します。

  1. Azure portal で、Event Hubs 名前空間に移動します

  2. [Event Grid 名前空間] ページの左側のナビゲーション メニューで [カスタム ドメイン] を選びます。

  3. [カスタム ドメイン] ページで、[+ カスタム ドメイン] を選びます。

    [+ カスタム ドメイン] ボタンが選ばれている Azure Event Grid 名前空間の [カスタム ドメイン] ページを示すスクリーンショット。

  4. [カスタム ドメインの追加] ページで、次のプロパティの値を指定します。

    1. [ドメイン名]: Event Grid 名前空間のホスト名の 1 つに割り当てる完全修飾ドメイン名。

    2. [関連付けられているホスト名の種類]: カスタム ドメイン名に関連付ける既定のホスト名の種類。

    3. [証明書 URL]: Azure Key Vault 内のサーバー証明書の証明書識別子。 証明書識別子の最後のセグメントを除外して、証明書の基本識別子のみを含めます。 [キー コンテナーを使用して証明書を選択する] を選ぶと、サブスクリプションから証明書とキー コンテナーを選択できます。

    4. [マネージド ID]: 作成されたサーバー証明書にアクセスするための、Key Vault での認証に使われる ID。

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

      [カスタム ドメインの追加] ページを示すスクリーンショット。

  5. カスタム ドメインの所有権を証明するためにその値を使う必要があるので、TXT レコードを保存しておきます。

Azure CLI の例

次のコマンドを使って、カスタム ドメインの構成で名前空間を更新します。 次のオブジェクトには、2 つの異なる customDomains 構成が含まれます。topicSpacesConfiguration の構成は MQTT エンドポイントに割り当てられ、topicsConfiguration の構成は HTTP エンドポイントに割り当てられます。

Note

各カスタム ドメインの構成は、同じリージョン内で一意である必要があります。

az resource create --resource-type Microsoft.EventGrid/namespaces --id /subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/namespaces/<Namespace Name> --is-full-object --properties @./resources/NS.json 

NS.json

{
    "properties": {
        "topicsConfiguration": {
            "hostname": "HOSTNAME",
            "customDomains": [
                {
                    "fullyQualifiedDomainName": "www.HTTPDOMAINNAME.com",
                    "identity": {
                        "type": "SystemAssigned"
                    },
                    "certificateInfo": {
                        "keyVaultArmId": " /subscriptions/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.KeyVault/vaults/KEYVAULTNAME",
                        "certificateName": "CERTIFICATENAME"
                    }
                }
            ]
        },
        "topicSpacesConfiguration": {
            "state": " Enabled",
            "routeTopicResourceId": " /subscriptions/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.EventGrid/namespaces/NAMESPACENAME/topics/TOPICNAME",
            "hostname": "NAMESPACENAME.westus2-1.ts.eventgrid.azure.net",
            "routingIdentityInfo": {
                "type": "None"
            },
            "customDomains": [
                {
                    "fullyQualifiedDomainName": " www.MQTTDOMAINNAME.com ",
                    "identity": {
                        "type": "SystemAssigned"
                    },
                    "certificateInfo": {
                        "keyVaultArmId": "/subscriptions/SUBSCRIPTIONNAME/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.KeyVault/vaults/KEYVAULTNAME",
                        "certificateName": "CERTIFICATENAME"
                    }
                }
            ]
        }
    }
}

次のプレースホルダーを適切な値に置き換え、NS.json という名前のファイルに保存して、CLI コマンドを実行します。

プレースホルダー 説明
HOSTNAME ホスト名は、Azure portal の Event Grid 名前空間の [概要] ページでわかります。
NAMESPACENAME Event Grid 名前空間の名前。
TOPICNAME 名前空間内のトピックの名前。
HTTPDOMAINNAME HTTP ドメインの名前。
MQTTDOMAINNAME MQTT ドメインの名前。
SUBSCRIPTIONID Azure サブスクリプション ID。
RESOURCEGROUPNAME Azure リソース グループの名前。
KEYVAULTNAME キー コンテナーの名前。
CERTIFICATENAME 証明書の名前。

ID の種類 (type) は、SystemAssigned または UserAssigned にできます。 UserAssigned を選んだ場合は、userAssignedIdentity プロパティを使ってユーザー割り当て ID を指定します。

この操作に対する応答には、expectedTxtRecordNameexpectedTxtRecordValue プロパティの形式で DNS の情報が含まれます。 カスタム ドメインの所有権を証明するためにその値を使う必要があるので、この情報を保存しておきます。 応答のサンプルを次に示します。

{
    "properties": {
        "topicsConfiguration": {
            "hostname": "HOSTNAME",
            "customDomains": [
                {
                    "fullyQualifiedDomainName": "www.HTTPDOMAINNAME.com",
                    "validationState": "Pending",
                    "identity": {
                        "type": "SystemAssigned"
                    },
                    "certificateInfo": {
                        "keyVaultArmId": " /subscriptions/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.KeyVault/vaults/KEYVAULTNAME",
                        "certificateName": "CERTIFICATENAME"
                    },
                    "expectedTxtRecordName": "_eg. www.contoso-http.com",
                    "expectedTxtRecordValue": "<random string>"
                }
            ]
        },
        "topicSpacesConfiguration": {
            "state": " Enabled",
            "routeTopicResourceId": " /subscriptions/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.EventGrid/namespaces/MSNS/topics/TOPICNAME",
            "hostname": "HOSTNAME",
            "routingIdentityInfo": {
                "type": "None"
            },
            "customDomains": [
                {
                    "fullyQualifiedDomainName": " www.MQTTDOMAINNAME.com ",
                    "validationState": "Pending",
                    "identity": {
                        "type": "SystemAssigned"
                    },
                    "certificateInfo": {
                        "keyVaultArmId": "/subscriptions/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.KeyVault/vaults/KEYVAULTNAME",
                        "certificateName": "CERTIFICATENAME"
                    },
                    "expectedTxtRecordName": "_eg. www.contoso-mqtt.com",
                    "expectedTxtRecordValue": "<random string>"
                }
            ]
        }
    }
}

カスタム ドメインの所有権を証明する

ドメインの所有権を証明するには、次の手順のようにします。

  1. DNS 情報を追加します

    ドメイン レジストラーに戻り、前のステップでコピーした DNS 情報に基づいて、ドメインの新しい TXT レコードを作成します。 ドメインのこの TXT を作成すると、ドメイン名の所有権が立証されます。 Time to Live (TTL) を 3,600 秒 (60 分) に設定してから、レコードを保存します。

  2. カスタム ドメイン名を検証します

    1. Azure portal を使うには、次の手順のようにしてカスタム ドメインを検証します。

      1. [カスタム ドメイン] ページで、[ドメインの検証] を選びます。
      2. [ドメインの検証] ページで、[検証] を選びます。
    2. 次のコマンドを使って、同じカスタム ドメインの構成で名前空間を更新します。 このコマンドは、カスタム ドメインの所有権の検証をトリガーします。 ドメインを検証するには、その前に DNS レコードが伝達される必要があり、DNS 設定の伝達時間はドメイン レジストラーによって異なります。

      コマンドへの応答で、validationStateApproved であることを確認します。

      az resource create --resource-type Microsoft.EventGrid/namespaces --id /subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/namespaces/<Namespace Name> --is-full-object --properties @./resources/NS.json 
      

      NS.json:

      {
          "properties": {
              "topicsConfiguration": {
                  "hostname": "HOSTNAME",
                  "customDomains": [
                      {
                          "fullyQualifiedDomainName": "www.HTTPDOMAINNAME.com",
                          "identity": {
                              "type": "SystemAssigned"
                          },
                          "certificateInfo": {
                              "keyVaultArmId": " /subscriptions/AZURESUBCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.KeyVault/vaults/KEYVAULTNAME",
                              "certificateName": "CERTIFICATENAME"
                          }
                      }
                  ]
              },
              "topicSpacesConfiguration": {
                  "state": " Enabled",
                  "routeTopicResourceId": " /subscriptions/AZURESUBSCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.EventGrid/namespaces/NAMESPACENAME/topics/TOPICNAME",
                  "hostname": "HOSTNAME",
                  "routingIdentityInfo": {
                      "type": "None"
                  },
                  "customDomains": [
                      {
                          "fullyQualifiedDomainName": "www.MQTTDOMAINNAME.com ",
                          "identity": {
                              "type": "SystemAssigned"
                          },
                          "certificateInfo": {
                              "keyVaultArmId": "/subscriptions/AZURESUBSCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.KeyVault/vaults/KEYVAULTNAME",
                              "certificateName": "CERTIFICATENAME"
                          }
                      }
                  ]
              }
          }
      }