

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
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service"></a>

*Tabby Ward y Nisha Gambhir, Amazon Web Services*

## Resumen
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-summary"></a>

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. OpenSearch El servicio ofrece una búsqueda de texto libre, así como una recopilación y un panel de control 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 el OpenSearch Servicio 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 del OpenSearch servicio 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 su 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 y sin servidor como ejemplo para demostrar la indexación y la búsqueda mediante 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 AWS servicios: Amazon API Gateway AWS Lambda, Amazon Simple Storage Service (Amazon S3) y 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](#build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional).

## Requisitos previos y limitaciones
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-prereqs"></a>

**Requisitos previos **
+ Un activo Cuenta de AWS
+ [AWS Command Line Interface (AWS CLI) versión 2.x](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html), instalada y configurada en macOS, Linux o Windows
+ [Python versión 3.9](https://www.python.org/downloads/release/python-3921/)
+ [pip3](https://pip.pypa.io/en/stable/): 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:

  1. Genere el archivo `requirements.txt` ejecutando el siguiente comando en el mismo directorio que los scripts de Python: `pip3 freeze > requirements.txt`

  1. 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
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-architecture"></a>

El siguiente diagrama ilustra la arquitectura de alto nivel de este patrón. La arquitectura incluye lo siguiente:
+ Lambda para indexar y consultar el contenido 
+ OpenSearch Servicio para realizar búsquedas 
+ API Gateway para proporcionar a la API interacción con el usuario
+ Amazon S3, para almacenar datos sin procesar (no indexados)
+ Amazon CloudWatch supervisará los registros
+ AWS Identity and Access Management (IAM) para crear las funciones y políticas de los inquilinos

![\[Arquitectura multiusuario sin servidor de alto nivel\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/1a8501e7-0776-4aca-aed3-28e3ada1d15d.png)


**Automatización y escala**

Para simplificar, el patrón se utiliza AWS CLI para aprovisionar la infraestructura e implementar el código de muestra. Puede crear una CloudFormation plantilla o AWS Cloud Development Kit (AWS CDK) scripts para automatizar el patrón.

## Tools (Herramientas)
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-tools"></a>

**Servicios de AWS**
+ [AWS CLI](https://aws.amazon.com/cli/)es una herramienta unificada para administrar Servicios de AWS los recursos mediante el uso de comandos en el shell de la línea de comandos.
+ [Lambda](https://aws.amazon.com/lambda/) es un servicio informático que 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.
+ [API Gateway](https://aws.amazon.com/api-gateway/) es Servicio de AWS para crear, publicar, mantener, monitorear y proteger REST, HTTP y WebSocket APIs a cualquier escala.
+ [Amazon S3](https://aws.amazon.com/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.
+ OpenSearch El [servicio](https://aws.amazon.com/opensearch-service/) es un servicio totalmente gestionado que 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 OpenSearch Service mediante el modelo de grupo.
+ `search_lambda_package.zip`— La función Lambda para buscar datos en 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 AWS CLI comandos formateados para Unix, Linux y macOS. Para Windows, sustituya la barra diagonal invertida (\$1) utilizada como carácter de continuación de Unix al final de cada línea por el signo de intercalación (^).

**nota**  
En AWS CLI los comandos, sustituya todos los valores entre los corchetes angulares (<>) por los valores correctos.

## Epics
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-epics"></a>

### Creación y configuración de un bucket de S3
<a name="create-and-configure-an-s3-bucket"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un bucket de S3. | Cree un bucket de S3 en su. Región de 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 todos comparten el espacio de nombres. Cuentas de AWSPara crear un bucket de S3, puedes usar el comando AWS CLI [create-bucket](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html) de la siguiente manera:<pre>aws s3api create-bucket \<br />  --bucket <tenantrawdata> \<br />  --region <your-AWS-Region></pre>donde `tenantrawdata` es el nombre de bucket de S3. (Puede usar cualquier nombre único que siga las [pautas de nomenclatura de buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)). | Arquitecto de la nube, administrador de la nube | 

### Cree y configure un clúster de Elasticsearch
<a name="create-and-configure-an-elasticsearch-cluster"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un dominio de OpenSearch servicio. | Ejecute el AWS CLI [create-elasticsearch-domain](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/es/create-elasticsearch-domain.html)comando para crear un dominio OpenSearch de servicio:<pre>aws es create-elasticsearch-domain \<br />  --domain-name vpc-cli-example \<br />  --elasticsearch-version 7.10 \<br />  --elasticsearch-cluster-config InstanceType=t3.medium.elasticsearch,InstanceCount=1 \<br />  --ebs-options EBSEnabled=true,VolumeType=gp2,VolumeSize=10 \<br />  --domain-endpoint-options "{\"EnforceHTTPS\": true}" \<br />  --encryption-at-rest-options "{\"Enabled\": true}" \<br />  --node-to-node-encryption-options "{\"Enabled\": true}" \<br />  --advanced-security-options "{\"Enabled\": true, \"InternalUserDatabaseEnabled\": true, \<br />    \"MasterUserOptions\": {\"MasterUserName\": \"KibanaUser\", \<br />    \"MasterUserPassword\": \"NewKibanaPassword@123\"}}" \<br />  --vpc-options "{\"SubnetIds\": [\"<subnet-id>\"], \"SecurityGroupIds\": [\"<sg-id>\"]}" \<br />  --access-policies "{\"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \ <br />    \"Principal\": {\"AWS\": \"*\" }, \"Action\":\"es:*\", \<br />    \"Resource\": \"arn:aws:es:<region>:<account-id>:domain\/vpc-cli-example\/*\" } ] }"</pre>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 `advanced-security-options`, ya que los detalles no se pueden cambiar una vez creado el dominio. Este comando crea un nombre de usuario maestro (`KibanaUser`) y una contraseña que le permitirá iniciar sesión en la consola de Kibana.Como el dominio forma parte de una nube privada virtual (VPC), debe asegurarse de poder acceder a la instancia de Elasticsearch especificando la política de acceso que va a usar.Para obtener más información, consulta Cómo [lanzar tus dominios de Amazon OpenSearch Service dentro de una VPC](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html) 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 (Amazon EC2) 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](https://aws.amazon.com/blogs/security/controlling-network-access-to-ec2-instances-using-a-bastion-server/).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](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/authorize-security-group-ingress.html)comando para añadir permiso al grupo de seguridad de Elasticsearch a fin de permitir el puerto 443 del grupo de seguridad de Amazon EC2 (host bastión).<pre>aws ec2 authorize-security-group-ingress \<br />  --group-id <SecurityGroupIdfElasticSearch> \ <br />  --protocol tcp \<br />  --port 443 \<br />  --source-group <SecurityGroupIdfBashionHostEC2></pre> | Arquitecto de la nube, administrador de la nube | 

### Crear y configurar la función de índice de Lambda
<a name="create-and-configure-the-lam-index-function"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Para crear el rol de ejecución de Lambda | Ejecute el comando AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) para conceder a la función de índice Lambda acceso a los recursos y a los recursos: Servicios de AWS <pre>aws iam create-role \<br />  --role-name index-lambda-role \<br />  --assume-role-policy-document file://lambda_assume_role.json</pre>donde `lambda_assume_role.json` es un documento JSON que concede permisos de `AssumeRole` a la función de Lambda, de la siguiente manera:<pre>{<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />         {<br />             "Effect": "Allow",<br />             "Principal": {<br />                 "Service": "lambda.amazonaws.com"<br />               },<br />             "Action": "sts:AssumeRole"<br />         }<br />     ]<br /> }</pre> | Arquitecto de la nube, administrador de la nube | 
| Adjunte políticas gestionadas al rol de Lambda. | Ejecute el AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)comando para adjuntar las políticas administradas al rol creado en el paso anterior. Estas dos políticas otorgan al rol permisos para crear una interfaz de red elástica y escribir CloudWatch registros en Logs.<pre>aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br /><br />aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole </pre> | 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](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) para dar `s3:GetObject` permiso a la función de índice de Lambda para leer los objetos del bucket de S3:<pre>aws iam create-policy \<br />  --policy-name s3-permission-policy \<br />  --policy-document file://s3-policy.json</pre>El archivo `s3-policy.json` es un documento JSON que se muestra a continuación y que concede permisos de `s3:GetObject` para permitir el acceso de lectura a los objetos de S3. Si ha usado un nombre diferente al crear el bucket de S3, proporcione el nombre de bucket correcto en sección de `Resource `:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />           "Effect": "Allow",<br />           "Action": "s3:GetObject",<br />           "Resource": "arn:aws:s3:::<tenantrawdata>/*"<br />        }<br />    ]<br />}</pre> | 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](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)comando para adjuntar la política de permisos de Amazon S3 que creó en el paso anterior a la función de ejecución de Lambda:<pre>aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn <PolicyARN></pre>donde `PolicyARN` es el Nombre de recurso de Amazon (ARN) de la política de permisos de Amazon S3. Puede obtener este valor del resultado del comando anterior. | Arquitecto de la nube, administrador de la nube | 
| Cree la función de indexar de Lambda. | Ejecute el comando AWS CLI [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) para crear la función de índice Lambda, que accederá al servicio: OpenSearch <pre>aws lambda create-function \<br />  --function-name index-lambda-function \<br />  --zip-file fileb://index_lambda_package.zip \<br />  --handler lambda_index.lambda_handler \<br />  --runtime python3.9 \<br />  --role "arn:aws:iam::account-id:role/index-lambda-role" \<br />  --timeout 30 \<br />  --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \<br />    \"SecurityGroupIds\": [\"<sg-1>\"]}"</pre> | 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](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) para conceder a Amazon S3 el permiso de llamar a la función de índice Lambda:<pre>aws lambda add-permission \<br />  --function-name index-lambda-function \<br />  --statement-id s3-permissions \<br />  --action lambda:InvokeFunction \<br />  --principal s3.amazonaws.com \<br />  --source-arn "arn:aws:s3:::<tenantrawdata>" \<br />  --source-account "<account-id>" </pre> | 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](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-notification-configuration.html)comando para enviar notificaciones a la función de índice Lambda cuando se detecte el `ObjectCreated` evento de Amazon S3. La función de índice se ejecuta cada vez que se carga un objeto en el bucket de S3. <pre>aws s3api put-bucket-notification-configuration \<br />  --bucket <tenantrawdata> \<br />  --notification-configuration file://s3-trigger.json</pre>El archivo `s3-trigger.json` es un documento JSON de la carpeta actual que añade la política de recursos a la función de Lambda cuando se produce el evento `ObjectCreated` de Amazon S3. | Arquitecto de la nube, administrador de la nube | 

### Crear y configurar la función de búsqueda de Lambda
<a name="create-and-configure-the-lam-search-function"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Para crear el rol de ejecución de Lambda | Ejecute el comando AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) para conceder a la función de búsqueda de Lambda acceso a los recursos: Servicios de AWS <pre>aws iam create-role \<br />  --role-name search-lambda-role \<br />  --assume-role-policy-document file://lambda_assume_role.json</pre>donde `lambda_assume_role.json` es un documento JSON en la carpeta actual que concede permisos de `AssumeRole` a la función de Lambda, de la siguiente manera:<pre>{<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />         {<br />             "Effect": "Allow",<br />             "Principal": {<br />                 "Service": "lambda.amazonaws.com"<br />               },<br />             "Action": "sts:AssumeRole"<br />         }<br />     ]<br /> }</pre> | Arquitecto de la nube, administrador de la nube | 
| Adjunte políticas gestionadas al rol de Lambda. | Ejecute el AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)comando para adjuntar las políticas administradas al rol creado en el paso anterior. Estas dos políticas otorgan al rol permisos para crear una interfaz de red elástica y escribir CloudWatch registros en Logs.<pre>aws iam attach-role-policy \<br />  --role-name search-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br /><br />aws iam attach-role-policy \<br />  --role-name search-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole </pre> | Arquitecto de la nube, administrador de la nube | 
| Cree la función de búsqueda de Lambda. | Ejecute el comando AWS CLI [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) para crear la función de búsqueda de Lambda, que accederá al servicio: OpenSearch <pre>aws lambda create-function \<br />  --function-name search-lambda-function \<br />  --zip-file fileb://search_lambda_package.zip \<br />  --handler lambda_search.lambda_handler \<br />  --runtime python3.9 \<br />  --role "arn:aws:iam::account-id:role/search-lambda-role" \<br />  --timeout 30 \<br />  --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \<br />    \"SecurityGroupIds\": [\"<sg-1>\"]}"</pre> | Arquitecto de la nube, administrador de la nube | 

### Cree y configure los roles de usuario
<a name="create-and-configure-tenant-roles"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree roles de IAM para los usuarios. | Ejecute el comando AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) para crear dos roles arrendatarios que se utilizarán para probar la funcionalidad de búsqueda:<pre>aws iam create-role \<br />  --role-name Tenant-1-role \<br />  --assume-role-policy-document file://assume-role-policy.json</pre><pre>aws iam create-role \<br />  --role-name Tenant-2-role \<br />  --assume-role-policy-document file://assume-role-policy.json</pre>El archivo `assume-role-policy.json` es un documento JSON en la carpeta actual que concede permisos de `AssumeRole` al rol de ejecución de Lambda:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Principal": {<br />                 "AWS": "<Lambda execution role for index function>",<br />                 "AWS": "<Lambda execution role for search function>"<br />             },<br />            "Action": "sts:AssumeRole"<br />        }<br />    ]<br />}</pre> | Arquitecto de la nube, administrador de la nube | 
| Crear una política de IAM de usuario. | Ejecuta el comando AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) para crear una política de inquilinos que otorgue acceso a las operaciones de Elasticsearch:<pre>aws iam create-policy \<br />  --policy-name tenant-policy \<br />  --policy-document file://policy.json</pre>El archivo `policy.json` es un documento JSON en la carpeta actual que concede permisos en Elasticsearch:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": [<br />                "es:ESHttpDelete",<br />                "es:ESHttpGet",<br />                "es:ESHttpHead",<br />                "es:ESHttpPost",<br />                "es:ESHttpPut",<br />                "es:ESHttpPatch"<br />            ],<br />            "Resource": [<br />                "<ARN of Elasticsearch domain created earlier>"<br />            ]<br />        }<br />    ]<br />}</pre> | Arquitecto de la nube, administrador de la nube | 
| Adjunte la política de IAM del usuario a los roles del usuario. | Ejecute el AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)comando para adjuntar la política de IAM de inquilinos a las dos funciones de inquilino que creó en el paso anterior:<pre>aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/tenant-policy \<br />  --role-name Tenant-1-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/tenant-policy \<br />  --role-name Tenant-2-role</pre>La política ARN procede de lo obtenido en el paso anterior. | Arquitecto de la nube, administrador de la nube | 
| Cree una política de IAM para conceder permisos de asunción de rol a Lambda. | Ejecute el comando AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) para crear una política para que Lambda asuma el rol de inquilino:<pre>aws iam create-policy \<br />  --policy-name assume-tenant-role-policy \<br />  --policy-document file://lambda_policy.json</pre>El archivo `lambda_policy.json` es un documento JSON en la carpeta actual que concede permisos a `AssumeRole`:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />       {<br />            "Effect": "Allow",<br />            "Action":  "sts:AssumeRole",<br />            "Resource": "<ARN of tenant role created earlier>"<br />       }<br />    ]<br />}</pre>En `Resource`, puede usar un carácter comodín para evitar crear una nueva política para cada usuario. | Arquitecto de la nube, administrador de la nube | 
| Cree una política de IAM para conceder permisos al rol de indexación de Lambda para acceder a Amazon S3. | Ejecute el comando AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) para dar permiso al rol de índice de Lambda para acceder a los objetos del bucket de S3:<pre>aws iam create-policy \<br />  --policy-name s3-permission-policy \<br />  --policy-document file://s3_lambda_policy.json</pre>El archivo `s3_lambda_policy.json` es el siguiente documento de política de JSON de la carpeta actual:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": "s3:GetObject",<br />            "Resource": "arn:aws:s3:::tenantrawdata/*"<br />        }<br />    ]<br />}</pre> | 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](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)comando para adjuntar la política creada en el paso anterior al índice Lambda y a las funciones de ejecución de búsquedas que creó anteriormente:<pre>aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/assume-tenant-role-policy \<br />  --role-name index-lambda-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/assume-tenant-role-policy \<br />  --role-name search-lambda-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/s3-permission-policy \<br />  --role-name index-lambda-role</pre>La política ARN procede de lo obtenido en el paso anterior. | Arquitecto de la nube, administrador de la nube | 

### Cree y configure una API de búsqueda
<a name="create-and-configure-a-search-api"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una API de REST en API Gateway. | Ejecute el AWS CLI [create-rest-api](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/create-rest-api.html)comando para crear un recurso de API REST:<pre>aws apigateway create-rest-api \<br />  --name Test-Api \<br />  --endpoint-configuration "{ \"types\": [\"REGIONAL\"] }"</pre>En el tipo de configuración de punto de conexión, puede especificar `EDGE` en lugar de `REGIONAL` para usar ubicaciones periféricas en lugar de una Región de AWS concreta.Anote el valor del campo `id` en el resultado del comando. Esta es la ID de API que usará en los siguientes comandos. | Arquitecto de la nube, administrador de la nube | 
| Cree un recurso para la API de búsqueda. | El recurso de la API de búsqueda inicia la función de búsqueda de Lambda con el nombre de recurso `search`. (No es necesario crear una API para la función de índice de Lambda, ya que se ejecuta automáticamente cuando se cargan objetos en el bucket de S3).[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | Arquitecto de la nube, administrador de la nube | 
| Cree un método GET para la API de búsqueda. | Ejecuta el comando AWS CLI [put-method](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-method.html) para crear un `GET ` método para la API de búsqueda:<pre>aws apigateway put-method \<br />  --rest-api-id <API-ID> \<br />  --resource-id <ID from the previous command output> \<br />  --http-method GET \<br />  --authorization-type "NONE" \<br />  --no-api-key-required</pre>Para `resource-id`, especifique la ID de lo obtenido del comando `create-resource`. | Arquitecto de la nube, administrador de la nube | 
| Cree un método de respuesta para la API de búsqueda. | Ejecuta el AWS CLI [put-method-response](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-method-response.html)comando para añadir una respuesta de método para la API de búsqueda:<pre>aws apigateway put-method-response \<br />  --rest-api-id <API-ID> \<br />  --resource-id  <ID from the create-resource command output> \<br />  --http-method GET \<br />  --status-code 200 \<br />  --response-models "{\"application/json\": \"Empty\"}"</pre>En `resource-id`, especifique el ID del resultado del anterior comando `create-resource`. | Arquitecto de la nube, administrador de la nube | 
| Configure una integración de Lambda proxy para la API de búsqueda. | Ejecute el comando AWS CLI [put-integration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-integration.html) para configurar una integración con la función de búsqueda de Lambda:<pre>aws apigateway put-integration \<br />  --rest-api-id <API-ID> \<br />  --resource-id  <ID from the create-resource command output> \<br />  --http-method GET \<br />  --type AWS_PROXY \<br />  --integration-http-method GET \<br />  --uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/arn:aws:lambda:<region>:<account-id>:function:<function-name>/invocations</pre>En `resource-id`, especifique la ID del anterior comando `create-resource`. | Arquitecto de la nube, administrador de la nube | 
| Otorgue permiso a API Gateway para llamar a la función de búsqueda de Lambda. | Ejecute el comando AWS CLI [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) para conceder permiso a API Gateway para usar la función de búsqueda:<pre>aws lambda add-permission \<br />  --function-name <function-name> \<br />  --statement-id apigateway-get \<br />  --action lambda:InvokeFunction \<br />  --principal apigateway.amazonaws.com \<br />  --source-arn "arn:aws:execute-api:<region>:<account-id>:api-id/*/GET/search</pre>Cambie la ruta `source-arn` si ha usado un nombre de recurso de API en lugar de `search`. | Arquitecto de la nube, administrador de la nube | 
| Implemente la API de búsqueda. | Ejecute el comando AWS CLI [create-deployment](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/create-deployment.html) para crear un recurso de etapa denominado: `dev`<pre>aws apigateway create-deployment \<br />  --rest-api-id <API-ID> \<br />  --stage-name dev</pre>Si actualizas la API, puedes usar el mismo AWS CLI comando para volver a implementarla en la misma etapa. | Arquitecto de la nube, administrador de la nube | 

### Crear y configurar roles de Kibana
<a name="create-and-configure-kibana-roles"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Inicie sesión en la consola Kibana. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | 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.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | Arquitecto de la nube, administrador de la nube | 
| Asigne usuarios a los roles. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)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 `tenant-data` para definir la asignación de la propiedad `TenantId`.<pre>PUT /tenant-data<br />{<br />  "mappings": {<br />    "properties": {<br />      "TenantId": { "type": "keyword"}<br />    }<br />  }<br />}</pre> | Arquitecto de la nube, administrador de la nube | 

### Cree puntos de enlace de VPC para Amazon S3 y AWS STS
<a name="create-vpc-endpoints-for-s3-and-sts"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Crear un punto de conexión de VPC para Amazon S3 . | Ejecute el AWS CLI [create-vpc-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-vpc-endpoint.html)comando para crear un punto de enlace de VPC para Amazon S3. El punto de conexión permite que la función de índice de Lambda de la VPC acceda a Amazon S3.<pre>aws ec2 create-vpc-endpoint \<br />  --vpc-id <VPC-ID> \<br />  --service-name com.amazonaws.us-east-1.s3 \<br />  --route-table-ids <route-table-ID></pre>En `vpc-id`, especifique la VPC que está usando para la función de índice de Lambda. En `service-name`, use la URL correcta del punto de conexión Amazon S3. En `route-table-ids`, especifique la tabla de enrutamiento asociada al punto de conexión de VPC. | Arquitecto de la nube, administrador de la nube | 
| Cree un punto final de VPC para. AWS STS | Ejecute el AWS CLI [create-vpc-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-vpc-endpoint.html)comando para crear un punto final de VPC para AWS Security Token Service ()AWS STS. El punto de conexión permite que las funciones de índice y búsqueda de Lambda en la VPC accedan al servicio AWS STS. Las funciones AWS STS se utilizan cuando asumen la función de IAM.<pre>aws ec2 create-vpc-endpoint \<br />  --vpc-id <VPC-ID> \<br />  --vpc-endpoint-type Interface \<br />  --service-name com.amazonaws.us-east-1.sts \<br />  --subnet-id <subnet-ID> \<br />  --security-group-id <security-group-ID></pre>Para `vpc-id`, especifique la VPC que va a utilizar para las funciones de índice y búsqueda de Lambda. En `subnet-id`, proporcione la subred en la que se debe crear este punto de conexión. En `security-group-id`, especifique el grupo de seguridad al que desea asociar este punto de conexión. (Puede ser el mismo que el grupo de seguridad que usa Lambda). | Arquitecto de la nube, administrador de la nube | 

### Pruebe el multiusuario y el aislamiento de datos
<a name="test-multi-tenancy-and-data-isolation"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Actualice los archivos de Python para las funciones de índice y búsqueda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)Puedes obtener el punto final de Elasticsearch desde la pestaña **Descripción general de la consola** de servicio. OpenSearch Tiene el formato `<AWS-Region>.es.amazonaws.com`. | Arquitecto de la nube, desarrollador de aplicaciones | 
| Actualizar el código de Lambda. | Use el AWS CLI [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)comando para actualizar el código Lambda con los cambios que realizó en los archivos de Python:<pre>aws lambda update-function-code \<br />  --function-name index-lambda-function \<br />  --zip-file fileb://index_lambda_package.zip<br /><br />aws lambda update-function-code \<br />  --function-name search-lambda-function \<br />  --zip-file fileb://search_lambda_package.zip</pre> | Arquitecto de la nube, desarrollador de aplicaciones | 
| Cargue los datos sin procesar en el bucket de S3. | Use el comando AWS CLI [cp](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html) para cargar los datos de los objetos Tenant-1 y Tenant-2 al `tenantrawdata` bucket (especifique el nombre del bucket S3 que creó para este propósito):<pre>aws s3 cp tenant-1-data s3://tenantrawdata<br />aws s3 cp tenant-2-data s3://tenantrawdata</pre>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:<pre>GET tenant-data/_search</pre>Esta consulta muestra todos los documentos indexados en Elasticsearch. En este caso, debería ver dos documentos separados para Inquilino-1 e Inquilino-2. | Arquitecto de la nube, administrador de la nube | 
| Pruebe la API de búsqueda desde API Gateway. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)Para ver una ilustración de la pantalla, consulte la sección de [Información adicional](#build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional). | Arquitecto de la nube, desarrollador de aplicaciones | 
| Eliminación de recursos. | Limpie todos los recursos que haya creado para evitar cargos adicionales en su cuenta. | AWS DevOps, arquitecto de nube, administrador de nube | 

## Recursos relacionados
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-resources"></a>
+ [AWS SDK para Python (Boto)](https://aws.amazon.com/sdk-for-python/)
+ [AWS Lambda documentación](https://docs.aws.amazon.com/lambda/)
+ [Documentación de API Gateway](https://docs.aws.amazon.com/apigateway/)
+ [Documentación de Amazon S3](https://docs.aws.amazon.com/s3/)
+ [Documentación OpenSearch de Amazon Service](https://docs.aws.amazon.com/elasticsearch-service/)
  + [Control de acceso detallado en Amazon Service OpenSearch ](https://docs.amazonaws.cn/en_us/elasticsearch-service/latest/developerguide/fgac.html)
  + [Creación de una aplicación de búsqueda con Amazon OpenSearch Service](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/search-example.html)
  + [Lanzamiento de tus dominios OpenSearch de Amazon Service dentro de una VPC](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html)

## Información adicional
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional"></a>

**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. Puede utilizar dos enfoques para implementar el modelo de silo con OpenSearch Service: dominio por inquilino e índice por inquilino.
+ **Dominio por inquilino**: puedes usar un dominio de OpenSearch servicio 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 OpenSearch servicio tenga como mínimo tres nodos principales y dos nodos de datos para las cargas de trabajo de producción.

![\[Modelo de silo de dominio por inquilino para arquitecturas de varios inquilinos sin servidor.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/c2195f82-e5ed-40bb-b76a-3b0210bf1254.png)


 
+ **Índice por inquilino**: puede colocar los datos del inquilino en índices separados dentro de un clúster de OpenSearch servicios. Con este enfoque, se usa un identificador de inquilino al crear y asignar un nombre al índice, anteponiendo el identificador de inquilino 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.

![\[Modelo de silo por inquilino para arquitecturas de varios inquilinos sin servidor\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/354a9463-25bb-422b-84de-d4875a7c8ea2.png)


 

**Modelo de aislamiento en silo**: en el modelo de silo, se emplean políticas de IAM para aislar los dominios o índices que contienen los datos de cada usuario. 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 de IAM basadas en la identidad, puede especificar las acciones *permitidas* o *denegadas en el dominio, los índices* o dentro del Servicio. APIs OpenSearch El elemento `Action` de una política de IAM describe la acción o acciones específicas permitidas y denegadas por la política. El elemento `Principal ` especifica las cuentas, usuarios o 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 inquilino, tendrá que modificar este ejemplo de política para restringir aún más a Inquilino-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.

![\[Modelo común para arquitecturas de varios inquilinos sin servidor\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/c2c3bb0f-6ccd-47a7-ab67-e7f3f8c7f289.png)


 

**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 mecanismo de IAM usado con el modelo de silo no permite describir el aislamiento en función del identificador de usuario almacenado en el documento.

Un enfoque alternativo consiste en usar el [control de acceso detallado](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/fgac.html) (FGAC) que proporciona Open Distro para Elasticsearch. El FGAC permite controlar los permisos a nivel de índice, documento o campo. En cada solicitud, el FGAC evalúa las credenciales del usuario y autentica o deniega el acceso. Si el FGAC autentica al usuario, obtiene todos los roles mapeados 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](https://opendistro.github.io/for-elasticsearch-docs/docs/security/access-control/document-level-security/), que le permite restringir un rol a un subconjunto de documentos de un índice. El siguiente ejemplo de rol restringe las consultas a Usuario-1. Al aplicar este rol a Usuario-1, puede lograr el aislamiento necesario. 

```
{
   "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.

 

![\[Modelo híbrido para arquitecturas de varios inquilinos sin servidor\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/e7def98a-38ef-435a-9881-7e95ae4d4940.png)


**Aislamiento de usuarios en el modelo híbrido**: en el modelo híbrido, se sigue el mismo perfil de seguridad que en el modelo de grupo. El uso del modelo de seguridad FGAC a nivel de documento proporciona aislamiento a los usuarios. 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 Inquilino-1\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/a6757d3f-977a-4ecc-90cb-83ab7f1c3588.png)


*Ventana de prueba para consulta de Usuario-2*

 

![\[Ventana de prueba para consulta de Inquilino-2\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/31bfd656-33ca-4750-b6e6-da4d703c2071.png)


## Conexiones
<a name="attachments-750196bb-03f6-4b6e-92cd-eb7141602547"></a>

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: [attachment.zip](samples/p-attach/750196bb-03f6-4b6e-92cd-eb7141602547/attachments/attachment.zip)