Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Incorporación de inquilinos a la arquitectura SaaS para el modelo de silo mediante C# y AWS CDK
Creada por Tabby Ward (AWS), Susmitha Reddy Gankidi () y Vijai Anand Ramalingam () AWS AWS
Repositorio | Entorno: PoC o piloto | Tecnologías: modernización; DevOps |
Carga de trabajo: código abierto | AWSservicios: Amazon DynamoDB AWS CloudFormation; Amazon DynamoDB Streams; Lambda; Amazon Gateway AWS API |
Resumen
Las aplicaciones de software como servicio (SaaS) se pueden crear con una variedad de modelos arquitectónicos diferentes. El modelo de silo se refiere a una arquitectura en la que los inquilinos reciben recursos específicos.
Las aplicaciones SaaS se basan en un modelo sencillo para introducir nuevos inquilinos en su entorno. Esto suele requerir la orquestación de varios componentes para aprovisionar y configurar correctamente todos los elementos necesarios para crear un nuevo inquilino. Este proceso, en la arquitectura SaaS, se denomina incorporación de inquilinos. La incorporación debe automatizarse por completo en todos los entornos de SaaS y utilizar la infraestructura como código en el proceso de incorporación.
Este patrón lo guía a través de un ejemplo de creación de un arrendatario y aprovisionamiento de una infraestructura básica para el arrendatario en Amazon Web Services (AWS). El patrón usa C# y el AWS Cloud Development Kit (AWSCDK).
Como este patrón crea una alarma de facturación, recomendamos implementar la pila en la región EE. UU. Este (Norte de Virginia) o AWS us-east-1. Para obtener más información, consulte la AWS documentación.
Requisitos previos y limitaciones
Requisitos previos
Una AWScuenta
activa. Un director de AWS Identity and Access Management (IAM) con IAM acceso suficiente para crear AWS recursos para este patrón. Para obtener más información, consulte Roles de IAM.
Instale Amazon Command Line Interface (AWSCLI) y AWSCLIconfigúrela para realizar AWS CDK el despliegue.
Visual Studio 2022
descargado o instalado o Visual Studio Code descargado o instalado. AWSConfiguración del Toolkit for Visual Studio.
. NETCore 3.1 o posterior
(necesario para las AWS CDK aplicaciones de C#) Amazon.Lambda.Tools
instalado.
Limitaciones
AWSCDKusos AWS CloudFormation
, por lo que AWS CDK las aplicaciones están sujetas a cuotas CloudFormation de servicio. Para obtener más información, consulte AWS CloudFormation cuotas. La CloudFormation pila de inquilinos se crea con un rol de CloudFormation servicio
infra-cloudformation-role
con caracteres comodín en las acciones (sns
* ysqs*
), pero con los recursos limitados altenant-cluster
prefijo. Para un caso de uso de producción, evalúe esta configuración y proporcione únicamente el acceso obligatorio a este rol de servicio. La funciónInfrastructureProvision
Lambda también usa un carácter comodín (cloudformation*
) para aprovisionar la CloudFormation pila, pero con los recursos limitados al prefijo.tenant-cluster
La compilación de docker de este ejemplo de código utiliza
--platform=linux/amd64
para forzar imágenes basadas enlinux/amd64
. Esto es para garantizar que los artefactos de imagen finales sean adecuados para Lambda, que de forma predeterminada utiliza una arquitectura x86-64. Si necesita cambiar la arquitectura Lambda de destino, asegúrese de cambiar tanto los Dockerfiles como los códigos. AWS CDK Para obtener más información, consulte la entrada del blog Migración de funciones AWS Lambda a procesadores Graviton2 basados en AWS ARM. El proceso de eliminación de la pila no limpiará CloudWatch los registros (grupos de registros y registros) generados por la pila. Debe limpiar los registros manualmente a través de la consola AWS de administración de Amazon CloudWatch o a través de laAPI.
Este patrón se configura a modo de ejemplo. Para su uso en producción, evalúe las siguientes configuraciones y realice los cambios en función de los requisitos de su empresa:
Para simplificar, el bucket de AWSSimple Storage Service (Amazon
S3) de este ejemplo no tiene habilitado el control de versiones. Evalúe y actualice la configuración según sea necesario. Para simplificar, en este ejemplo se configuran REST API los puntos de enlace de Amazon API Gateway
sin autenticación, autorización ni limitación. Para uso en producción, recomendamos integrar el sistema con la infraestructura de seguridad empresarial. Evalúe esta configuración y añada la configuración de seguridad necesaria según sea necesario. Para este ejemplo de infraestructura de arrendatarios, Amazon Simple Notification Service (AmazonSNS)
y Amazon Simple Queue Service (AmazonSQS) solo tienen configuraciones mínimas. El Servicio de administración de AWS claves (AWSKMS) de cada inquilino se abre para que Amazon CloudWatch y SNS los servicios de Amazon de la cuenta los consuman en función de la política AWS KMS clave. La configuración es solo un marcador de posición de ejemplo. Ajuste las configuraciones según sea necesario en función de su caso de uso empresarial. Toda la configuración, que incluye, entre otros, el aprovisionamiento y la eliminación de inquilinos mediante el uso de API puntos finales y back-end AWS CloudFormation, cubre únicamente el caso básico de «happy path». Evalúe y actualice la configuración con la lógica de reintentos necesaria, la lógica adicional de gestión de errores y la lógica de seguridad en función de las necesidades de su empresa.
El código de ejemplo se ha probado con up-to-date cdk-nag
para comprobar las políticas en el momento de escribir este artículo. Es posible que se apliquen nuevas políticas en el futuro. Es posible que estas nuevas políticas requieran que modifique manualmente la pila en función de las recomendaciones antes de poder implementarla. Revise el código existente para asegurarse de que se ajusta a los requisitos de su empresa. El código se basa en el AWS CDK para generar un sufijo aleatorio en lugar de depender de nombres físicos estáticos asignados a la mayoría de los recursos creados. Esta configuración sirve para garantizar que estos recursos sean únicos y no entren en conflicto con otras pilas. Para obtener más información, consulte la AWSCDKdocumentación. Ajústelo en función de los requisitos de su empresa.
Este ejemplo de paquetes de código. NETLambda crea artefactos en imágenes basadas en Docker y se ejecuta con el motor de ejecución de imágenes Container proporcionado por Lambda. El tiempo de ejecución de la imagen del contenedor presenta ventajas como mecanismo estándar de transferencia y almacenamiento (registros de contenedores) y entornos de prueba locales más precisos (a través de la imagen del contenedor). Puede cambiar el proyecto para usar la Lambda proporcionada. NETtiempos de ejecución para reducir el tiempo de compilación de las imágenes de Docker, pero luego tendrá que configurar los mecanismos de transferencia y almacenamiento y asegurarse de que la configuración local coincida con la configuración de Lambda. Ajuste el código para adaptarlo a los requisitos empresariales de los usuarios.
Versiones de producto
AWSCDKversión 2.45.0 o posterior
Visual Studio 2022
Arquitectura
Pila de tecnología
Amazon API Gateway
AWS CloudFormation
Amazon CloudWatch
Amazon DynamoDB
AWSIdentity and Access Management (IAM)
AWS KMS
AWSLambda
Amazon S3
Amazon SNS
Amazon SQS
Arquitectura
En el siguiente diagrama se muestra el flujo de creación de la pila de inquilinos. Para obtener más información sobre los paquetes de tecnología del plano de control y del inquilino, consulte la sección de Información adicional.
![Flujo de trabajo para crear un inquilino y aprovisionar una infraestructura básica para el inquilinoAWS.](images/pattern-img/5baef800-fe39-4eb8-b11d-2c23eb3175fc/images/0b579484-b87c-4acb-8c60-8c33c18370e3.png)
Flujo de creación de pilas de inquilinos
El usuario envía una POST API solicitud con la carga útil del nuevo inquilino (nombre del inquilino, descripción del inquilino) JSON a un alojamiento REST API de Amazon API Gateway. El API Gateway procesa la solicitud y la reenvía a la función de incorporación de inquilinos de Lambda de backend. En este ejemplo, no hay autorización ni autenticación. En una configuración de producción, API debe integrarse con el sistema de seguridad de la infraestructura SaaS.
La función de incorporación de inquilinos verifica la solicitud. A continuación, intenta almacenar el registro del inquilino, que incluye el nombre del arrendatario, el identificador único universal del arrendatario generado (UUID) y la descripción del arrendatario, en la tabla de incorporación de arrendatarios de Amazon DynamoDB.
Una vez que DynamoDB almacena el registro, una transmisión de DynamoDB inicia la función de infraestructura de inquilinos de Lambda descendente.
La función de Lambda de la infraestructura de inquilino actúa en función de la transmisión de DynamoDB recibida. Si la transmisión es para el INSERT evento, la función utiliza la NewImage sección de la transmisión (registro de última actualización, campo Nombre del inquilino) CloudFormation para crear una nueva infraestructura de arrendatario utilizando la plantilla que está almacenada en el bucket de S3. La CloudFormation plantilla requiere el parámetro Nombre del inquilino.
AWS CloudFormation crea la infraestructura del inquilino en función de la CloudFormation plantilla y los parámetros de entrada.
Cada configuración de infraestructura arrendataria tiene una CloudWatch alarma, una alarma de facturación y un evento de alarma.
El evento de alarma se convierte en un mensaje dirigido a un SNS tema, que se cifra con la AWS KMS clave del inquilino.
El SNS tema reenvía el mensaje de alarma recibido a la SQS cola, que se cifra con la clave de cifrado del AWS KMS inquilino.
Se pueden integrar otros sistemas con Amazon SQS para realizar acciones basadas en los mensajes en cola. En este ejemplo, para mantener el código genérico, los mensajes entrantes permanecen en cola y es necesario eliminarlos manualmente.
Flujo de eliminación de pilas de inquilinos
El usuario envía una DELETE API solicitud con la carga útil del nuevo inquilino (nombre del inquilino, descripción del inquilino) JSON al servidor REST API de Amazon API Gateway, que procesará la solicitud y la reenviará a la función de incorporación de inquilinos. En este ejemplo, no hay autorización ni autenticación. En una configuración de producción, se API integrará con el sistema de seguridad de la infraestructura SaaS.
La función de incorporación de inquilinos verificará la solicitud y, a continuación, intentará eliminar el registro del inquilino (nombre del inquilino) de la tabla de incorporación de inquilinos.
Una vez que DynamoDB elimina el registro correctamente (el registro existe en la tabla y se elimina), una transmisión de DynamoDB inicia la función de infraestructura de inquilinos de Lambda descendente.
La función de Lambda de la infraestructura de inquilino actúa en base a la transmisión de DynamoDB recibida. Si la transmisión es para el REMOVE evento, la función utiliza la OldImage sección del registro (información del registro y campo Nombre del inquilino, antes del último cambio, que es la eliminación) para iniciar la eliminación de una pila existente en función de la información de ese registro.
AWS CloudFormation borra la pila de inquilinos de destino en función de la entrada.
Herramientas
AWSservicios
Amazon API Gateway le ayuda a crear, publicar, mantener, supervisar y proteger RESTHTTP, y WebSocket APIs a cualquier escala.
AWSCloud Development Kit (AWSCDK) es un marco de desarrollo de software que le ayuda a definir y aprovisionar AWS la infraestructura de nube en código.
AWSCDKToolkit es un kit de desarrollo en la nube de línea de comandos que te ayuda a interactuar con tu aplicación AWS Cloud Development Kit (AWSCDK).
AWSLa interfaz de línea de comandos (AWSCLI) es una herramienta de código abierto que te ayuda a interactuar con AWS los servicios mediante comandos en tu consola de línea de comandos.
AWS CloudFormationle ayuda a configurar AWS los recursos, aprovisionarlos de forma rápida y coherente y administrarlos a lo largo de su ciclo de vida en todas AWS las cuentas y regiones.
Amazon DynamoDB es un servicio SQL sin base de datos totalmente gestionado que proporciona un rendimiento rápido, predecible y escalable.
AWSIdentity and Access Management (IAM) le ayuda a administrar de forma segura el acceso a sus AWS recursos al controlar quién está autenticado y autorizado a usarlos.
AWSEl Servicio de administración de claves (AWSKMS) le ayuda a crear y controlar claves criptográficas para proteger sus datos.
AWSLambda es un servicio informático que le ayuda a ejecutar código sin necesidad de aprovisionar o administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.
Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos basado en la nube que le ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.
Amazon Simple Notification Service (AmazonSNS) le ayuda a coordinar y gestionar el intercambio de mensajes entre editores y clientes, incluidos los servidores web y las direcciones de correo electrónico.
Amazon Simple Queue Service (AmazonSQS) proporciona una cola alojada segura, duradera y disponible que le ayuda a integrar y desacoplar sistemas y componentes de software distribuidos.
AWSToolkit for Visual Studio es un complemento para el entorno de desarrollo integrado de Visual Studio IDE (). El Toolkit for Visual Studio admite el desarrollo, la depuración y la implementación. NETaplicaciones que utilizan AWS servicios.
Otras herramientas
Visual Studio
incluye compiladores, herramientas de finalización de código, diseñadores gráficos y otras funciones que respaldan el desarrollo de software. IDE
Código
El código de este patrón se encuentra en el repositorio Tenant Onboarding in SaaS Architecture for Silo APG
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Compruebe la instalación de Node.js. | Para comprobar que Node.js esté instalado en su equipo local, ejecute el siguiente comando.
| AWSadministrador, AWS DevOps |
Instale el AWS CDK kit de herramientas. | Para instalar AWS CDK Toolkit en su máquina local, ejecute el siguiente comando.
Si npm no está instalado, puede instalarlo desde el sitio Node.js | AWSadministrador, AWS DevOps |
Compruebe la versión del AWS CDK kit de herramientas. | Para comprobar que la versión del AWS CDK kit de herramientas está instalada correctamente en su máquina, ejecute el siguiente comando.
| AWSadministrador, AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Clonar el repositorio. | Clone el repositorio Abra la solución Los siguientes recursos se crean como parte de esta pila:
| AWSadministrador, AWS DevOps |
Revise la CloudFormation plantilla. | En la La plantilla proporciona la infraestructura específica para cada inquilino. En este ejemplo, proporciona la AWS KMS clave, Amazon SNSSQS, Amazon y la CloudWatch alarma. | Desarrollador de aplicaciones, AWS DevOps |
Revise la función de incorporación de inquilinos. | Abra Abra Tenga en cuenta que los siguientes NuGet paquetes se agregan como dependencias al
| Desarrollador de aplicaciones, AWS DevOps |
Revise la InfraProvisioning función Tenant. | Vaya a Abra Abra Tenga en cuenta que los siguientes NuGet paquetes se agregan como dependencias al
| Desarrollador de aplicaciones, AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Compilar la solución. | Para crear la solución, siga los pasos que se indican a continuación:
Nota: Asegúrese de actualizar el paquete | Desarrollador de aplicaciones |
Arranque el AWS CDK entorno. | Abre la línea de comandos de Windows y navega hasta la carpeta raíz de la AWS CDK aplicación donde está disponible el
Si ha creado un AWS perfil para las credenciales, utilice el comando con su perfil.
| AWSadministrador, AWS DevOps |
Haz una lista de las AWS CDK pilas. | Para obtener una lista de todas las pilas que se van a crear como parte de este proyecto, ejecute el siguiente comando.
Si ha creado un AWS perfil para las credenciales, utilice el comando con su perfil.
| AWSadministrador, AWS DevOps |
Revise qué AWS recursos se crearán. | Para revisar todos los AWS recursos que se crearán como parte de este proyecto, ejecute el siguiente comando.
Si ha creado un AWS perfil para las credenciales, utilice el comando con su perfil.
| AWSadministrador, AWS DevOps |
Despliegue todos los AWS recursos mediante AWSCDK. | Para implementar todos los AWS recursos, ejecute el siguiente comando.
Si ha creado un AWS perfil para las credenciales, utilice el comando con su perfil.
Una vez finalizada la implementación, copie los API URL datos de la sección de resultados de la línea de comandos, como se muestra en el siguiente ejemplo.
| AWSadministrador, AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree un nuevo inquilino. | Para crear el nuevo inquilino, envíe la siguiente solicitud de curl.
Cambie el marcador
En el siguiente ejemplo, se muestra el resultado.
| Desarrollador de aplicaciones, AWS administrador, AWS DevOps |
Compruebe los detalles del inquilino recién creado en DynamoDB. | Para comprobar los detalles del inquilino recién creado en DynamoDB, siga estos pasos.
| Desarrollador de aplicaciones, administrador, AWS AWS DevOps |
Verifique la creación de la pila para el nuevo inquilino. | Compruebe que la nueva pila se haya creado correctamente y se haya aprovisionado con la infraestructura para el inquilino recién creado de acuerdo con la CloudFormation plantilla.
| Desarrollador de aplicaciones, AWS administrador, AWS DevOps |
Elimine la pila de inquilinos. | Para eliminar la nueva pila de inquilinos, envíe la siguiente solicitud de curl.
Cambie el marcador
En el siguiente ejemplo, se muestra el resultado.
| Desarrollador de aplicaciones AWS DevOps, AWS administrador |
Verifique la eliminación de la pila para el inquilino existente. | Para comprobar que se ha eliminado la pila de inquilinos existente, siga estos pasos:
| Desarrollador de aplicaciones, AWS administrador, AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Destruya el entorno. | Antes de limpiar la pila, asegúrese de lo siguiente:
Una vez finalizadas las pruebas, se AWS CDK pueden utilizar para destruir todas las pilas y los recursos relacionados ejecutando el siguiente comando.
Si ha creado un AWS perfil para las credenciales, utilícelo. Confirme la solicitud de eliminación de la pila para eliminarla. | AWSadministrador, AWS DevOps |
Limpia Amazon CloudWatch Logs. | El proceso de eliminación de la pila no limpiará CloudWatch los registros (grupos de registros y registros) generados por la pila. Limpie los CloudWatch recursos manualmente mediante la CloudWatch consola o elAPI. | Desarrollador de aplicaciones AWS DevOps, AWS administrador |
Recursos relacionados
AWSCDK. NET
Taller CDK. NETReferencia
Información adicional
Conjunto de tecnologías de plano de control
El CDK código escrito en. NETse utiliza para aprovisionar la infraestructura del plano de control, que consta de los siguientes recursos:
APIPuerta de enlace
Sirve como punto de REST API entrada para la pila de planos de control.
Función de Lambda de incorporación de inquilinos
APIGateway inicia esta función Lambda mediante el método m.
Una API solicitud de POST método hace que (
tenant name
,tenant description
) se inserte en la tabla deTenant Onboarding
DynamoDB.En este ejemplo de código, el nombre del inquilino también se usa como parte del nombre de la pila de inquilinos y de los nombres de los recursos de esa pila. Esto es para facilitar la identificación de estos recursos. El nombre de este inquilino debe ser único en la configuración para evitar conflictos o errores. La configuración detallada de la validación de entradas se explica en la documentación de IAMfunciones y en la sección de limitaciones.
El proceso de persistencia en la tabla de DynamoDB solo tendrá éxito si el nombre del inquilino no se utiliza en ningún otro registro de la tabla.
En este caso, el nombre del inquilino es la clave de partición de esta tabla, ya que solo la clave de partición se puede usar como expresión de condición
PutItem
.Si el nombre del inquilino nunca se registró antes, el registro se guardará correctamente en la tabla.
Sin embargo, si un registro existente de la tabla ya utiliza el nombre del inquilino, la operación fallará e iniciará una excepción de DynamoDB
ConditionalCheckFailedException
. La excepción se utilizará para devolver un mensaje de error (HTTP BadRequest
) que indique que el nombre del inquilino ya existe.Una API solicitud de
DELETE
método eliminará el registro del nombre de un inquilino específico de la tablaTenant Onboardin
g.La eliminación del registro de DynamoDB en este ejemplo se realizará correctamente aunque el registro no exista.
Si el registro de destino existe y se elimina, se creará un registro de transmisión de DynamoDB. De lo contrario, no se creará ningún registro posterior.
Incorporación de DynamoDB por parte del inquilino, con Amazon DynamoDB Streams habilitado
Esto registra la información de los metadatos del inquilino y cualquier registro que se guarde o elimine enviará un flujo descendente a la función de Lambda
Tenant Infrastructure
.Función de Lambda de infraestructura inquilina
Esta función de Lambda la inicia el registro de flujo de DynamoDB del paso anterior. Si el registro es para un
INSERT
evento, se invoca AWS CloudFormation para crear una nueva infraestructura de inquilinos con la CloudFormation plantilla que está almacenada en un bucket de S3. Si el registro es paraREMOVE
, se inicia la eliminación de una pila existente en función del campo del registro de transmisiónTenant Name
.S3 bucket
Esto sirve para almacenar la CloudFormation plantilla.
IAMfunciones para cada función de Lambda y una función de servicio para CloudFormation
Cada función de Lambda tiene su IAM función única con permisos de mínimo privilegio para realizar su tarea. Por ejemplo, la función de Lambda
Tenant On-boarding
tiene acceso de lectura y escritura a DynamoDB y la función de LambdaTenant Infrastructure
solo puede leer el flujo de DynamoDB.Se crea un rol de CloudFormation servicio personalizado para el aprovisionamiento de la pila de inquilinos. Esta función de servicio contiene permisos adicionales para el aprovisionamiento de CloudFormation pilas (por ejemplo, la AWS KMS clave). Esto divide las funciones entre Lambda y CloudFormation evita todos los permisos en una sola función (función de Infraestructura Lambda).
Los permisos que permiten realizar acciones poderosas (como crear y eliminar CloudFormation pilas) están bloqueados y solo se permiten en los recursos que comienzan con.
tenantcluster-
La excepción se AWS KMS debe a su convención de nomenclatura de recursos. El nombre del arrendatario introducido se API añadirá antes de otras comprobaciones de validación (alfanuméricas, solo con guiones y limitadas a menos de 30 caracteres para que quepan en la mayoría AWS de los nombres de los recursos).tenantcluster-
Esto garantiza que el nombre del inquilino no provoque una interrupción accidental de los recursos o las pilas de la infraestructura principal.
Pila de tecnología para inquilinos
La CloudFormation plantilla se almacena en el depósito de S3. La plantilla proporciona la AWS KMS clave específica del inquilino, una CloudWatch alarma, un SNS tema, una SQS cola y una política. SQS
Amazon SNS y Amazon SQS utilizan la AWS KMS clave para cifrar los datos de sus mensajes. Las prácticas de seguridad para AwsSolutions AwsSolutions(SNS2y) SQS2
La SQS política se usa en la SQS cola de Amazon para permitir que el SNS tema creado entregue el mensaje a la cola. Sin la SQS política, se denegará el acceso. Para obtener más información, consulta la SNSdocumentación de Amazon.