AWS — Instalación del servidor backend

Support DQE
Support DQE
  • Actualización

1. Arquitectura

La aplicación en sí y todas sus dependencias se compilan en un archivo docker-compose proporcionado por DQE-Software.

En cuanto el contenedor se despliega en una instancia de AWS (EC2, Elastic BeanStalk, etc.), se empareja con una organización de Salesforce que tenga el paquete Unify UI (instalación desde AppExchange).

Este documento describe una posible configuración para gestionar el acceso a la instancia desplegada, por ejemplo mediante un LoadBalancer.

Arquitectura backend de AWS para DQE One y Salesforce

Diagrama de flujo

A continuación se muestra el diagrama que describe todos los flujos entrantes/salientes, así como las IP y los puertos requeridos por la aplicación.

Diagrama de flujo entrante y saliente de DQE One en AWS

Medidas de seguridad

No podemos proporcionar un ejemplo de cómo implementar la capa de seguridad que se ajuste perfectamente a su arquitectura. Sin embargo, podemos ofrecer algunas recomendaciones relevantes para el uso de la propia aplicación.

  • Protocolos y puertos: todos los flujos entrantes/salientes de la aplicación pasan por el protocolo HTTPS (puerto 443). No es necesario abrir ningún otro puerto en su VM. Las IP de DQE que deben ser accesibles se describen en el diagrama anterior.
  • Filtrado de IP: el propio servidor de aplicaciones solo necesita ser accesible desde los servidores de Salesforce. Por lo tanto, se recomienda configurar un filtrado de las IP entrantes.

Sin embargo, hay una excepción: el servidor web CustomUI incluido en el docker-compose. Este debe ser accesible desde un navegador web. Una solución podría ser permitir el acceso al servidor a través de una VPN específica. Consulte aquí la lista de IP publicadas por Salesforce. (No olvide las IP de Hyperforce)

  • Protocolo de autenticación: Salesforce ofrece de forma nativa varios protocolos para proteger las solicitudes entre sus servidores y el servidor DQE One. Al configurar la connected app "DQE One Customer" en su organización, podrá seleccionar el método de autenticación "Basic Auth" y configurar su firewall de aplicaciones en consecuencia.

Si la VM está expuesta directamente a internet, debe tener una entrada DNS y un certificado SSL asociado que apunten a ella.

Si la VM no está expuesta directamente a internet, esto suele significar que el tráfico se enruta a través de un componente como un gateway. En este caso, el DNS y el certificado SSL deben instalarse en ese gateway, que después reenviará el tráfico a la VM interna.

Recomendación

A continuación se indican los componentes necesarios para desplegar una instancia de DQE One en AWS.

Nota: las estimaciones se basan en 1 millón de registros. Dependiendo del tamaño de sus bases de datos, es posible que deba aumentar la capacidad de sus instancias de contenedor para optimizar el tiempo de procesamiento.

Despliegue con AWS EC2

  • Tipo de servidor: Unix, por ejemplo Ubuntu Server 20.04 LTS (HVM), tipo de volumen EBS General Purpose (SSD).
  • Load Balancer: debe desplegarse para que la VM pueda comunicarse con el exterior.

Para obtener más información, consulte los siguientes recursos:

  • Configuración de Amazon EC2:

https://docs.aws.amazon.com/fr_fr/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html

https://docs.aws.amazon.com/fr_fr/AWSEC2/latest/UserGuide/ec2-best-practices.html

  • Instancias EC2:

https://docs.aws.amazon.com/fr_fr/AWSEC2/latest/UserGuide/Instances.html

https://aws.amazon.com/fr/ec2/instance-types/

Composición y servicios

La imagen Docker es una aplicación web que expone los servicios y las API que se solicitan desde Salesforce a través de la app Lightning DQE Unify UI.

A continuación se describen los atributos y funciones de cada servicio.

APLICACIÓN WEB

Un contenedor backend que contiene una aplicación de microservicios. Esta aplicación expone todas las API llamadas para lanzar procesos, gestionar las colas de procesamiento e instanciar los workers de procesamiento. Depende de los siguientes servicios para funcionar correctamente. Este worker debe exponerse en la web tal como se describe en la configuración de nginx presentada más adelante en este documento.

Configuración de Docker Compose

  • image: el nombre de la imagen utilizada por la aplicación web. Es necesario renombrar la imagen según los nombres de los registros utilizados. Para las imágenes alojadas en un registro de contenedores de Azure, el nombre se construye de la siguiente manera:

    <Name of the registry container>.azurecr.io/<name of the image>
  • container_name: nombre del contenedor
  • depends_on: nombre de los servicios que preceden a este servicio
  • domainname: el nombre de dominio utilizado para el FQDN. Formato esperado:

    <domain name>
  • environment: variables de entorno del servicio
  • command: comando ejecutado al iniciar el contenedor

Worker

Un contenedor backend que contiene una aplicación de microservicios. Esta aplicación expone todas las API llamadas para lanzar procesos, gestionar las colas de procesamiento e instanciar los workers de procesamiento. Depende de los siguientes servicios para funcionar correctamente. Este worker debe exponerse en la web tal como se describe en la configuración de nginx presentada más adelante en este documento.

Parámetros a configurar en Docker Compose

  • image: el nombre de esta imagen es el mismo que el del servicio web
  • container_name: el nombre del contenedor en el entorno Docker
  • depends_on: nombre de los servicios que preceden a este servicio
  • environment: variables de entorno del servicio
  • command: comando ejecutado al iniciar el contenedor

CustomUI

Este servicio es una aplicación web que expone un front utilizado para configurar las reglas de deduplicación. Al igual que el primer servicio, también debe exponerse en la web. Este servicio también consume algunas API del backend, por ejemplo para recuperar metadatos del CRM.

Nombre del registro: *

Nombre de la imagen: *

Versiones disponibles: *

Redis

Este servicio es una base de datos clave/valor utilizada por los distintos departamentos para almacenar claves de funcionamiento interno, como las configuraciones de la organización de Salesforce, las sesiones, etc.

Es posible utilizar las imágenes oficiales publicadas por Redis, como "redis:alpine", pero como medida de seguridad algunos proveedores cloud bloquean la descarga de imágenes públicas y solo permiten imágenes procedentes de registros privados. Para solucionar esta restricción, también publicamos en el registro privado "dqeone" una versión de Redis perfectamente compatible con nuestras aplicaciones.

Parámetros

  • image: imagen oficial de Redis => redis:alpine
  • container_name: el nombre del contenedor en el entorno Docker
  • volumes: la ruta del volumen utilizado para respaldar los datos de Redis

    <name of the volume defined in this docker compose>:/data

RabbitMQ

Este servicio es un potente gestor de colas que permite la recepción y programación de las solicitudes de procesamiento. Hasta que un proceso se asigna a un worker y se completa, permanecerá en una cola. Esto también permite la resiliencia ante fallos: si el servidor se reiniciara, retomaría el último procesamiento en la cola donde lo dejó.

Al igual que con la imagen del servicio Redis, tiene la opción de utilizar una versión pública (rabbitmq:3-management-alpine) o la del registro privado dqeone.

Parámetros

  • image: imagen oficial de RabbitMQ => rabbitmq:3-management-alpine
  • container_name: nombre del contenedor RabbitMQ

2. Instalación

2.1. Requisitos previos

Inicie la instancia de servidor dedicada y conéctese con una de las opciones de conexión disponibles:

Opciones de conexión de la instancia AWS EC2

Para obtener más información sobre el acceso a las instancias a través de la consola de AWS, consulte la documentación oficial aquí.

Instalación de NGINX

$ sudo apt update
$ sudo apt install nginx

Para redirigir el puerto 80 a nuestra API:

Será necesario añadir la clave "location /" dentro de la clave "server" en el archivo de configuración de Nginx ubicado en "/etc/nginx/sites-enabled/default"

server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8001;
}

location /api/ {
rewrite /api/(.*) /$1 break;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8000;
}
}

Instalación de Docker

  1. Actualizar el paquete existente

    $ sudo apt-get update
  2. Instalar los requisitos previos para usar paquetes a través de HTTPS

    $ sudo apt install apt-transport-https ca-certificates curl software-properties-common
  3. Añadir la clave GPG del repositorio oficial de Docker

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. Añadir el repositorio de Docker a las fuentes de APT

    $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
  5. Actualizar los paquetes

    $ sudo apt-get update
  6. Verificación de la instalación desde el repositorio de Docker

    $ apt-cache policy docker-ce
  7. Instalación de Docker

    $ sudo apt install docker-ce

Instalación de Docker Compose

Nota: en las instalaciones recientes de Docker, Docker Compose V2 se incluye por defecto con Docker Engine. Antes de descargar el binario independiente docker-compose, compruebe si Compose ya está instalado ejecutando:

docker compose version

Si el comando devuelve un número de versión, puede omitir este paso de instalación y utilizar docker compose en lugar de docker-compose en los siguientes comandos.

  1. Descargue la versión deseada (número de versión a cambiar en la URL)

    $ sudo curl -L "https://github.com/docker/compose/releases/download/<NUMEROS_DE_VERSION>/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. Configuración de permisos

    $ sudo chmod +x /usr/local/bin/docker-compose

Instalación de Azure CLI

$ sudo curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

Instalación de CertBot

  1. Actualización de snapd

    $ sudo snap install core; sudo snap refresh core
  2. Instalación de CERTBOT

    $ sudo snap install --classic certbot
  3. Preparación de CERTBOT

    $ sudo ln -s /snap/bin/certbot /usr/bin/certbot
  4. Creación del certificado

    $ sudo certbot --nginx

2.2. AWS One Server

services:
    customui: 
        image: <imageURL>
        container_name: custom-ui 
        logging: 
            driver : "json-file"
            options : 
                max-file : 5
                max-size : 50m
        environment:
          - PORT=8001
        ports:
          - 8001:8001 
        command: npm start

    web: 
        image: <imageURL>
        container_name: one-server 
        hostname: oneserver 
        logging: 
            driver : "json-file"
            options : 
                max-file : 5
                max-size : 50m
        depends_on: 
          - redis 
          - rabbitmq 
        environment: 
          - SFAPIVERSION=v59.0
          - PORT=8000
          - REDIS_URL=redis://redis 
          - CLOUDAMQP_URL=amqp://guest:guest@rabbitmq/admin
          - CUSTOMUI=http://customui:8001
          - UNIFYSERVERURL=http://web:8000
        ports:
          - 8000:8000 
        command: bash ./entrypoint.sh

    worker: 
        image: <imageURL>
        container_name: queue-worker 

        logging: 
            driver : "json-file" 
            options : 
                max-file : 5
                max-size : 50m
        environment:
          - SFAPIVERSION=v59.0
          - WORKDIRPATH=/app/unify
          - REDIS_URL=redis://redis
          - CLOUDAMQP_URL=amqp://guest:guest@rabbitmq/admin
        depends_on:
          - web
        command: python -u ./unify/queue_worker.pyc

    redis: 
        container_name: redis
        logging:
            driver : "json-file"
            options :
                max-file : 5
                max-size : 50m
        image: <imageURL>
        hostname: redis
        volumes:
        - redis_data:/data

    rabbitmq: 
        image: <imageURL>
        container_name: 'rabbitmq'
        logging: 
            driver : "json-file" 
            options : 
                max-file : 5
                max-size : 50m
        environment:
          - RABBITMQ_DEFAULT_PASS=guest
          - RABBITMQ_DEFAULT_USER=guest
          - RABBITMQ_DEFAULT_VHOST=admin
        hostname: rabbitmq
        depends_on:
          - redis
        volumes:
        - rabbitmq_data:/var/lib/rabbitmq/
        - rabbitmq_log:/var/log/rabbitmq/

volumes:
    rabbitmq_data:
    rabbitmq_log:
    redis_data:

3. Launcher

Aunque el servidor backend se despliega en AWS, las imágenes Docker de DQE se proporcionan a través de un Azure Container Registry gestionado por DQE.

3.1. Conexión al Azure Container Registry de DQE

Autentique Docker en el Azure Container Registry de DQE:

$ sudo docker login **************
Username: <Login provided by DQE>
Password: <Pwd provided by DQE>

3.2. Ejecución de docker-compose.yml

Vaya a la carpeta que contiene el archivo docker-compose.yml y ejecútelo.

$ sudo docker-compose pull
$ sudo docker-compose up

Relacionada con

¿Fue útil este artículo?

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