다음을 통해 공유


가상 네트워크에서 엔드투엔드 TLS를 사용하여 애플리케이션 노출

참고 항목

Azure Spring Apps는 Azure Spring Cloud 서비스의 새 이름입니다. 서비스에 새 이름이 지정되었지만, 자산을 업데이트하는 동안 스크린샷, 비디오, 다이어그램과 같은 일부 위치에서는 당분간 이전 이름이 표시됩니다.

이 문서의 적용 대상: ✔️ 기본/표준 ✔️ Enterprise

이 문서에서는 Application Gateway를 사용하여 애플리케이션을 인터넷에 노출하는 방법을 설명합니다. Azure Spring Apps 서비스 인스턴스를 가상 네트워크에 배포하는 경우 서비스 인스턴스의 애플리케이션은 비공개 네트워크에서만 액세스할 수 있습니다. 인터넷에서 애플리케이션에 액세스할 수 있도록 하려면 Azure Application Gateway와 통합해야 합니다.

필수 조건

  • Azure CLI 버전 2.0.4 이상을 사용하세요.
  • 기본 .private.azuremicroservices.io 도메인 접미사를 사용하여 프라이빗 네트워크를 통해 액세스할 수 있는 애플리케이션이 있는 가상 네트워크에 배포된 Azure Spring Apps 서비스 인스턴스. 자세한 내용은 가상 네트워크에 Azure Spring Apps 배포를 참조하세요.
  • 애플리케이션 액세스에 사용할 사용자 지정 도메인.
  • HTTPS 수신기를 설정하는 데 사용할 사용자 지정 도메인과 일치하는, Key Vault에 저장된 인증서. 자세한 내용은 자습서: Azure Key Vault에서 인증서 가져오기를 참조하세요.

Azure Spring Apps에 대한 Application Gateway 구성

브라우저에서 볼 수 있듯이 도메인 이름은 Application Gateway가 트래픽을 Azure Spring Apps 백 엔드로 전송하는 데 사용하는 호스트 이름과 같은 것이 좋습니다. 이 권장 사항은 Application Gateway를 사용하여 Azure Spring Apps에서 호스트되고 가상 네트워크에 상주하는 애플리케이션을 노출할 때 최상의 환경을 제공합니다. Application Gateway에 의해 노출된 도메인이 Azure Spring Apps에서 허용하는 도메인과 다른 경우 쿠키 및 생성된 리디렉션 URL 등이 손상될 수 있습니다. 자세한 내용은 호스트 이름 유지를 참조하세요.

Azure Spring Apps 앞에 Application Gateway를 구성하려면 다음 단계를 수행합니다.

  1. 가상 네트워크에 Azure Spring Apps 배포의 지침을 따릅니다.
  2. 프라이빗 네트워크에서 애플리케이션 액세스의 지침을 따릅니다.
  3. 선택한 도메인에 대한 인증서를 획득하고 Key Vault에 저장합니다. 자세한 내용은 자습서: Azure Key Vault에서 인증서 가져오기를 참조하세요.
  4. Azure Spring Apps에 배포된 앱의 Key Vault에서 사용자 지정 도메인 및 해당 인증서를 구성합니다. 자세한 내용은 자습서: Azure Spring Apps에 기존 사용자 지정 도메인 매핑을 참조하세요.
  5. 다음 목록에 따라 구성된 가상 네트워크에 Application Gateway를 배포합니다.
    • 백 엔드 풀에서 Azure Spring Apps을 사용하며, 접미사 private.azuremicroservices.io가 붙은 도메인으로 참조합니다.
    • Key Vault에서 동일한 인증서를 사용하는 HTTPS 수신기를 포함합니다.
    • 접미사 private.azuremicroservices.io가 붙은 도메인 대신, Azure Spring Apps에 구성된 사용자 지정 도메인 이름을 사용하는 HTTP 설정으로 가상 네트워크를 구성합니다.
  6. Application Gateway를 가리키도록 공용 DNS를 구성합니다.

변수 정의

이제 다음 명령을 사용하여 가상 네트워크에 Azure Spring Apps 배포의 지시대로 만든 리소스 그룹과 가상 네트워크의 변수를 정의합니다. 실제 환경에 따라 값을 사용자 지정합니다. SPRING_APP_PRIVATE_FQDN을 정의할 때 URI에서 https://를 제거합니다.

export SUBSCRIPTION='subscription-id'
export RESOURCE_GROUP='my-resource-group'
export LOCATION='eastus'
export SPRING_CLOUD_NAME='name-of-spring-cloud-instance'
export APPNAME='name-of-app-in-azure-spring-apps'
export SPRING_APP_PRIVATE_FQDN='$APPNAME.private.azuremicroservices.io'
export VIRTUAL_NETWORK_NAME='azure-spring-apps-vnet'
export APPLICATION_GATEWAY_SUBNET_NAME='app-gw-subnet'
export APPLICATION_GATEWAY_SUBNET_CIDR='10.1.2.0/24'

Azure에 로그인

다음 명령을 사용하여 Azure CLI에 로그인하고 활성 구독을 선택합니다.

az login
az account set --subscription $SUBSCRIPTION

인증서 획득

프로덕션 배포의 경우 공개적으로 서명된 인증서를 사용할 가능성이 높습니다. 이 경우 Azure Key Vault에서 인증서를 가져옵니다. 자세한 내용은 자습서: Azure Key Vault에서 인증서 가져오기를 참조하세요. 인증서에 전체 인증서 체인이 포함되어 있는지 확인합니다.

Azure Spring Apps에서 공용 도메인 이름 구성

트래픽은 퍼블릭 도메인 이름을 사용하여 Azure Spring Apps에 배포된 애플리케이션에 들어갑니다. HTTPS를 통해 이 호스트 이름을 수신 대기하도록 애플리케이션을 구성하려면 다음 명령을 사용하여 앱에 사용자 지정 도메인을 추가합니다.

export KV_NAME='name-of-key-vault'
export KV_RG='resource-group-name-of-key-vault'
export CERT_NAME_IN_AZURE_SPRING_APPS='name-of-certificate-in-Azure-Spring-Apps'
export CERT_NAME_IN_KEY_VAULT='name-of-certificate-with-intermediaries-in-key-vault'
export DOMAIN_NAME=myapp.mydomain.com

# provide permissions to Azure Spring Apps to read the certificate from Key Vault:
export VAULTURI=$(az keyvault show \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --query properties.vaultUri \
    --output tsv)

# get the object id for the Azure Spring Apps Domain-Management Service Principal:
export ASADM_OID=$(az ad sp show \
    --id 03b39d0f-4213-4864-a245-b1476ec03169 \
    --query objectId \
    --output tsv)

# allow this Service Principal to read and list certificates and secrets from Key Vault:
az keyvault set-policy \
    --resource-group $KV_RG \
    --name $KV_NAME \
    --object-id $ASADM_OID \
    --certificate-permissions get list \
    --secret-permissions get list

# add custom domain name and configure TLS using the certificate:
az spring certificate add \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --name $CERT_NAME_IN_AZURE_SPRING_APPS \
    --vault-certificate-name $CERT_NAME_IN_KEY_VAULT \
    --vault-uri $VAULTURI
az spring app custom-domain bind \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --domain-name $DOMAIN_NAME \
    --certificate $CERT_NAME_IN_AZURE_SPRING_APPS \
    --app $APPNAME

네트워크 리소스 만들기

만들어질 Azure Application Gateway는 Azure Spring Cloud 서비스 인스턴스와 동일한 가상 네트워크에 조인하거나 Azure Spring Apps 서비스 인스턴스에 대한 피어링된 가상 네트워크에 조인합니다. 먼저 az network vnet subnet create를 사용하여 가상 네트워크에 Application Gateway에 대한 새 서브넷을 만들고 az network public-ip create를 사용하여 Application Gateway의 프런트 엔드로 공용 IP 주소도 만듭니다.

export APPLICATION_GATEWAY_PUBLIC_IP_NAME='app-gw-public-ip'
az network vnet subnet create \
    --name $APPLICATION_GATEWAY_SUBNET_NAME \
    --resource-group $RESOURCE_GROUP \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --address-prefix $APPLICATION_GATEWAY_SUBNET_CIDR
az network public-ip create \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --name $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --allocation-method Static \
    --sku Standard

Application Gateway의 관리 ID 만들기

Application Gateway는 인증서를 읽기 위해 Key Vault에 액세스할 수 있어야 합니다. 이를 위해 사용자가 할당한 관리 ID를 사용합니다. 다음 명령을 사용하여 관리 ID를 만듭니다.

export APPGW_IDENTITY_NAME='name-for-appgw-managed-identity'
az identity create \
    --resource-group $RESOURCE_GROUP \
    --name $APPGW_IDENTITY_NAME

그런 다음, 관리 ID의 objectId를 가져옵니다. 나중에 Key Vault의 인증서에 대한 액세스 권한을 부여하는 데 사용됩니다.

export APPGW_IDENTITY_CLIENTID=$(az identity show \
    --resource-group $RESOURCE_GROUP \
    --name $APPGW_IDENTITY_NAME \
    --query clientId \
    --output tsv)
export APPGW_IDENTITY_OID=$(az ad sp show \
    --id $APPGW_IDENTITY_CLIENTID \
    --query objectId \
    --output tsv)

Key Vault에서 정책 설정

Application Gateway의 관리 ID가 Key Vault에 저장된 인증서에 액세스할 수 있도록 다음 명령을 사용하여 Key Vault를 구성합니다.

az keyvault set-policy \
    --name $KV_NAME \
    --resource-group $KV_RG \
    --object-id $APPGW_IDENTITY_OID \
    --secret-permissions get list \
    --certificate-permissions get list

Application Gateway 만들기

az network application-gateway create를 사용하여 애플리케이션 게이트웨이를 만들고 애플리케이션의 비공개 FQD(정규화된 도메인 이름)을 백 엔드 풀에서 서버로 지정합니다. 사용자가 할당한 관리 ID를 사용하고, 인증서의 비밀 ID를 사용하여 Key Vault 인증서를 가리켜야 합니다. 그런 다음, 공용 호스트 이름을 사용하도록 az network application-gateway http-settings update를 사용하여 HTTP 설정을 업데이트합니다.

export APPGW_NAME='name-for-application-gateway'

export KEYVAULT_SECRET_ID_FOR_CERT=$(az keyvault certificate show \
    --name $CERT_NAME_IN_KEY_VAULT \
    --vault-name $KV_NAME \
    --query sid \
    --output tsv)

az network application-gateway create \
    --name $APPGW_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --capacity 2 \
    --sku Standard_v2 \
    --frontend-port 443 \
    --http-settings-cookie-based-affinity Disabled \
    --http-settings-port 443 \
    --http-settings-protocol Https \
    --public-ip-address $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --subnet $APPLICATION_GATEWAY_SUBNET_NAME \
    --servers $SPRING_APP_PRIVATE_FQDN \
    --key-vault-secret-id $KEYVAULT_SECRET_ID_FOR_CERT \
    --identity $APPGW_IDENTITY_NAME

Azure가 애플리케이션 게이트웨이를 만들 때까지 최대 30분이 걸릴 수 있습니다.

백 엔드에 대해 도메인 이름을 사용하도록 HTTP 설정 업데이트

Azure Spring Apps로 트래픽을 보내기 위해 ".private.azuremicroservices.io" 접미사가 추가된 도메인 대신, 공용 도메인 이름을 호스트 이름으로 사용하도록 HTTP 설정을 업데이트합니다.

az network application-gateway http-settings update \
    --resource-group $RESOURCE_GROUP \
    --gateway-name $APPGW_NAME \
    --host-name-from-backend-pool false \
    --host-name $DOMAIN_NAME \
    --name appGatewayBackendHttpSettings

Application Gateway 배포 확인

만든 후에는 다음 명령을 사용하여 백 엔드 상태를 확인합니다. 이 명령의 출력을 사용하면 애플리케이션 게이트웨이가 프라이빗 FQDN을 통해 애플리케이션에 도달하는지 확인할 수 있습니다.

az network application-gateway show-backend-health \
    --name $APPGW_NAME \
    --resource-group $RESOURCE_GROUP

출력은 다음 예제와 같이 백 엔드 풀이 정상 상태임을 나타냅니다.

{
  "backendAddressPools": [
    {
      "backendHttpSettingsCollection": [
        {
          "servers": [
            {
              "address": "my-azure-spring-apps-hello-vnet.private.azuremicroservices.io",
              "health": "Healthy",
              "healthProbeLog": "Success. Received 200 status code",
              "ipConfiguration": null
            }
          ]
        }
      ]
    }
  ]
}

DNS 구성 및 애플리케이션 액세스

이제 CNAME 또는 A 레코드를 사용하여 Application Gateway를 가리키도록 공용 DNS를 구성합니다. 다음 명령을 사용하여 Application Gateway에 대한 공용 주소를 찾을 수 있습니다.

az network public-ip show \
    --resource-group $RESOURCE_GROUP \
    --name $APPLICATION_GATEWAY_PUBLIC_IP_NAME \
    --query [ipAddress] \
    --output tsv

이제 공용 도메인 이름을 사용하여 애플리케이션에 액세스할 수 있습니다.

다음 단계