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.
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.
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:
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
-
Actualizar el paquete existente
$ sudo apt-get update -
Instalar los requisitos previos para usar paquetes a través de HTTPS
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common -
Añadir la clave GPG del repositorio oficial de Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -
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" -
Actualizar los paquetes
$ sudo apt-get update -
Verificación de la instalación desde el repositorio de Docker
$ apt-cache policy docker-ce -
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 versionSi 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.
-
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 -
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 bashInstalación de CertBot
-
Actualización de snapd
$ sudo snap install core; sudo snap refresh core -
Instalación de CERTBOT
$ sudo snap install --classic certbot -
Preparación de CERTBOT
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot -
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