Cree una arquitectura sin servidor multiusuario en Amazon Service OpenSearch - Recomendaciones de AWS

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

  • Python versión 3.7

  • 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:

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

    2. 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

Arquitectura multiusuario sin servidor de alto nivel

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

TareaDescripciónHabilidades 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 de la siguiente manera:

aws s3api create-bucket \   --bucket tenantrawdata \   --region <your-AWS-Region>

donde tenantrawdata es el nombre de bucket de S3. (Puede usar cualquier nombre único que siga las pautas de nomenclatura de buckets).

Arquitecto de la nube, administrador de la nube
TareaDescripciónHabilidades requeridas

Crea un dominio OpenSearch de Amazon Service.

Ejecuta el AWS CLI create-elasticsearch-domaincomando para crear un dominio OpenSearch de Amazon Service:

aws es create-elasticsearch-domain \   --domain-name vpc-cli-example \   --elasticsearch-version 7.10 \   --elasticsearch-cluster-config InstanceType=t3.medium.elasticsearch,InstanceCount=1 \   --ebs-options EBSEnabled=true,VolumeType=gp2,VolumeSize=10 \   --domain-endpoint-options "{\"EnforceHTTPS\": true}" \   --encryption-at-rest-options "{\"Enabled\": true}" \   --node-to-node-encryption-options "{\"Enabled\": true}" \   --advanced-security-options "{\"Enabled\": true, \"InternalUserDatabaseEnabled\": true, \ \"MasterUserOptions\": {\"MasterUserName\": \"KibanaUser\", \ \"MasterUserPassword\": \"NewKibanaPassword@123\"}}" \   --vpc-options "{\"SubnetIds\": [\"<subnet-id>\"], \"SecurityGroupIds\": [\"<sg-id>\"]}" \   --access-policies "{\"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \ \"Principal\": {\"AWS\": \"*\" }, \"Action\":\"es:*\", \ \"Resource\": \"arn:aws:es:region:account-id:domain\/vpc-cli-example\/*\" } ] }"

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), 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-ingresscomando 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).

aws ec2 authorize-security-group-ingress \ --group-id <SecurityGroupIdfElasticSearch> \ --protocol tcp \ --port 443 \ --source-group <SecurityGroupIdfBashionHostEC2>
Arquitecto de la nube, administrador de la nube
TareaDescripciónHabilidades requeridas

Para crear el rol de ejecución de Lambda

Ejecute el comando AWS CLI create-role para conceder a la función de índice Lambda acceso a AWS los servicios y recursos:

aws iam create-role \ --role-name index-lambda-role \ --assume-role-policy-document file://lambda_assume_role.json

donde lambda_assume_role.json hay un JSON documento de la carpeta actual que concede AssumeRole permisos a la función Lambda, de la siguiente manera:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
Arquitecto de la nube, administrador de la nube

Adjunte políticas gestionadas al rol de Lambda.

Ejecute el AWS CLI attach-role-policycomando 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.

aws iam attach-role-policy \ --role-name index-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy \ --role-name index-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole 
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 para dar s3:GetObject permiso a la función de índice de Lambda para leer los objetos del bucket de S3:

aws iam create-policy \   --policy-name s3-permission-policy \   --policy-document file://s3-policy.json

El archivo s3-policy.json es un JSON documento de la carpeta actual que concede s3:GetObject permisos 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 correcto en sección Resource  de:

{     "Version": "2012-10-17",     "Statement": [         {            "Effect": "Allow",            "Action": "s3:GetObject",            "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
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-policycomando 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:

aws iam attach-role-policy \   --role-name index-lambda-role \   --policy-arn <PolicyARN>

donde PolicyARN está el nombre del 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 para crear la función de índice Lambda, que accederá a Amazon Service: OpenSearch

aws lambda create-function \   --function-name index-lambda-function \   --zip-file fileb://index_lambda_package.zip \   --handler lambda_index.lambda_handler \   --runtime python3.7 \   --role "arn:aws:iam::account-id:role/index-lambda-role" \   --timeout 30 \   --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \     \"SecurityGroupIds\": [\"<sg-1>\"]}"
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 para conceder a Amazon S3 el permiso de llamar a la función de índice Lambda:

aws lambda add-permission \ --function-name index-lambda-function \ --statement-id s3-permissions \ --action lambda:InvokeFunction \ --principal s3.amazonaws.com \ --source-arn "arn:aws:s3:::tenantrawdata" \ --source-account "<account-id>"
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-configurationcomando 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. 

aws s3api put-bucket-notification-configuration \ --bucket tenantrawdata \ --notification-configuration file://s3-trigger.json

El archivo s3-trigger.json es un JSON documento de la carpeta actual que añade la política de recursos a la función Lambda cuando se produce el ObjectCreated evento Amazon S3.

Arquitecto de la nube, administrador de la nube
TareaDescripciónHabilidades requeridas

Para crear el rol de ejecución de Lambda

Ejecute el comando AWS CLI create-role para conceder a la función de búsqueda de Lambda acceso a AWS los servicios y recursos:

aws iam create-role \ --role-name search-lambda-role \ --assume-role-policy-document file://lambda_assume_role.json

donde lambda_assume_role.json hay un JSON documento de la carpeta actual que concede AssumeRole permisos a la función Lambda, de la siguiente manera:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
Arquitecto de la nube, administrador de la nube

Adjunte políticas gestionadas al rol de Lambda.

Ejecute el AWS CLI attach-role-policycomando 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.

aws iam attach-role-policy \ --role-name search-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy \ --role-name search-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole 
Arquitecto de la nube, administrador de la nube

Cree la función de búsqueda de Lambda.

Ejecute el comando AWS CLI create-function para crear la función de búsqueda de Lambda, que accederá a Amazon Service: OpenSearch

aws lambda create-function \   --function-name search-lambda-function \   --zip-file fileb://search_lambda_package.zip \   --handler lambda_search.lambda_handler \   --runtime python3.7 \   --role "arn:aws:iam::account-id:role/search-lambda-role" \   --timeout 30 \   --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \     \"SecurityGroupIds\": [\"<sg-1>\"]}"
Arquitecto de la nube, administrador de la nube
TareaDescripciónHabilidades requeridas

Cree roles de inquilino. IAM

Ejecute el comando AWS CLI create-role para crear dos roles de inquilino que se utilizarán para probar la funcionalidad de búsqueda:

aws iam create-role \   --role-name Tenant-1-role \   --assume-role-policy-document file://assume-role-policy.json
aws iam create-role \   --role-name Tenant-2-role \   --assume-role-policy-document file://assume-role-policy.json

El archivo assume-role-policy.json es un JSON documento de la carpeta actual que concede AssumeRole permisos a la función de ejecución de Lambda:

{     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Principal": {                  "AWS": "<Lambda execution role for index function>",                  "AWS": "<Lambda execution role for search function>"              },             "Action": "sts:AssumeRole"         }     ] }
Arquitecto de la nube, administrador de la nube

Cree una IAM política de inquilinos.

Ejecuta el comando AWS CLI create-policy para crear una política de inquilinos que otorgue acceso a las operaciones de Elasticsearch:

aws iam create-policy \   --policy-name tenant-policy \   --policy-document file://policy.json

El archivo policy.json es un JSON documento de la carpeta actual que otorga permisos en Elasticsearch:

{     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": [                 "es:ESHttpDelete",                 "es:ESHttpGet",                 "es:ESHttpHead",                 "es:ESHttpPost",                 "es:ESHttpPut",                 "es:ESHttpPatch"             ],             "Resource": [                 "<ARN of Elasticsearch domain created earlier>"             ]         }     ] }
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-policycomando para adjuntar la IAM política de inquilinos a las dos funciones de inquilino que creó en el paso anterior:

aws iam attach-role-policy \   --policy-arn arn:aws:iam::account-id:policy/tenant-policy \   --role-name Tenant-1-role aws iam attach-role-policy \   --policy-arn arn:aws:iam::account-id:policy/tenant-policy \   --role-name Tenant-2-role

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 para crear una política para que Lambda asuma el rol de inquilino:

aws iam create-policy \   --policy-name assume-tenant-role-policy \ --policy-document file://lambda_policy.json

El archivo lambda_policy.json es un JSON documento de la carpeta actual que concede permisos para: AssumeRole

{     "Version": "2012-10-17",     "Statement": [        {             "Effect": "Allow",             "Action":  "sts:AssumeRole",             "Resource": "<ARN of tenant role created earlier>"        }     ] }

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 IAM política para conceder permiso al rol de índice Lambda para acceder a Amazon S3.

Ejecute el comando AWS CLI create-policy para dar permiso al rol de índice de Lambda para acceder a los objetos del bucket de S3:

aws iam create-policy \   --policy-name s3-permission-policy \   --policy-document file://s3_lambda_policy.json

El archivo s3_lambda_policy.json es el siguiente documento de JSON política de la carpeta actual:

{     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": "s3:GetObject",             "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
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-policycomando 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:

aws iam attach-role-policy \   --policy-arn arn:aws:iam::account-id:policy/assume-tenant-role-policy \   --role-name index-lambda-role aws iam attach-role-policy \   --policy-arn arn:aws:iam::account-id:policy/assume-tenant-role-policy \   --role-name search-lambda-role aws iam attach-role-policy \   --policy-arn arn:aws:iam::account-id:policy/s3-permission-policy \   --role-name index-lambda-role

La política ARN se basa en el resultado del paso anterior.

Arquitecto de la nube, administrador de la nube
TareaDescripciónHabilidades requeridas

Cree una API entrada REST API en Gateway.

Ejecute el CLI create-rest-apicomando para crear un REST API recurso:

aws apigateway create-rest-api \   --name Test-Api \   --endpoint-configuration "{ \"types\": [\"REGIONAL\"] }"

Para el tipo de configuración de punto final, puede especificar, EDGE en lugar de REGIONAL utilizar, ubicaciones de borde en lugar de una AWS región en particular.

Anote el valor del campo id en el resultado del comando. Este es el API ID que utilizará en los siguientes comandos.

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. search (No es necesario crear una API para la función de índice Lambda, ya que se ejecuta automáticamente cuando los objetos se cargan en el bucket de S3).

  1. Ejecute el comando AWS CLI get-resources para obtener el ID principal de la ruta raíz:

    aws apigateway get-resources \ --rest-api-id <API-ID>

    Observe el valor del campo ID. Usará esta ID principal en el siguiente comando.

    { "items": [ { "id": "zpsri964ck", "path": "/" } ] }
  2. Ejecute el comando AWS CLI create-resource para crear un recurso para la búsqueda. API En parent-id, especifique la ID del comando anterior.

    aws apigateway create-resource \   --rest-api-id <API-ID> \   --parent-id <Parent-ID> \   --path-part search
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 crear un GET  método para la búsqueda: API

aws apigateway put-method \   --rest-api-id <API-ID> \   --resource-id <ID from the previous command output> \   --http-method GET \   --authorization-type "NONE" \ --no-api-key-required

Para resource-id, especifique la ID de lo obtenido del comando create-resource.

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-responsecomando para añadir una respuesta de método a la búsquedaAPI:

aws apigateway put-method-response \   --rest-api-id <API-ID> \   --resource-id  <ID from the create-resource command output> \   --http-method GET \   --status-code 200 \ --response-models "{\"application/json\": \"Empty\"}"

En  resource-id, especifique la 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 búsqueda. API

Ejecute el AWS CLI comando put-integration para configurar una integración con la función de búsqueda de Lambda:

aws apigateway put-integration \   --rest-api-id <API-ID> \   --resource-id  <ID from the create-resource command output> \   --http-method GET \   --type AWS_PROXY \   --integration-http-method GET \   --uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/arn:aws:lambda:<region>:<account-id>:function:<function-name>/invocations

En resource-id, especifique la ID del anterior comando create-resource.

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 para dar permiso a API Gateway para usar la función de búsqueda:

aws lambda add-permission \   --function-name <function-name> \   --statement-id apigateway-get \   --action lambda:InvokeFunction \   --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:<region>:<account-id>:api-id/*/GET/search

Cambie la source-arn ruta si utilizó un nombre de API recurso diferente en lugar desearch.

Arquitecto de la nube, administrador de la nube

Implemente la búsquedaAPI.

Ejecute el comando AWS CLI create-deployment para crear un recurso de etapa denominado: dev

aws apigateway create-deployment \   --rest-api-id <API-ID> \ --stage-name dev

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
TareaDescripciónHabilidades requeridas

Inicie sesión en la consola Kibana.

  1. Encuentra el enlace a Kibana en el panel de control de tu dominio en la consola de Amazon OpenSearch Service. El URL está en la forma:<domain-endpoint>/_plugin/kibana/.

  2. Use el host bastión que configuró en la primera épica para acceder a la consola de Kibana.

  3. Inicia sesión en la consola de Kibana con el nombre de usuario y la contraseña maestros del paso anterior, cuando creaste el dominio de Amazon OpenSearch Service.

  4. Cuando se le pida que seleccione un usuario, elija Privado.

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.

  1. En la consola Kibana, en el panel de navegación, seleccione Seguridad, Rol.

  2. Cree un nuevo rol de usuario.

  3. Establece los permisos de clúster enindices_all, lo que otorga permisos de creación, lectura, actualización y eliminación (CRUD) en el índice de Amazon OpenSearch Service. 

  4. Restrinja los permisos de indexación al índice tenant-data. (El nombre del índice debe coincidir con el nombre de las funciones de búsqueda e indexación de Lambda). 

  5. Defina los permisos de indexación en indices_all para que los usuarios puedan realizar todas las operaciones relacionadas con la indexación. (Puede restringir las operaciones para brindar un acceso más detallado en función de sus necesidades).

  6. Para garantizar la seguridad a nivel de documento, use la siguiente política para filtrar los documentos por ID de usuario, a fin de aislar los datos de los usuarios en un índice compartido:

    {   "bool": {     "must": {       "match": {         "TenantId": "Tenant-1"       }     }   } }

    El nombre del índice, las propiedades y los valores distinguen entre mayúsculas y minúsculas.

Arquitecto de la nube, administrador de la nube

Asigne usuarios a los roles.

  1. Seleccione la pestaña Usuarios asignados para el rol y, a continuación, elija Asignar usuarios.

  2. En la sección Funciones de backend, especifique la función ARN de IAM inquilino que creó anteriormente y, a continuación, elija Mapa. Esto asigna el rol de IAM inquilino al rol de Kibana para que la búsqueda específica del inquilino arroje datos únicamente de ese inquilino. Por ejemplo, si el nombre del IAM rol de Tenant-1 esTenant-1-Role, especifique el ARN para Tenant-1-Role (de la epopeya Crear y configurar roles de inquilino) en el cuadro Roles de backend para el rol de Tenant-1 en Kibana.

  3. Repita los pasos 1 y 2 para Usuario-2.

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.

PUT /tenant-data {   "mappings": {     "properties": {       "TenantId": { "type": "keyword"}     }   } }
Arquitecto de la nube, administrador de la nube
TareaDescripciónHabilidades requeridas

Cree un VPC punto de conexión para Amazon S3.

Ejecute el AWS CLI create-vpc-endpointcomando para crear un VPC punto de conexión para Amazon S3. El punto final permite que la función de índice Lambda acceda VPC al servicio Amazon S3.

aws ec2 create-vpc-endpoint \   --vpc-id <VPC-ID> \   --service-name com.amazonaws.us-east-1.s3 \   --route-table-ids <route-table-ID>

Paravpc-id, especifique lo VPC que está utilizando para la función de índice Lambda. Paraservice-name, utilice la correcta URL para el punto de conexión Amazon S3. Pararoute-table-ids, especifique la tabla de rutas asociada al VPC punto final.

Arquitecto de la nube, administrador de la nube

Cree un VPC punto final para AWSSTS.

Ejecute el AWS CLI create-vpc-endpointcomando para crear un VPC punto final para AWS Security Token Service (AWSSTS). El punto final permite que el índice Lambda y las funciones de búsqueda accedan VPC al AWS STS servicio. Las funciones AWS STS se utilizan cuando asumen la IAM función.

aws ec2 create-vpc-endpoint \   --vpc-id <VPC-ID> \   --vpc-endpoint-type Interface \   --service-name com.amazonaws.us-east-1.sts \   --subnet-id <subnet-ID> \ --security-group-id <security-group-ID>

Paravpc-id, especifique lo VPC que está utilizando 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
TareaDescripciónHabilidades requeridas

Actualice los archivos de Python para las funciones de índice y búsqueda.

  1. En el index_lambda_package.zip archivo, edítelo para actualizar el  lamba_index.py ID de la AWS cuenta, la AWS región y la información del punto final de Elasticsearch.

  2. En el search_lambda_package.zip archivo, edítelo para actualizar el lambda_search.py ID de la AWS cuenta, la AWS región y la información del punto de conexión de Elasticsearch.

Puedes obtener el punto de conexión de Elasticsearch desde la pestaña Overview de la consola de Amazon OpenSearch Service. 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-codecomando para actualizar el código Lambda con los cambios que realizó en los archivos de Python:

aws lambda update-function-code \   --function-name index-lambda-function \   --zip-file fileb://index_lambda_package.zip aws lambda update-function-code \   --function-name search-lambda-function \   --zip-file fileb://search_lambda_package.zip
Arquitecto de la nube, desarrollador de aplicaciones

Cargue los datos sin procesar en el bucket de S3.

Use el comando AWS CLI cp 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):

aws s3 cp tenant-1-data s3://tenantrawdata aws s3 cp tenant-2-data s3://tenantrawdata

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:

GET tenant-data/_search

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

  1. En la consola de API Gateway, abra la búsquedaAPI, elija el GET método dentro del recurso de búsqueda y, a continuación, elija Probar.

  2. En la ventana de prueba, introduzca la siguiente cadena de consulta (distingue entre mayúsculas y minúsculas) para la ID de usuario y, a continuación, seleccione Probar.

    TenantId=Tenant-1

    La función Lambda envía una consulta a Amazon OpenSearch Service que filtra el documento del inquilino en función de la seguridad a nivel de documento. El método devuelve el documento que pertenece a Usuario-1.

  3. Cambie la cadena de consulta a:

    TenantId=Tenant-2

    Esta consulta nos devuelve el documento que pertenece al Usuario-2.

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.

Modelo de silo de dominio por usuario para arquitecturas multiusuario sin servidor
  • Í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.

Modelo de silo por usuario para arquitecturas multiususario sin servidor

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.

Modelo común para arquitecturas multiusuario sin servidor

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, 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 multiusuario sin servidor

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-1

Ventana de prueba para consulta de Usuario-2

Ventana de prueba para consulta de Usuario-2

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip