Azure Container Instance (ACI) — Instalación de Dynamics

Support DQE
Support DQE
  • Actualización

1. Instalación

Esta sección describe el despliegue de DQE Unify Server en Azure Container Instances (ACI). La pila de la aplicación — Redis, RabbitMQ, Nginx, Unify Server y Queue Worker — se ejecuta como un único Azure Container Group. Todos los contenedores comparten el mismo espacio de nombres de red y se comunican mediante localhost.

1.1 Requisitos previos

1.1.1 Requisitos de recursos

Contenedor CPU (vCores) Memoria
redis 0.5 0.5 GB
rabbitmq 0.5 1 GB
nginx 0.5 0.5 GB
unify-server 0.5 1 GB
queue-worker 1.0 5 GB
Total 3.0 8 GB

Nota: las estimaciones se basan en 1 millón de registros. Dependiendo del volumen de datos, es posible que deba aumentar la asignación de memoria del contenedor queue-worker.

1.1.2 Requisitos de software

Software Versión / Notas
Azure CLI Última versión estable — comando az disponible en el terminal
Suscripción de Azure Suscripción activa con permisos para crear Container Instances, Virtual Networks y Storage Accounts
Acceso a Internet Necesario para descargar imágenes desde DQE Container Registry

1.2 Autenticarse en DQE Container Registry

Todas las imágenes (DQE Unify, Redis, RabbitMQ, Nginx) se alojan en un Azure Container Registry privado. Utilice las credenciales proporcionadas por DQE Software para iniciar sesión desde su terminal local:

az login
docker login <registry-url> --username <Username provided by DQE> --password <Password provided by DQE>

Un inicio de sesión correcto muestra: Login Succeeded.

Nota: las credenciales del registro también son necesarias en el archivo YAML del Container Group (sección 1.7) para que ACI pueda descargar las imágenes en el momento del despliegue.

1.3 Configurar Azure Storage

Azure Container Instances no admite bind mounts locales. Los datos persistentes de Redis y RabbitMQ deben almacenarse en Azure File Shares. El archivo de configuración de Nginx también se sube a un file share para que el contenedor pueda montarlo en tiempo de ejecución.

  1. Paso 1 — Cree una cuenta de almacenamiento:

    az storage account create \
      --name dqeunifystorage \
      --resource-group <resource-group> \
      --location <location> \
      --sku Standard_LRS
  2. Paso 2 — Obtenga la clave de la cuenta de almacenamiento:

    az storage account keys list \
      --account-name dqeunifystorage \
      --resource-group <resource-group> \
      --query "[0].value" -o tsv
  3. Paso 3 — Cree los file shares:

    az storage share create --name redisvol   --account-name dqeunifystorage
    az storage share create --name rabbitvol  --account-name dqeunifystorage
    az storage share create --name nginxconf  --account-name dqeunifystorage

1.4 Configurar Nginx

Nginx actúa como proxy inverso, reenviando las solicitudes HTTP/HTTPS entrantes al Unify Server. En ACI, todos los contenedores comparten el mismo espacio de nombres de red, por lo que el destino del proxy es http://localhost:8000 y no un nombre de servicio.

Cree el archivo default.conf localmente y súbalo al Azure File Share.

El archivo default.conf debe contener:

server {
    listen 80;

    location / {
        proxy_pass         http://localhost:8000;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_read_timeout 300s;
    }
}

Súbalo al Azure File Share:

az storage file upload \
  --account-name dqeunifystorage \
  --share-name nginxconf \
  --source ./default.conf \
  --path default.conf

HTTPS

Añada un segundo bloque de servidor y suba su certificado SSL y clave privada al file share nginxconf. Actualice el YAML del Container Group para exponer el puerto 443.

server {
    listen 443 ssl;

    ssl_certificate      /etc/nginx/ssl/cert.crt;
    ssl_certificate_key  /etc/nginx/ssl/cert.key;

    location / {
        proxy_pass         http://localhost:8000;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_read_timeout 300s;
    }
}

Nota: suba los archivos del certificado al file share nginxconf bajo un subdirectorio ssl/, y monte el share en /etc/nginx/ssl en la configuración del contenedor Nginx.

1.5 Configurar Log Analytics Workspace

Un workspace de Log Analytics centraliza los registros de los contenedores y permite la supervisión a través de Azure Monitor. El ID y la clave del workspace se referencian en el YAML del Container Group (sección 1.7).

  1. Paso 1 — Cree un workspace de Log Analytics:

    az monitor log-analytics workspace create \
      --resource-group <resource-group> \
      --workspace-name dqe-unify-logs \
      --location <location>
  2. Paso 2 — Obtenga el Workspace ID:

    az monitor log-analytics workspace show \
      --resource-group <resource-group> \
      --workspace-name dqe-unify-logs \
      --query customerId -o tsv
  3. Paso 3 — Obtenga la Workspace Primary Key:

    az monitor log-analytics workspace get-shared-keys \
      --resource-group <resource-group> \
      --workspace-name dqe-unify-logs \
      --query primarySharedKey -o tsv

Nota: guarde a mano el Workspace ID y la Primary Key — se utilizan como los marcadores de posición <workspace-id> y <workspace-key> en el YAML del Container Group (sección 1.7).

1.6 Configurar la red virtual (VNET)

El Container Group debe desplegarse dentro de una Azure Virtual Network para que reciba una dirección IP privada accesible desde su entorno Azure (backend de Dynamics 365, DNS interno, Application Gateway). La subred debe estar explícitamente delegada a Microsoft.ContainerInstance/containerGroups — este es un requisito estricto para la integración de ACI con VNET.

  1. Paso 1 — Cree una red virtual:

    az network vnet create \
      --name dqe-unify-vnet \
      --resource-group <resource-group> \
      --location <location> \
      --address-prefix 10.0.0.0/16
  2. Paso 2 — Cree una subred delegada a ACI:

    az network vnet subnet create \
      --name dqe-unify-subnet \
      --vnet-name dqe-unify-vnet \
      --resource-group <resource-group> \
      --address-prefix 10.0.0.0/24 \
      --delegations Microsoft.ContainerInstance/containerGroups
  3. Paso 3 — Obtenga el ID de recurso completo de la subred:

    az network vnet subnet show \
      --name dqe-unify-subnet \
      --vnet-name dqe-unify-vnet \
      --resource-group <resource-group> \
      --query id -o tsv

    El valor devuelto tiene la forma:

    /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/virtualNetworks/dqe-unify-vnet/subnets/dqe-unify-subnet

    Guarde este valor — se utiliza como el marcador de posición subnetIds[0].id en el YAML del Container Group (sección 1.7).

Nota: una subred delegada a Microsoft.ContainerInstance/containerGroups no puede alojar otros tipos de recursos. Utilice una subred dedicada — se recomienda un bloque /24 (256 direcciones). ACI consume una dirección IP por cada despliegue de container group.

Nota: si el cliente ya dispone de una VNET existente, omita los Pasos 1 y 2 y cree la subred dedicada dentro de la VNET existente. Obtenga el ID de la subred con el Paso 3.

1.7 Archivo de configuración del Container Group

Cree el archivo container-group.yaml con el contenido siguiente. Sustituya todos los marcadores de posición entre corchetes angulares antes de desplegar.

Marcador de posición Descripción
<resource-group> Nombre del grupo de recursos de Azure
<location> Región de Azure, por ejemplo westeurope
<registry-url> URL de DQE Container Registry
<Username provided by DQE> Nombre de usuario del registro proporcionado por DQE Software
<Password provided by DQE> Contraseña del registro proporcionada por DQE Software
<storage-account-key> Clave obtenida en la sección 1.3 Paso 2
<workspace-id> Log Analytics Workspace ID (obtenido en la sección 1.5 Paso 2)
<workspace-key> Log Analytics Workspace Primary Key (obtenida en la sección 1.5 Paso 3)
<subscription-id> / <vnet-name> / <subnet-name> ID de recurso de la subred obtenido en la sección 1.6 Paso 3
name: dqe-unify-aci
apiVersion: '2021-10-01'
location: <azure-region>

tags:
  docker-compose-application: docker-compose-application

properties:
  containers:
    - name: redis
      properties:
        image: <registry-url>/dqe-unify-redis:latest
        resources:
          requests:
            memoryInGB: 1
            cpu: 0.5
        volumeMounts:
          - name: redisvol
            mountPath: /data

    - name: rabbitmq
      properties:
        image: <registry-url>/dqe-unify-rabbitmq:latest
        ports:
          - protocol: TCP
            port: 5672
        resources:
          requests:
            memoryInGB: 1
            cpu: 1
        volumeMounts:
          - name: rabbitvol
            mountPath: /bitnami
            readOnly: false

    - name: nginx
      properties:
        image: <registry-url>/dqe-unify-nginx:latest
        ports:
          - protocol: TCP
            port: 80
        resources:
          requests:
            memoryInGB: 1
            cpu: 0.25
        volumeMounts:
          - name: nginxconf
            mountPath: /etc/nginx/conf.d

    - name: unify-server
      properties:
        image: <registry-url>/unify-server-web-ms-dynamics:<version>
        command: ["python", "-u", "app.pyc"]
        ports:
          - protocol: TCP
            port: 8000
        environmentVariables:
          - name: REDIS_URL
            value: redis://127.0.0.1:6379
          - name: CLOUDAMQP_URL
            value: amqp://guest:guest@127.0.0.1:5672/
          - name: PORT
            value: 8000
        resources:
          requests:
            memoryInGB: 1
            cpu: 0.25

    - name: queue-worker
      properties:
        image: <registry-url>/unify-server-web-ms-dynamics:<version>
        command: ["python", "-u", "queue_worker.pyc"]
        environmentVariables:
          - name: REDIS_URL
            value: redis://127.0.0.1:6379
          - name: CLOUDAMQP_URL
            value: amqp://guest:guest@127.0.0.1:5672/
        resources:
          requests:
            memoryInGB: 5
            cpu: 1

  imageRegistryCredentials:
    - server: <registry-url>
      username: <registry-username>
      password: <registry-password>

  diagnostics:
    logAnalytics:
      workspaceId: <log-analytics-workspace-id>
      workspaceKey: <log-analytics-workspace-key>

  restartPolicy: Always

  ipAddress:
    ports:
      - protocol: TCP
        port: 80
    type: Private

  osType: Linux

  volumes:
    - name: rabbitvol
      azureFile:
        shareName: rabbitvol
        readOnly: false
        storageAccountName: <storage-account-name>
        storageAccountKey: <storage-account-key>

    - name: nginxconf
      azureFile:
        shareName: nginxconf
        readOnly: false
        storageAccountName: <storage-account-name>
        storageAccountKey: <storage-account-key>

    - name: redisvol
      azureFile:
        shareName: redisvol
        readOnly: false
        storageAccountName: <storage-account-name>
        storageAccountKey: <storage-account-key>

  subnetIds:
    - id: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name>

Notas clave de configuración:

  • Todos los contenedores de un ACI Container Group comparten el mismo espacio de nombres de red — los servicios se comunican mediante localhost, no mediante nombres de servicio.
  • Las variables REDIS_URL y CLOUDAMQP_URL usan localhost en lugar de redis y rabbitmq.
  • La imagen unify-server-web-ms-dynamics:v3.0 contiene bytecode de Python compilado — el punto de entrada es app.pyc, no app.py.
  • RabbitMQ utiliza la imagen oficial con credenciales configuradas mediante variables de entorno. El virtual host es / por defecto.
  • El bloque diagnostics.logAnalytics enruta todo el stdout/stderr de los contenedores al workspace de Log Analytics. Los registros aparecen en Azure Monitor bajo la tabla ContainerInstanceLog_CL a los pocos minutos del despliegue.

1.8 Desplegar la aplicación

  1. Paso 1 — Despliegue el Container Group:

    az container create \
      --resource-group <resource-group> \
      --file container-group.yaml
  2. Paso 2 — Compruebe el estado del despliegue:

    az container show \
      --resource-group <resource-group> \
      --name dqe-unify \
      --query "instanceView.state" -o tsv

    Salida esperada: Running.

  3. Paso 3 — Obtenga la dirección IP privada asignada al Container Group:

    az container show \
      --resource-group <resource-group> \
      --name dqe-unify \
      --query "ipAddress.ip" -o tsv

    La dirección IP devuelta solo es accesible desde la Azure Virtual Network o desde redes conectadas.

  4. Paso 4 — Verifique que todos los contenedores estén en ejecución:

    az container show \
      --resource-group <resource-group> \
      --name dqe-unify \
      --query "containers[].{Name:name, State:instanceView.currentState.state}" \
      -o table

    Salida esperada: todos los contenedores deben mostrar el estado Running:

    Name            State
    -----------     -------
    redis           Running
    rabbitmq        Running
    nginx           Running
    unify-server    Running
    queue-worker    Running

Importante: si algún contenedor muestra el estado Terminated o Waiting, revise sus registros inmediatamente: az container logs --resource-group <rg> --name dqe-unify --container-name <service-name>.

Nota: ACI inicia todos los contenedores simultáneamente. RabbitMQ y Redis pueden tardar unos segundos en estar listos. Unify Server reintentará automáticamente la conexión al iniciarse.

1.9 Configurar el Network Security Group (NSG)

Si la Container Instance está desplegada en una Azure Virtual Network, configure el NSG asociado para permitir el tráfico entrante en los puertos necesarios.

  1. Vaya a Azure Portal → Network Security Groups → [su NSG] → Inbound security rules.
  2. Haga clic en Add.
  3. Establezca Destination port ranges: 80. Si se habilita HTTPS mediante un reverse proxy externo o Application Gateway, es posible que se necesiten reglas adicionales.
  4. Establezca Protocol en TCP y Action en Allow.
  5. Haga clic en Add.

Nota: el puerto 8000 (Unify Server) y el puerto 5672 (RabbitMQ) son internos al Container Group y no necesitan exponerse externamente.

Dynamics 365 — Autorizar rangos de IP entrantes

El servidor DQE Unify recibe solicitudes de Microsoft Dynamics 365, que se ejecuta en la infraestructura de Azure. Debe autorizar los rangos de IP de Azure correspondientes en el NSG.

La lista completa y actualizada de los rangos de IP de Microsoft Azure está disponible para descargar en:
Microsoft Azure IP Ranges and Service Tags

Descargue el archivo JSON, identifique las etiquetas de servicio Dynamics365 y AzureCloud relevantes para su región, y añada los rangos de IP correspondientes como reglas de permiso de entrada en el puerto expuesto por el reverse proxy o el Application Gateway (normalmente el puerto 80 o 443 según la configuración de la infraestructura). Alternativamente, establezca Source en Service Tag y seleccione Dynamics365 directamente en la regla del NSG.

1.10 Configurar el DNS

Contacte con sus administradores de red o DNS para crear un registro DNS interno que apunte a la dirección IP privada del Container Group o al hostname expuesto por el reverse proxy/Application Gateway.

Tipo de registro Nombre Valor
A unify.yourdomain.com IP privada del ACI Container Group

Alternativamente, puede asignar una etiqueta de nombre DNS directamente a la Container Instance en Azure Portal: Azure Portal → Container Instances → [dqe-unify] → Overview → DNS name label. Esto proporciona un hostname con la forma dqe-unify.<location>.azurecontainer.io.

1.11 Verificar el despliegue

Una vez que se propague el DNS, abra un navegador y navegue a:

http://unify.yourdomain.com

También puede probar directamente usando la IP privada:

curl http://<private-ip>

Respuesta esperada de Unify Server:

{"status": "available"}

Si la aplicación responde, el despliegue está completo y el servidor está correctamente configurado.

2. Configuración de la aplicación

Una vez que la aplicación esté en ejecución, se debe configurar el NSG y cualquier firewall o proxy ascendente para permitir los rangos de IP enumerados a continuación.

2.1 Direcciones IP a autorizar

DQE Software Office Server

Contacte con el soporte de DQE Software para obtener la dirección IP que debe autorizar.

DQE – Servicio de deduplicación

Contacte con el soporte de DQE Software para obtener la dirección IP que debe autorizar.

DQE – Servicio de calidad

Contacte con el soporte de DQE Software para obtener la dirección IP que debe autorizar.

Acción necesaria: proporcione a DQE Software la dirección IP pública de salida utilizada por su infraestructura de Azure (NAT Gateway, Azure Firewall o equivalente) para que pueda ser autorizada en los servicios de DQE.

Rangos de IP de Azure — Dynamics 365 y servicios de Azure

La lista completa y actualizada de los rangos de IP de Microsoft Azure (IPv4 e IPv6) está disponible para descargar en:

Microsoft Azure IP Ranges and Service Tags

Descargue el archivo JSON e identifique las etiquetas de servicio relevantes para su región (Dynamics365, AzureCloud). Añada los rangos de IP correspondientes a las reglas de entrada de su NSG.

Relacionada con

¿Fue útil este artículo?

Usuarios a los que les pareció útil: 0 de 0