다음을 통해 공유


Application Gateway에서 TLS 종료를 사용하여 애플리케이션을 인터넷에 노출

참고 항목

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

이 문서에서는 Application Gateway를 사용하여 애플리케이션을 인터넷에 노출하는 방법을 설명합니다.

Azure Spring Apps 서비스 인스턴스를 VNET(가상 네트워크)에 배포하는 경우 서비스 인스턴스의 애플리케이션은 비공개 네트워크에서만 액세스할 수 있습니다. 인터넷에서 애플리케이션에 액세스할 수 있도록 하려면 Azure Application Gateway와 통합해야 합니다. 들어오는 암호화된 트래픽은 애플리케이션 게이트웨이에서 암호 해독되거나 엔드투엔드 TLS/SSL을 달성하기 위해 암호화된 Azure Spring Apps에 전달될 수 있습니다. 개발 및 테스트 목적으로 이 가이드에 설명된 애플리케이션 게이트웨이에서 SSL 종료로 시작할 수 있습니다. 프로덕션의 경우 가상 네트워크에서 엔드투엔드 TLS로 애플리케이션 노출에서 설명하는 대로, 프라이빗 인증서를 사용하는 엔드투엔드 TLS/SSL을 사용하는 것이 좋습니다.

필수 조건

  • 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 등이 손상될 수 있습니다. 자세한 내용은 호스트 이름 유지를 참조하세요.

프라이빗 VNET의 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. 애플리케이션 게이트웨이를 가리키도록 공용 DNS를 구성합니다.

변수 정의

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

export SUBSCRIPTION='<subscription-id>'
export RESOURCE_GROUP='<resource-group-name>'
export LOCATION='eastus'
export SPRING_CLOUD_NAME='<name-of-Azure-Spring-Apps-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 Spring Apps에서 공용 도메인 이름 구성

트래픽은 퍼블릭 도메인 이름을 사용하여 Azure Spring Apps에 배포된 애플리케이션에 들어갑니다. HTTP를 통해 이 호스트 이름을 수신 대기하도록 애플리케이션을 구성하려면 다음 명령을 사용하여 앱에 사용자 지정 도메인을 추가하고 <...> 자리 표시자를 실제 값으로 바꿉니다.

export KV_NAME='<name-of-key-vault>'
export KV_RG='<resource-group-name-of-key-vault>'
export CERT_NAME_IN_KV='<name-of-certificate-with-intermediaries-in-key-vault>'
export DOMAIN_NAME=myapp.mydomain.com

az spring app custom-domain bind \
    --resource-group $RESOURCE_GROUP \
    --service $SPRING_CLOUD_NAME \
    --domain-name $DOMAIN_NAME \
    --app $APPNAME

네트워크 리소스 만들기

만들 애플리케이션 게이트웨이는 Azure Spring Apps 서비스 인스턴스와 동일한 가상 네트워크에 조인합니다. 먼저 가상 네트워크에 애플리케이션 게이트웨이에 대한 새 서브넷을 만들고, 다음 예제처럼 애플리케이션 게이트웨이의 프런트 엔드로 공용 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

애플리케이션 게이트웨이에 대한 관리 ID 만들기

애플리케이션 게이트웨이는 인증서를 읽기 위해 Key Vault에 액세스할 수 있어야 합니다. 이를 위해 애플리케이션 게이트웨이는 사용자 할당 관리 ID를 사용합니다. 자세한 내용은 Azure 리소스에 대한 관리 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에서 정책 설정

애플리케이션 게이트웨이의 관리 ID가 Key Vault에 저장된 인증서에 액세스할 수 있도록 다음 명령을 사용하여 Key Vault를 구성합니다.

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

애플리케이션 게이트웨이 만들기

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

export APPGW_NAME='<name-for-application-gateway>'
export CERT_NAME_IN_KV='<name-of-certificate-in-key-vault>'
export KEYVAULT_SECRET_ID_FOR_CERT=$(az keyvault certificate show \
    --name $CERT_NAME_IN_KV \
    --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 80 \
    --http-settings-protocol Http \
    --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

애플리케이션 게이트웨이 배포 확인

만든 후에는 다음 명령을 사용하여 백 엔드 상태를 확인합니다. 이 명령의 출력을 사용하면 애플리케이션 게이트웨이가 프라이빗 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 레코드를 사용하여 애플리케이션 게이트웨이를 가리키도록 공용 DNS를 구성합니다. 다음 명령을 사용하여 애플리케이션 게이트웨이에 대한 공용 주소를 찾을 수 있습니다.

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

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

리소스 정리

후속 문서로 계속 작업하려는 경우 이러한 리소스를 그대로 유지할 수 있습니다. 더 이상 필요 없으면 리소스 그룹을 삭제합니다. 그러면 리소스 그룹의 리소스가 삭제됩니다. Azure CLI를 사용하여 리소스 그룹을 삭제하려면 다음 명령을 사용합니다.

az group delete --name $RESOURCE_GROUP

다음 단계