Event Grid 네임스페이스의 MQTT 및 HTTP 호스트 이름에 사용자 지정 도메인 이름 할당

Event Grid 네임스페이스는 만들 때 자동으로 HTTP 호스트 이름이 할당됩니다. 네임스페이스에서 MQTT를 사용하는 경우 MQTT 호스트 이름도 네임스페이스에 할당됩니다. 클라이언트는 이러한 호스트 이름을 사용하여 Event Grid 네임스페이스와 통신합니다.

기본 호스트 이름과 함께 Event Grid 네임스페이스의 MQTT 호스트 이름과 HTTP 호스트 이름에 사용자 지정 도메인 이름을 할당할 수 있습니다. 사용자 지정 도메인 구성은 보안 및 규정 준수 요구 사항을 충족하는 데 도움이 될 뿐만 아니라 이미 도메인에 연결된 클라이언트를 수정할 필요가 없습니다.

필수 조건

네임스페이스에 사용자 지정 도메인을 사용하려면 다음 필수 구성 요소가 필요합니다.

  • 자신이 소유하고 DNS(Domain Name System) 레코드를 수정할 수 있는 사용자 지정 도메인입니다. DNS 레코드를 수정하려면 GoDaddy와 같은 도메인 공급자의 DNS 레지스트리에 대한 액세스 권한이 필요합니다.
  • 공용 또는 프라이빗 CA의 사용자 지정 도메인에 대한 SSL(Secure Sockets Layer) 인증서입니다.
  • 사용자 지정 도메인에 대한 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. Event Grid 네임스페이스는 사용자 지정 도메인의 소유권을 증명하는 데 사용하는 TXT 레코드를 생성합니다.
  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> " 
    

    참고 항목

    인증서에는 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 Grid 네임스페이스로 이동

  2. Event Grid 네임스페이스 페이지의 왼쪽 탐색 메뉴에서 사용자 지정 도메인을 선택합니다.

  3. 사용자 지정 도메인 페이지에서 + 사용자 지정 도메인을 선택합니다.

    + 사용자 지정 도메인 단추가 선택된 Azure Event Grid 네임스페이스에 대한 사용자 지정 도메인 페이지를 보여 주는 스크린샷.

  4. 사용자 지정 도메인 추가 페이지에서 다음 속성의 값을 지정합니다.

    1. 도메인 이름: Event Grid 네임스페이스 호스트 이름 중 하나에 할당될 정규화된 도메인 이름입니다.

    2. 연결된 호스트 이름 형식: 사용자 지정 도메인 이름과 연결될 기본 호스트 이름 형식입니다.

    3. 인증서 URL: Azure Key Vault에 있는 서버 인증서의 인증서 식별자입니다. 인증서 식별자의 마지막 세그먼트를 제외하여 인증서의 기본 식별자만 포함합니다. 구독에서 인증서와 키 자격 증명 모음을 선택하는 대신 키 자격 증명 모음을 사용하여 인증서 선택을 선택할 수 있습니다.

    4. 관리 ID: 만들어진 서버 인증서에 액세스하기 위해 Key Vault로 인증하는 데 사용되는 관리 ID입니다.

    5. 추가 선택

      사용자 지정 도메인 추가 페이지를 보여 주는 스크린샷.

  5. 사용자 지정 도메인 소유권을 증명하기 위해 이 값을 사용해야 하므로 TXT 레코드를 저장합니다.

Azure CLI 예제

사용자 지정 도메인 구성으로 네임스페이스를 업데이트하려면 다음 명령을 사용합니다. 다음 개체에는 두 가지 다른 customDomains 구성이 포함되어 있습니다. topicSpacesConfiguration 아래의 구성은 MQTT 엔드포인트에 할당되고, topicsConfiguration 아래의 구성은 HTTP 엔드포인트에 할당됩니다.

참고 항목

각 사용자 지정 도메인 구성은 동일한 지역 내에서 고유해야 합니다.

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 Key Vault의 이름입니다.
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를 만들면 도메인 이름의 소유권이 확인됩니다. TTL(Time to Live)을 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"
                          }
                      }
                  ]
              }
          }
      }