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.
Cree una arquitectura sin servidor multiusuario en Amazon Service OpenSearch
Creado por Tabby Ward (AWS) y Nisha Gambhir () AWS
Entorno: PoC o piloto | Tecnologías: modernización; SaaS; sin servidor | Carga de trabajo: código abierto |
AWSservicios: Amazon OpenSearch Service; AWS Lambda; Amazon S3; Amazon Gateway API |
Resumen
Amazon OpenSearch Service es un servicio gestionado que facilita la implementación, el funcionamiento y el escalado de Elasticsearch, un popular motor de búsqueda y análisis de código abierto. Amazon OpenSearch Service ofrece búsquedas de texto libre, así como ingestión y creación de paneles prácticamente en tiempo real para la transmisión de datos, como registros y métricas.
Los proveedores de software como servicio (SaaS) suelen utilizar Amazon OpenSearch Service para abordar una amplia gama de casos de uso, como obtener información sobre los clientes de forma escalable y segura y, al mismo tiempo, reducir la complejidad y el tiempo de inactividad.
El uso de Amazon OpenSearch Service en un entorno multiusuario introduce una serie de consideraciones que afectan a la partición, el aislamiento, la implementación y la administración de la solución SaaS. Los proveedores de SaaS deben considerar cómo escalar de manera efectiva sus clústeres de Elasticsearch con cargas de trabajo en constante cambio. También deben tener en cuenta cómo pueden afectar la estratificación y el ruido aledaño a su modelo de particionamiento.
Este patrón revisa los modelos empleados para representar y aislar los datos de los usuarios con constructos de Elasticsearch. Además, el patrón se centra en una arquitectura de referencia sencilla sin servidor como ejemplo para demostrar la indexación y la búsqueda mediante Amazon OpenSearch Service en un entorno multiusuario. Implementa el modelo de particionamiento de datos de grupos, que comparte un mismo índice entre todos los usuarios y, al mismo tiempo, mantiene el aislamiento de los datos de los mismos. Este patrón utiliza los siguientes servicios de Amazon Web Services (AWS): Amazon API Gateway, AWS Lambda, Amazon Simple Storage Service (Amazon S3) y Amazon Service. OpenSearch
Para obtener más información sobre el modelo de grupo y otros modelos de particionamiento de datos, consulte la sección de Información adicional.
Requisitos previos y limitaciones
Requisitos previos
Una cuenta activa AWS
AWSInterfaz de línea de comandos (AWSCLI) versión 2.x, instalada y configurada en macOS, Linux o Windows
pip3
: el código fuente de Python se proporciona como un archivo .zip para implementarlo en una función de Lambda. Si quiere usar el código localmente o personalizarlo, siga estos pasos para desarrollar y recompilar el código fuente: Genere el archivo
requirements.txt
ejecutando el siguiente comando en el mismo directorio que los scripts de Python:pip3 freeze > requirements.txt
Instale las dependencias:
pip3 install -r requirements.txt
Limitaciones
Este código se ejecuta en Python y, actualmente, no es compatible con otros lenguajes de programación.
La aplicación de ejemplo no incluye compatibilidad AWS entre regiones ni con la recuperación ante desastres (DR).
Este patrón sólo pretende servir de ejemplo. No está pensado para ser utilizado en un entorno de producción.
Arquitectura
El siguiente diagrama ilustra la arquitectura de alto nivel de este patrón. La arquitectura incluye lo siguiente:
AWSLambda para indexar y consultar el contenido
Amazon OpenSearch Service para realizar búsquedas
Amazon API Gateway para proporcionar una API interacción con el usuario
Amazon S3, para almacenar datos sin procesar (no indexados)
Amazon CloudWatch supervisará los registros
AWSIdentity and Access Management (IAM) para crear roles y políticas de inquilinos
Automatizar y escalar
Para simplificar, el patrón se utiliza AWS CLI para aprovisionar la infraestructura e implementar el código de muestra. Puedes crear una AWS CloudFormation plantilla o scripts del AWS Cloud Development Kit (AWSCDK) para automatizar el patrón.
Herramientas
AWSservicios
AWSCLI— La interfaz de línea de AWS comandos (AWSCLI) es una herramienta unificada para administrar AWS servicios y recursos mediante el uso de comandos en el shell de la línea de comandos.
AWSLambda: AWS Lambda
es un servicio de procesamiento que le permite ejecutar código sin aprovisionar ni administrar servidores. Lambda ejecuta su código solo cuando es necesario y escala de manera automática, desde unas pocas solicitudes por día hasta miles por segundo. Amazon API Gateway
: Amazon API Gateway es un AWS servicio para crear, publicar, mantener, supervisar y proteger RESTHTTP, y WebSocket APIs a cualquier escala. Amazon S3: Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos que permite almacenar y recuperar cualquier cantidad de información en cualquier momento y desde cualquier lugar de la web.
Amazon OpenSearch Service
: Amazon OpenSearch Service es un servicio totalmente gestionado que te facilita la implementación, la protección y la ejecución de Elasticsearch a escala y de forma rentable.
Código
El archivo adjunto incluye archivos de muestra para este patrón. Entre ellos se incluyen:
index_lambda_package.zip
— La función Lambda para indexar datos en Amazon OpenSearch Service mediante el modelo de grupo.search_lambda_package.zip
— La función Lambda para buscar datos en Amazon OpenSearch Service.Tenant-1-data
— Muestra de datos sin procesar (no indexados) para Usuario-1.Tenant-2-data
: muestra de datos sin procesar (no indexados) para Usuario-2.
Importante: Las historias de este patrón incluyen ejemplos de CLI comandos formateados para Unix, Linux y macOS. Para Windows, sustituya la barra diagonal invertida (\) utilizada como carácter de continuación de Unix al final de cada línea por el signo de intercalación (^).
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree un bucket de S3. | Cree un bucket de S3 en su región. AWS Este bucket contendrá los datos de usuarios no indexados de la aplicación de muestra. Asegúrese de que el nombre del bucket de S3 sea único a nivel mundial, ya que todas AWS las cuentas comparten el espacio de nombres. Para crear un bucket de S3, puedes usar el comando AWS CLI create-bucket
donde | Arquitecto de la nube, administrador de la nube |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Crea un dominio OpenSearch de Amazon Service. | Ejecuta el AWS CLI create-elasticsearch-domain
El número de instancias está establecido en 1, ya que el dominio se usa para realizar pruebas. Debe habilitar un control de acceso detallado mediante el parámetro Este comando crea un nombre de usuario maestro ( Como el dominio forma parte de una nube privada virtual (VPC), debes asegurarte de poder acceder a la instancia de Elasticsearch especificando la política de acceso que vas a usar. Para obtener más información, consulta Cómo lanzar tus dominios OpenSearch de Amazon Service mediante un VPC en la AWS documentación. | Arquitecto de la nube, administrador de la nube |
Instale un host bastión. | Configura una instancia Windows de Amazon Elastic Compute Cloud (AmazonEC2) como host bastión para acceder a la consola de Kibana. El grupo de seguridad de Elasticsearch debe permitir el tráfico del grupo de EC2 seguridad de Amazon. Para obtener instrucciones, consulte la entrada del blog Cómo controlar el acceso a la red a las EC2 instancias mediante un servidor Bastion Cuando se haya configurado el host bastión y tenga disponible el grupo de seguridad asociado a la instancia, utilice el AWS CLI authorize-security-group-ingress
| Arquitecto de la nube, administrador de la nube |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Para crear el rol de ejecución de Lambda | Ejecute el comando AWS CLI create-role
donde
| Arquitecto de la nube, administrador de la nube |
Adjunte políticas gestionadas al rol de Lambda. | Ejecute el AWS CLI attach-role-policy
| Arquitecto de la nube, administrador de la nube |
Cree una política para dar permisos a la función de índice de Lambda de modo que pueda leer los objetos de S3. | Ejecute el comando AWS CLI create-policy
El archivo
| Arquitecto de la nube, administrador de la nube |
Adjunte la política de permisos de Amazon S3 al rol de ejecución de Lambda. | Ejecute el AWS CLI attach-role-policy
donde | Arquitecto de la nube, administrador de la nube |
Cree la función de indexar de Lambda. | Ejecute el comando AWS CLI create-function
| Arquitecto de la nube, administrador de la nube |
Permita que Amazon S3 llame a la función de índice de Lambda. | Ejecute el comando AWS CLI add-permission
| Arquitecto de la nube, administrador de la nube |
Añada un desencadenante de Lambda para el evento de Amazon S3. | Ejecute el AWS CLI put-bucket-notification-configuration
El archivo | Arquitecto de la nube, administrador de la nube |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Para crear el rol de ejecución de Lambda | Ejecute el comando AWS CLI create-role
donde
| Arquitecto de la nube, administrador de la nube |
Adjunte políticas gestionadas al rol de Lambda. | Ejecute el AWS CLI attach-role-policy
| Arquitecto de la nube, administrador de la nube |
Cree la función de búsqueda de Lambda. | Ejecute el comando AWS CLI create-function
| Arquitecto de la nube, administrador de la nube |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree roles de inquilino. IAM | Ejecute el comando AWS CLI create-role
El archivo
| Arquitecto de la nube, administrador de la nube |
Cree una IAM política de inquilinos. | Ejecuta el comando AWS CLI create-policy
El archivo
| Arquitecto de la nube, administrador de la nube |
Adjunte la IAM política de inquilinos a las funciones de los inquilinos. | Ejecute el AWS CLI attach-role-policy
La política ARN se basa en el resultado del paso anterior. | Arquitecto de la nube, administrador de la nube |
Cree una IAM política para conceder a Lambda permisos para asumir el rol. | Ejecute el comando AWS CLI create-policy
El archivo
En | Arquitecto de la nube, administrador de la nube |
Cree una IAM política para conceder permiso al rol de índice Lambda para acceder a Amazon S3. | Ejecute el comando AWS CLI create-policy
El archivo
| Arquitecto de la nube, administrador de la nube |
Adjunte la política al rol de ejecución de Lambda. | Ejecute el AWS CLI attach-role-policy
La política ARN se basa en el resultado del paso anterior. | Arquitecto de la nube, administrador de la nube |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree una API entrada REST API en Gateway. | Ejecute el CLI create-rest-api
Para el tipo de configuración de punto final, puede especificar, Anote el valor del campo | Arquitecto de la nube, administrador de la nube |
Cree un recurso para la búsquedaAPI. | El API recurso de búsqueda inicia la función de búsqueda Lambda con el nombre del recurso.
| Arquitecto de la nube, administrador de la nube |
Cree un GET método para la búsqueda. API | Ejecute el comando AWS CLI put-method
Para | Arquitecto de la nube, administrador de la nube |
Cree una respuesta de método para la búsqueda. API | Ejecute el AWS CLI put-method-response
En | Arquitecto de la nube, administrador de la nube |
Configure una integración de Lambda proxy para la búsqueda. API | Ejecute el AWS CLI comando put-integration
En | Arquitecto de la nube, administrador de la nube |
Conceda permiso a API Gateway para llamar a la función de búsqueda Lambda. | Ejecute el comando AWS CLI add-permission
Cambie la | Arquitecto de la nube, administrador de la nube |
Implemente la búsquedaAPI. | Ejecute el comando AWS CLI create-deployment
Si actualiza elAPI, puede usar el mismo CLI comando para volver a implementarlo en la misma etapa. | Arquitecto de la nube, administrador de la nube |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Inicie sesión en la consola Kibana. |
| Arquitecto de la nube, administrador de la nube |
Cree y configure roles de Kibana. | Para aislar los datos y garantizar que un usuario no pueda recuperar los datos de otro, debe proteger los documentos con seguridad. Así, los usuarios podrán acceder únicamente a aquellos documentos que contienen su ID de usuario.
| Arquitecto de la nube, administrador de la nube |
Asigne usuarios a los roles. |
Le recomendamos que automatice la creación de los roles de usuario y roles de Kibana en el momento de la incorporación del usuario. | Arquitecto de la nube, administrador de la nube |
Cree el índice de datos de usuarios. | En el panel de navegación, en Administración, seleccione Herramientas de desarrollo y, a continuación, ejecute el siguiente comando. Este comando crea el índice
| Arquitecto de la nube, administrador de la nube |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree un VPC punto de conexión para Amazon S3. | Ejecute el AWS CLI create-vpc-endpoint
Para | Arquitecto de la nube, administrador de la nube |
Cree un VPC punto final para AWSSTS. | Ejecute el AWS CLI create-vpc-endpoint
Para | Arquitecto de la nube, administrador de la nube |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Actualice los archivos de Python para las funciones de índice y búsqueda. |
Puedes obtener el punto de conexión de Elasticsearch desde la pestaña Overview de la consola de Amazon OpenSearch Service. Tiene el formato | Arquitecto de la nube, desarrollador de aplicaciones |
Actualizar el código de Lambda. | Use el AWS CLI update-function-code
| Arquitecto de la nube, desarrollador de aplicaciones |
Cargue los datos sin procesar en el bucket de S3. | Use el comando AWS CLI cp
El bucket de S3 está configurado para ejecutar la función de índice de Lambda siempre que se carguen datos, de modo que el documento se indexe en Elasticsearch. | Arquitecto de la nube, administrador de la nube |
Busque datos desde la consola de Kibana. | En la consola de Kibana, ejecute la siguiente consulta:
Esta consulta muestra todos los documentos indexados en Elasticsearch. En este caso, debería ver dos documentos separados para Usuario-1 y Usuario-2. | Arquitecto de la nube, administrador de la nube |
Pruebe la búsqueda desde Gateway. API API |
Para ver una ilustración de la pantalla, consulte la sección de Información adicional. | Arquitecto de la nube, desarrollador de aplicaciones |
Recursos relacionados
Información adicional
Modelos de particionamiento de datos
Hay tres modelos comunes de particionamiento de datos que se emplean en los sistemas multiusuario: silos, agrupados e híbridos. El modelo que elija dependerá de las necesidades de cumplimiento, ruido, operaciones y aislamiento de su entorno.
Modelo de silo
En el modelo de silo, los datos de cada usuario se almacenan en un área de almacenamiento distinta, por lo que los datos de los usuarios no se mezclan. Puedes usar dos enfoques para implementar el modelo de silo con Amazon OpenSearch Service: dominio por inquilino e índice por inquilino.
Dominio por inquilino: puedes usar un dominio de Amazon OpenSearch Service independiente (sinónimo de un clúster de Elasticsearch) por inquilino. Tener a cada usuario en su propio dominio proporciona todos los beneficios de tener los datos en un constructo independiente. Sin embargo, este enfoque presenta desafíos de gestión y agilidad. Su naturaleza distribuida dificulta la agregación y la evaluación del estado operativo y la actividad de los usuarios. Se trata de una opción costosa que requiere que cada dominio de Amazon OpenSearch Service tenga como mínimo tres nodos maestros y dos nodos de datos para las cargas de trabajo de producción.
Índice por inquilino: puedes colocar los datos del inquilino en índices separados dentro de un clúster de Amazon OpenSearch Service. Con este enfoque, se usa un identificador de usuario al crear y asignar un nombre al índice, anteponiendo el identificador de usuario al nombre del índice. El enfoque de índice por usuario le ayuda a alcanzar sus objetivos de compartimentación sin tener que introducir un clúster completamente separado para cada usuario. Sin embargo, si aumenta el número de índices, es posible que la memoria se agote, ya que este enfoque requiere más particiones y el nodo maestro tiene que gestionar una mayor asignación y reequilibrio.
Aislamiento en el modelo de silo: en el modelo de silo, se utilizan IAM políticas para aislar los dominios o índices que contienen los datos de cada inquilino. Estas políticas impiden que un usuario acceda a los datos de otro. Para implementar su modelo de aislamiento en silos, puede crear una política basada en recursos que controle el acceso al recurso de su usuario. Suele ser una política de acceso al dominio que especifica qué acciones puede realizar un principal en los subrecursos del dominio, incluidos los índices de Elasticsearch y. APIs Con las políticas IAM basadas en la identidad, puedes especificar las acciones permitidas o denegadas en el dominio, los índices o dentro APIs de Amazon Service. OpenSearch El Action
elemento de una IAM política describe la acción o las acciones específicas que la política permite o deniega, y el Principal
elemento especifica las cuentas, los usuarios o los roles afectados.
El siguiente ejemplo de política otorga a Usuario-1 acceso total (según lo especificado en es:*
) únicamente a los subrecursos del dominio tenant-1
. El /*
de seguimiento en el elemento Resource
indica que esta política se aplica a los sub-recursos del dominio, no al dominio en sí. Cuando esta política esté en vigor, los usuarios no podrán crear un dominio nuevo ni modificar la configuración de un dominio existente.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::aws-account-id:user/Tenant-1" }, "Action": "es:*", "Resource": "arn:aws:es:Region:account-id:domain/tenant-1/*" } ] }
Para implementar el modelo de silo de índice por usuario, tendrá que modificar este ejemplo de política para restringir aún más a Usuario-1 al índice o índices especificados, indicando el nombre del índice. El siguiente ejemplo de política restringe a Usuario-1 al índice tenant-index-1
.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Tenant-1" }, "Action": "es:*", "Resource": "arn:aws:es:Region:account-id:domain/test-domain/tenant-index-1/*" } ] }
Modelo de grupo
En el modelo de grupo, todos los datos de los usuarios se almacenan en un índice dentro del mismo dominio. El identificador del usuario se incluye en los datos (documento) y se usa como clave de partición, de modo que puede determinar qué datos pertenecen a cada usuario. Este modelo reduce la sobrecarga de administración. Operar y administrar un índice agrupado es más fácil y eficiente que administrar varios índices. Sin embargo, dado que los datos de los usuarios están mezclados en el mismo índice, se pierde el aislamiento natural de los usuarios que proporciona el modelo de silos. Este enfoque también podría reducir el rendimiento debido al efecto de ruido aledaño.
Aislamiento de usuarios en el modelo de grupo: en general, el aislamiento de usuarios es difícil de implementar en el modelo de grupo. El IAM mecanismo utilizado con el modelo de silo no permite describir el aislamiento en función del ID de inquilino almacenado en el documento.
Un enfoque alternativo consiste en utilizar el soporte detallado de control de acceso (FGAC) que ofrece Open Distro para Elasticsearch. FGACle permite controlar los permisos a nivel de índice, documento o campo. Con cada solicitud, FGAC evalúa las credenciales del usuario y autentica al usuario o deniega el acceso. Si FGAC autentica al usuario, obtiene todos los roles asignados a ese usuario y utiliza el conjunto completo de permisos para determinar cómo gestionar la solicitud.
Para lograr el aislamiento requerido en el modelo agrupado, puede usar seguridad a nivel de documento
{ "bool": { "must": { "match": { "tenantId": "Tenant-1" } } } }
Modelo híbrido
El modelo híbrido emplea una combinación de los modelos de silo y grupo en el mismo entorno para ofrecer experiencias únicas a cada nivel de usuario (como los niveles gratuito, estándar y prémium). Cada nivel sigue el mismo perfil de seguridad que se usó en el modelo de grupo.
Aislamiento de inquilinos en el modelo híbrido: en el modelo híbrido, se sigue el mismo perfil de seguridad que en el modelo de grupo, mientras que el uso del modelo de FGAC seguridad a nivel de documento proporciona aislamiento a los inquilinos. Si bien esta estrategia simplifica la administración de clústeres y ofrece agilidad, complica otros aspectos de la arquitectura. Por ejemplo, el código requiere una complejidad adicional para determinar qué modelo está asociado a cada usuario. También deberá asegurarse de que las consultas de un solo usuario no saturen todo el dominio ni degraden la experiencia de otros usuarios.
Pruebas en API Gateway
Ventana de prueba para consulta de Usuario-1
Ventana de prueba para consulta de Usuario-2
Conexiones
Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip