Exposición de aplicaciones con TLS de un extremo a otro en una red virtual

Nota:

Azure Spring Apps es el nuevo nombre del servicio Azure Spring Cloud. Aunque el servicio tiene un nuevo nombre, verá el nombre antiguo en algunos lugares durante un tiempo mientras trabajamos para actualizar recursos, como capturas de pantalla, vídeos y diagramas.

La información de este artículo puede ponerse en práctica en: ✔️ Básico o Estándar ✔️ Enterprise

En este artículo se explica cómo exponer las aplicaciones a Internet mediante Application Gateway. Cuando se implementa una instancia de servicio de Azure Spring Apps en la red virtual, solo se puede acceder a las aplicaciones de la instancia de servicio en la red privada. Para que las aplicaciones sean accesibles en Internet, debe integrarlas con Azure Application Gateway.

Requisitos previos

Configuración de Application Gateway para Azure Spring Apps

Se recomienda que el nombre de dominio, tal como lo ve el explorador, sea el mismo que el nombre de host que Application Gateway usas para dirigir el tráfico al back-end de Azure Spring Apps. Esta recomendación proporciona la mejor experiencia al usar Application Gateway para exponer las aplicaciones hospedadas en Azure Spring Apps que residen en una red virtual. Si el dominio expuesto por Application Gateway es diferente del dominio aceptado por Azure Spring Apps, las cookies y las direcciones URL de redireccionamiento generadas (por ejemplo) se pueden interrumpir. Para más información, consulte Conservación del nombre de host HTTP original entre un proxy inverso y su aplicación web de back-end.

Para configurar Application Gateway delante de Azure Spring Apps, siga estos pasos.

  1. Siga las instrucciones de Implementación de Azure Spring Apps en una red virtual.
  2. Siga las instrucciones de Acceso a una aplicación en una red privada.
  3. Adquiera un certificado para el dominio que prefiera y almacénelo en Key Vault. Para más información, vea Tutorial: Importación de un certificado en Azure Key Vault.
  4. Configure un dominio personalizado y el certificado correspondiente de Key Vault en una aplicación implementada en Azure Spring Apps. Para más información, vea Tutorial: Asignación de un dominio personalizado existente a Azure Spring Apps.
  5. Implemente Application Gateway en una red virtual configurada según la lista siguiente:
    • Use Azure Spring Apps en el grupo de back-end, al que hace referencia el dominio con el sufijo private.azuremicroservices.io.
    • Incluya un agente de escucha HTTPS usando el mismo certificado de Key Vault.
    • Configure la red virtual con las opciones HTTP que usen el nombre de dominio personalizado configurado en Azure Spring Apps, en lugar del dominio con el sufijo private.azuremicroservices.io.
  6. Configure el DNS público para que apunte a Application Gateway.

Definición de variables

A continuación, use los comandos siguientes para definir las variables para el grupo de recursos y la red virtual que creó como se indicó en Implementación de Azure Spring Apps en una red virtual. Personalice los valores en función de su entorno real. Al definir SPRING_APP_PRIVATE_FQDN, quite https:// del identificador URI.

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'

Inicio de sesión en Azure

Use el siguiente comando para iniciar sesión en la CLI de Azure y elija su suscripción activa.

az login
az account set --subscription $SUBSCRIPTION

Adquisición de un certificado

En el caso de las implementaciones de producción, lo más probable es que use un certificado firmado públicamente. En este caso, importe el certificado en Azure Key Vault. Para más información, vea Tutorial: Importación de un certificado en Azure Key Vault. Asegúrese de que el certificado incluye toda la cadena de certificados.

Configuración del nombre de dominio público en Azure Spring Apps

El tráfico escribirá la aplicación implementada en Azure Spring Apps con el nombre de dominio público. Para configurar la aplicación para que escuche en este nombre de host a través de HTTPS, use los siguientes comandos para agregar un dominio personalizado a la aplicación:

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

Crear recursos de red

La instancia de Azure Application Gateway que se va a crear unirá la misma red virtual que la instancia de servicio de Azure Spring Apps—o a la red virtual emparejada a ella—. En primer lugar, cree una nueva subred para Application Gateway en la red virtual con az network vnet subnet create, y cree también una dirección IP pública como front-end de Application Gateway con az network public-ip create.

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

Creación de una identidad administrada para Application Gateway

Application Gateway necesitará tener acceso a Key Vault para leer el certificado. Para ello, usará una identidad administrada asignada por el usuario. Cree la identidad administrada mediante el comando siguiente:

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

A continuación, capture el valor de objectId para la identidad administrada, ya que se usará más adelante para conceder derechos para acceder al certificado en 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)

Establecimiento de la directiva en Key Vault

Configure Key Vault mediante el comando siguiente para que la identidad administrada de Application Gateway tenga permiso para acceder al certificado almacenado en 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

Creación de una puerta de enlace de aplicaciones

Cree una puerta de enlace de aplicación mediante az network application-gateway create y especifique el nombre de dominio completo (FQDN) privado de la aplicación como servidores en el grupo de back-end. Asegúrese de usar la identidad administrada asignada por el usuario y para que apunte al certificado en Key Vault mediante el identificador secreto del certificado. A continuación, actualice la configuración HTTP mediante az network application-gateway http-settings update para usar el nombre de host público.

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

La puerta de enlace de aplicaciones puede tardar hasta 30 minutos en crearse.

Actualización de la configuración HTTP para usar el nombre de dominio hacia el back-end

Actualice la configuración HTTP para usar el nombre de dominio público como el nombre de host en lugar del dominio con el sufijo ".private.azuremicroservices.io" para enviar tráfico a Azure Spring Cloud.

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

Comprobación de la implementación de Application Gateway

Una vez creado, compruebe el estado del back-end mediante el comando siguiente. La salida de este comando le permite determinar si Application Gateway llega a la aplicación mediante su FQDN privado.

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

La salida indica el estado correcto del grupo de back-end, como se muestra en el ejemplo siguiente:

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

Configuración del DNS y acceso a la aplicación

Ahora configure el DNS público para que apunte a Application Gateway mediante un registro CNAME o A. Puede encontrar la dirección pública de Application Gateway mediante el comando siguiente:

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

Ahora puede acceder a la aplicación mediante el nombre de dominio público.

Pasos siguientes