Crea un'architettura serverless multi-tenant in Amazon Service OpenSearch - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Crea un'architettura serverless multi-tenant in Amazon Service OpenSearch

Creato da Tabby Ward () e Nisha Gambhir () AWS AWS

Ambiente: PoC o pilota

Tecnologie: modernizzazione; SaaS; Serverless

Carico di lavoro: open source

AWSservizi: Amazon OpenSearch Service; AWS Lambda; Amazon S3; Amazon Gateway API

Riepilogo

Amazon OpenSearch Service è un servizio gestito che semplifica l'implementazione, il funzionamento e la scalabilità di Elasticsearch, un popolare motore di ricerca e analisi open source. Amazon OpenSearch Service offre la ricerca a testo libero, nonché l'inserimento e la creazione di dashboard quasi in tempo reale per lo streaming di dati come log e metriche.

I fornitori di software as a service (SaaS) utilizzano spesso Amazon OpenSearch Service per affrontare un'ampia gamma di casi d'uso, ad esempio per ottenere informazioni sui clienti in modo scalabile e sicuro, riducendo al contempo la complessità e i tempi di inattività.

L'utilizzo di Amazon OpenSearch Service in un ambiente multi-tenant introduce una serie di considerazioni che influiscono sul partizionamento, l'isolamento, l'implementazione e la gestione della soluzione SaaS. I provider SaaS devono considerare come scalare efficacemente i propri cluster Elasticsearch con carichi di lavoro in continuo cambiamento. Devono inoltre considerare in che modo la suddivisione in più livelli e le condizioni rumorose dei vicini potrebbero influire sul loro modello di partizionamento.

Questo modello esamina i modelli utilizzati per rappresentare e isolare i dati dei tenant con costrutti Elasticsearch. Inoltre, il modello si concentra su una semplice architettura di riferimento serverless come esempio per dimostrare l'indicizzazione e la ricerca utilizzando Amazon OpenSearch Service in un ambiente multi-tenant. Implementa il modello di partizionamento dei dati del pool, che condivide lo stesso indice tra tutti i tenant mantenendo l'isolamento dei dati del tenant. Questo modello utilizza i seguenti servizi Amazon Web Services (AWS): Amazon API Gateway, AWS Lambda, Amazon Simple Storage Service (Amazon S3) e Amazon Service. OpenSearch

Per ulteriori informazioni sul modello pool e altri modelli di partizionamento dei dati, consulta la sezione Informazioni aggiuntive.

Prerequisiti e limitazioni

Prerequisiti

  • Un account attivo AWS

  • AWSCommand Line Interface (AWSCLI) versione 2.x, installata e configurata su macOS, Linux o Windows

  • Python versione 3.7

  • pip3 — Il codice sorgente di Python viene fornito come file.zip da distribuire in una funzione Lambda. Se desideri utilizzare il codice localmente o personalizzarlo, segui questi passaggi per sviluppare e ricompilare il codice sorgente:

    1. Genera il requirements.txt file eseguendo il seguente comando nella stessa directory degli script Python: pip3 freeze > requirements.txt

    2. Installa le dipendenze: pip3 install -r requirements.txt

Limitazioni

  • Questo codice viene eseguito in Python e attualmente non supporta altri linguaggi di programmazione. 

  • L'applicazione di esempio non include il supporto AWS interregionale o di disaster recovery (DR). 

  • Questo modello è destinato esclusivamente a scopo dimostrativo. Non è destinato all'uso in un ambiente di produzione.

Architettura

Il diagramma seguente illustra l'architettura di alto livello di questo pattern. L'architettura include quanto segue:

  • AWSLambda per indicizzare e interrogare il contenuto 

  • OpenSearch Servizio Amazon per eseguire ricerche 

  • Amazon API Gateway per fornire un'APIinterazione con l'utente

  • Amazon S3 per archiviare dati grezzi (non indicizzati)

  • Amazon CloudWatch per monitorare i log

  • AWSIdentity and Access Management (IAM) per creare ruoli e politiche degli inquilini

Architettura serverless multi-tenant di alto livello

Automazione e scalabilità

Per semplicità, il pattern utilizza AWS CLI il provisioning dell'infrastruttura e la distribuzione del codice di esempio. Puoi creare un AWS CloudFormation modello o degli script AWS Cloud Development Kit (AWSCDK) per automatizzare il pattern.

Strumenti

AWSservizi

  • AWSCLI— AWS Command Line Interface (AWSCLI) è uno strumento unificato per la gestione di AWS servizi e risorse utilizzando i comandi della shell della riga di comando.

  • AWSLambda: AWS Lambda è un servizio di elaborazione che consente di eseguire codice senza effettuare il provisioning o la gestione di server. Lambda esegue il codice solo quando è necessario e si dimensiona automaticamente, da poche richieste al giorno a migliaia al secondo.

  • Amazon API Gateway — Amazon API Gateway è un AWS servizio per la creazione, la pubblicazione, la manutenzione, il monitoraggio e la protezione RESTHTTP, WebSocket APIs su qualsiasi scala.

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) è un servizio di storage di oggetti che consente di archiviare e recuperare qualsiasi quantità di informazioni in qualsiasi momento, da qualsiasi punto del Web.

  • Amazon OpenSearch Service: Amazon OpenSearch Service è un servizio completamente gestito che semplifica l'implementazione, la protezione e l'esecuzione di Elasticsearch su larga scala in modo conveniente.

Codice

L'allegato fornisce file di esempio per questo modello. Ciò include:

  • index_lambda_package.zip— La funzione Lambda per l'indicizzazione dei dati in Amazon OpenSearch Service utilizzando il modello pool.

  • search_lambda_package.zip— La funzione Lambda per la ricerca di dati in Amazon OpenSearch Service.

  • Tenant-1-data— Esempio di dati grezzi (non indicizzati) per Tenant-1.

  • Tenant-2-data— Esempio di dati grezzi (non indicizzati) per Tenant-2.

Importante: le storie di questo modello includono esempi di CLI comandi formattati per Unix, Linux e macOS. Per Windows, sostituisci il carattere di continuazione UNIX barra rovesciata (\) al termine di ogni riga con un accento circonflesso (^).

Epiche

AttivitàDescrizioneCompetenze richieste

Crea un bucket S3.

Crea un bucket S3 nella tua regione. AWS Questo bucket conterrà i dati del tenant non indicizzati per l'applicazione di esempio. Assicurati che il nome del bucket S3 sia univoco a livello globale, poiché lo spazio dei nomi è condiviso da tutti gli account. AWS

Per creare un bucket S3, puoi usare il comando create-bucket come segue: AWS CLI

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

dov'è il nome del bucket tenantrawdata S3. (È possibile utilizzare qualsiasi nome univoco che segua le linee guida per la denominazione dei bucket.)

Architetto del cloud, amministratore del cloud
AttivitàDescrizioneCompetenze richieste

Crea un dominio Amazon OpenSearch Service.

Esegui il AWS CLI create-elasticsearch-domaincomando per creare un dominio Amazon OpenSearch 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\/*\" } ] }"

Il numero di istanze è impostato su 1 perché il dominio è a scopo di test. È necessario abilitare il controllo granulare degli accessi utilizzando il advanced-security-options parametro, poiché i dettagli non possono essere modificati dopo la creazione del dominio. 

Questo comando crea un nome utente principale (KibanaUser) e una password che puoi usare per accedere alla console Kibana.

Poiché il dominio fa parte di un cloud privato virtuale (VPC), devi assicurarti di poter raggiungere l'istanza Elasticsearch specificando la politica di accesso da utilizzare.

Per ulteriori informazioni, consulta Launching your Amazon OpenSearch Service domain using a VPC nella AWS documentazione.

Architetto del cloud, amministratore del cloud

Configura un bastion host.

Configura un'istanza Windows di Amazon Elastic Compute Cloud (AmazonEC2) come host bastion per accedere alla console Kibana. Il gruppo di sicurezza Elasticsearch deve consentire il traffico proveniente dal gruppo di EC2 sicurezza Amazon. Per istruzioni, consulta il post sul blog Controllare l'accesso alla rete alle EC2 istanze utilizzando un server Bastion.

Quando il bastion host è stato configurato e hai a disposizione il gruppo di sicurezza associato all'istanza, usa il AWS CLI authorize-security-group-ingresscomando per aggiungere l'autorizzazione al gruppo di sicurezza Elasticsearch per consentire la porta 443 dal gruppo di sicurezza Amazon EC2 (bastion host).

aws ec2 authorize-security-group-ingress \ --group-id <SecurityGroupIdfElasticSearch> \ --protocol tcp \ --port 443 \ --source-group <SecurityGroupIdfBashionHostEC2>
Architetto del cloud, amministratore del cloud
AttivitàDescrizioneCompetenze richieste

Crea il ruolo di esecuzione Lambda.

Esegui il comando AWS CLI create-role per concedere alla funzione di indice Lambda l'accesso a AWS servizi e risorse:

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

dove lambda_assume_role.json è un JSON documento nella cartella corrente che concede AssumeRole le autorizzazioni alla funzione Lambda, come segue:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
Architetto del cloud, amministratore del cloud

Associa policy gestite al ruolo Lambda.

Esegui il AWS CLI attach-role-policycomando per allegare le politiche gestite al ruolo creato nel passaggio precedente. Queste due politiche forniscono al ruolo le autorizzazioni per creare un'interfaccia di rete elastica e scrivere log su Logs. CloudWatch

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 
Architetto del cloud, amministratore del cloud

Crea una politica per concedere alla funzione di indice Lambda il permesso di leggere gli oggetti S3.

Esegui il comando AWS CLI create-policy per concedere alla funzione di indice Lambda s3:GetObject il permesso di leggere gli oggetti nel bucket S3:

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

Il file s3-policy.json è un JSON documento nella cartella corrente che concede le s3:GetObject autorizzazioni per consentire l'accesso in lettura agli oggetti S3. Se hai usato un nome diverso quando hai creato il bucket S3, fornisci il nome del bucket corretto nella sezione seguente: Resource 

{     "Version": "2012-10-17",     "Statement": [         {            "Effect": "Allow",            "Action": "s3:GetObject",            "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
Architetto del cloud, amministratore del cloud

Allega la politica di autorizzazione di Amazon S3 al ruolo di esecuzione Lambda.

Esegui il AWS CLI attach-role-policycomando per allegare la politica di autorizzazione di Amazon S3 creata nel passaggio precedente al ruolo di esecuzione Lambda:

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

PolicyARNdov'è l'Amazon Resource Name (ARN) della politica di autorizzazione di Amazon S3. È possibile ottenere questo valore dall'output del comando precedente.

Architetto del cloud, amministratore del cloud

Crea la funzione di indice Lambda.

Esegui il comando AWS CLI create-function per creare la funzione di indice Lambda, che accederà ad 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>\"]}"
Architetto cloud, amministratore cloud

Consenti ad Amazon S3 di chiamare la funzione di indice Lambda.

Esegui il comando AWS CLI add-permission per concedere ad Amazon S3 l'autorizzazione a chiamare la funzione di indice 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>"
Architetto del cloud, amministratore del cloud

Aggiungi un trigger Lambda per l'evento Amazon S3.

Esegui il AWS CLI put-bucket-notification-configurationcomando per inviare notifiche alla funzione di indice Lambda quando viene rilevato l'evento Amazon ObjectCreated S3. La funzione index viene eseguita ogni volta che un oggetto viene caricato nel bucket S3. 

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

Il file s3-trigger.json è un JSON documento nella cartella corrente che aggiunge la politica delle risorse alla funzione Lambda quando si verifica l'evento Amazon ObjectCreated S3.

Architetto del cloud, amministratore del cloud
AttivitàDescrizioneCompetenze richieste

Crea il ruolo di esecuzione Lambda.

Esegui il comando AWS CLI create-role per concedere alla funzione di ricerca Lambda l'accesso a AWS servizi e risorse:

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

dove lambda_assume_role.json è un JSON documento nella cartella corrente che concede AssumeRole le autorizzazioni alla funzione Lambda, come segue:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
Architetto del cloud, amministratore del cloud

Associa policy gestite al ruolo Lambda.

Esegui il AWS CLI attach-role-policycomando per allegare le politiche gestite al ruolo creato nel passaggio precedente. Queste due politiche forniscono al ruolo le autorizzazioni per creare un'interfaccia di rete elastica e scrivere log su Logs. CloudWatch

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 
Architetto del cloud, amministratore del cloud

Crea la funzione di ricerca Lambda.

Esegui il comando AWS CLI create-function per creare la funzione di ricerca Lambda, che accederà ad 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>\"]}"
Architetto cloud, amministratore cloud
AttivitàDescrizioneCompetenze richieste

Crea IAM ruoli di inquilino.

Esegui il comando AWS CLI create-role per creare due ruoli tenant che verranno utilizzati per testare la funzionalità di ricerca:

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

Il file assume-role-policy.json è un JSON documento nella cartella corrente che concede le AssumeRole autorizzazioni per il ruolo di esecuzione 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"         }     ] }
Architetto del cloud, amministratore del cloud

Crea una IAM politica per gli inquilini.

Esegui il comando AWS CLI create-policy per creare una politica del tenant che conceda l'accesso alle operazioni di Elasticsearch:

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

Il file policy.json è un JSON documento nella cartella corrente che concede le autorizzazioni su 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>"             ]         }     ] }
Architetto del cloud, amministratore del cloud

Allega la IAM politica del tenant ai ruoli degli inquilini.

Esegui il AWS CLI attach-role-policycomando per allegare la IAM politica del tenant ai due ruoli tenant che hai creato nel passaggio precedente:

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 policy ARN è tratta dall'output del passaggio precedente.

Architetto del cloud, amministratore del cloud

Crea una IAM politica per concedere a Lambda le autorizzazioni per assumere il ruolo.

Esegui il comando AWS CLI create-policy per creare una politica affinché Lambda assuma il ruolo di tenant:

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

Il file lambda_policy.json è un JSON documento nella cartella corrente che concede le autorizzazioni per: AssumeRole

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

InfattiResource, puoi usare un carattere jolly per evitare di creare una nuova politica per ogni tenant.

Architetto del cloud, amministratore del cloud

Crea una IAM policy per concedere al ruolo dell'indice Lambda l'autorizzazione ad accedere ad Amazon S3.

Esegui il comando AWS CLI create-policy per concedere al ruolo dell'indice Lambda il permesso di accedere agli oggetti nel bucket S3:

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

Il file s3_lambda_policy.json è il seguente documento di JSON policy nella cartella corrente:

{     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": "s3:GetObject",             "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
Architetto del cloud, amministratore del cloud

Associa la policy al ruolo di esecuzione Lambda.

Esegui il AWS CLI attach-role-policycomando per allegare la policy creata nel passaggio precedente all'indice Lambda e ai ruoli di esecuzione della ricerca che hai creato in precedenza:

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 policy ARN è tratta dall'output del passaggio precedente.

Architetto del cloud, amministratore del cloud
AttivitàDescrizioneCompetenze richieste

Crea un REST API in API Gateway.

Esegui il CLI create-rest-apicomando per creare una REST API risorsa:

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

Per il tipo di configurazione dell'endpoint, è possibile specificare EDGE anziché REGIONAL utilizzare le posizioni periferiche anziché una AWS regione particolare.

Annotate il valore del id campo dall'output del comando. Questo è l'APIID che utilizzerai nei comandi successivi.

Architetto del cloud, amministratore del cloud

Crea una risorsa per la ricercaAPI.

La API risorsa di ricerca avvia la funzione di ricerca Lambda con il nome della risorsa. search (Non è necessario crearne uno API per la funzione di indice Lambda, perché viene eseguita automaticamente quando gli oggetti vengono caricati nel bucket S3.)

  1. Esegui il comando AWS CLI get-resources per ottenere l'ID principale per il percorso principale:

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

    Nota il valore del campo ID. Utilizzerai questo ID principale nel comando successivo.

    { "items": [ { "id": "zpsri964ck", "path": "/" } ] }
  2. Esegui il comando AWS CLI create-resource per creare una risorsa per la ricerca. API Perparent-id, specifica l'ID del comando precedente.

    aws apigateway create-resource \   --rest-api-id <API-ID> \   --parent-id <Parent-ID> \   --path-part search
Architetto del cloud, amministratore del cloud

Crea un GET metodo per la ricercaAPI.

Esegui il comando AWS CLI put-method per creare un GET  metodo per la ricerca: 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

Perresource-id, specifica l'ID dall'output del create-resource comando.

Architetto del cloud, amministratore del cloud

Crea un metodo di risposta per la ricercaAPI.

Esegui il AWS CLI put-method-responsecomando per aggiungere un metodo di risposta per la ricercaAPI:

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\"}"

Per resource-id, specifica l'ID dall'output del create-resource comando precedente.

Architetto del cloud, amministratore del cloud

Configura un'integrazione proxy Lambda per la ricerca. API

Esegui il AWS CLI comando put-integration per impostare un'integrazione con la funzione di ricerca 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

Perresource-id, specifica l'ID del comando precedente. create-resource

Architetto del cloud, amministratore del cloud

Concedi a API Gateway l'autorizzazione a chiamare la funzione di ricerca Lambda.

Esegui il comando AWS CLI add-permission per autorizzare API Gateway a utilizzare la funzione di ricerca:

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

Modifica il source-arn percorso se hai utilizzato un nome di API risorsa diverso anzichésearch.

Architetto del cloud, amministratore del cloud

Implementa la ricercaAPI.

Esegui il comando AWS CLI create-deployment per creare una risorsa di fase denominata: dev

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

Se si aggiorna ilAPI, è possibile utilizzare lo stesso CLI comando per ridistribuirlo nella stessa fase.

Architetto del cloud, amministratore del cloud
AttivitàDescrizioneCompetenze richieste

Accedi alla console Kibana.

  1. Trova il link a Kibana nella dashboard del tuo dominio sulla console di Amazon OpenSearch Service. Il URL è nella forma:. <domain-endpoint>/_plugin/kibana/

  2. Usa il bastion host che hai configurato nella prima epic per accedere alla console Kibana.

  3. Accedi alla console Kibana utilizzando il nome utente principale e la password del passaggio precedente, quando hai creato il dominio Amazon OpenSearch Service.

  4. Quando ti viene richiesto di selezionare un tenant, scegli Privato.

Architetto del cloud, amministratore del cloud

Crea e configura i ruoli di Kibana.

Per garantire l'isolamento dei dati e assicurarsi che un tenant non possa recuperare i dati di un altro tenant, è necessario utilizzare la sicurezza dei documenti, che consente agli inquilini di accedere solo ai documenti che contengono il loro ID tenant.

  1. Sulla console Kibana, nel pannello di navigazione, scegli Sicurezza, Ruolo.

  2. Crea un nuovo ruolo di tenant.

  3. Imposta le autorizzazioni del cluster suindices_all, che fornisce le autorizzazioni di creazione, lettura, aggiornamento ed eliminazione (CRUD) sull'indice di Amazon OpenSearch Service. 

  4. Limita le autorizzazioni dell'indice all'indice. tenant-data (Il nome dell'indice deve corrispondere al nome nelle funzioni di ricerca e indice Lambda.) 

  5. Imposta i permessi di indicizzazione suindices_all, per consentire agli utenti di eseguire tutte le operazioni relative all'indice. (Puoi limitare le operazioni per un accesso più granulare, a seconda delle tue esigenze.)

  6. Per la sicurezza a livello di documento, utilizza la seguente politica per filtrare i documenti in base all'ID del tenant, per fornire l'isolamento dei dati ai tenant in un indice condiviso:

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

    Il nome, le proprietà e i valori dell'indice fanno distinzione tra maiuscole e minuscole.

Architetto del cloud, amministratore del cloud

Associa gli utenti ai ruoli.

  1. Scegli la scheda Utenti mappati per il ruolo, quindi scegli Mappa utenti.

  2. Nella sezione Ruoli ARN di backend, specifica il ruolo IAM tenant che hai creato in precedenza, quindi scegli Mappa. Questo associa il ruolo del IAM tenant al ruolo di Kibana in modo che la ricerca specifica del tenant restituisca i dati solo per quel tenant. Ad esempio, se il nome del IAM ruolo per Tenant-1 èTenant-1-Role, specifica il nome Tenant-1-Role (dall'epopea Crea e configura i ruoli tenant) nella casella Ruoli di backend ARN per il ruolo Tenant-1 Kibana.

  3. Ripeti i passaggi 1 e 2 per Tenant-2.

Ti consigliamo di automatizzare la creazione dei ruoli tenant e Kibana al momento dell'onboarding del tenant.

Architetto del cloud, amministratore del cloud

Crea l'indice dei dati dei tenant.

Nel riquadro di navigazione, in Gestione, scegli Dev Tools, quindi esegui il comando seguente. Questo comando crea l'tenant-dataindice per definire la mappatura della TenantId proprietà.

PUT /tenant-data {   "mappings": {     "properties": {       "TenantId": { "type": "keyword"}     }   } }
Architetto del cloud, amministratore del cloud
AttivitàDescrizioneCompetenze richieste

Crea un VPC endpoint per Amazon S3.

Esegui il AWS CLI create-vpc-endpointcomando per creare un VPC endpoint per Amazon S3. L'endpoint abilita la funzione di indicizzazione Lambda in per accedere VPC al servizio 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>

Pervpc-id, specifica VPC quello che stai usando per la funzione di indice Lambda. Perservice-name, usa quello corretto URL per l'endpoint Amazon S3. Perroute-table-ids, specifica la tabella di routing associata all'VPCendpoint.

Architetto del cloud, amministratore del cloud

Crea un VPC endpoint per AWSSTS.

Esegui il AWS CLI create-vpc-endpointcomando per creare un VPC endpoint per AWS Security Token Service () AWSSTS. L'endpoint abilita l'indice Lambda e le funzioni di ricerca per accedere VPC AWS STS al servizio. Le funzioni AWS STS vengono utilizzate quando assumono il IAM ruolo.

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>

Pervpc-id, specifica VPC quello che stai usando per l'indice Lambda e le funzioni di ricerca. Persubnet-id, fornisci la sottorete in cui deve essere creato questo endpoint. Persecurity-group-id, specifica il gruppo di sicurezza a cui associare questo endpoint. (Potrebbe essere lo stesso del gruppo di sicurezza utilizzato da Lambda).

Architetto del cloud, amministratore del cloud
AttivitàDescrizioneCompetenze richieste

Aggiorna i file Python per le funzioni di indice e ricerca.

  1. Nel index_lambda_package.zip file, modifica il  lamba_index.py file per aggiornare l'ID dell'AWSaccount, la AWS regione e le informazioni sull'endpoint Elasticsearch.

  2. Nel search_lambda_package.zip file, modifica il lambda_search.py file per aggiornare l'ID dell'AWSaccount, la AWS regione e le informazioni sull'endpoint Elasticsearch.

Puoi ottenere l'endpoint Elasticsearch dalla scheda Panoramica della console di Amazon OpenSearch Service. Ha il formato. <AWS-Region>.es.amazonaws.com

Architetto del cloud, sviluppatore di app

Aggiorna il codice Lambda.

Usa il AWS CLI update-function-codecomando per aggiornare il codice Lambda con le modifiche apportate ai file 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
Architetto cloud, sviluppatore di app

Carica i dati grezzi nel bucket S3.

Usa il comando AWS CLI cp per caricare i dati per gli oggetti Tenant-1 e Tenant-2 nel tenantrawdata bucket (specifica il nome del bucket S3 che hai creato a questo scopo):

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

Il bucket S3 è configurato per eseguire la funzione di indice Lambda ogni volta che i dati vengono caricati in modo che il documento venga indicizzato in Elasticsearch.

Architetto del cloud, amministratore del cloud

Cerca dati dalla console Kibana.

Sulla console Kibana, esegui la seguente query:

GET tenant-data/_search

Questa query mostra tutti i documenti indicizzati in Elasticsearch. In questo caso, dovresti vedere due documenti separati per Tenant-1 e Tenant-2.

Architetto del cloud, amministratore del cloud

Prova la ricerca API da API Gateway.

  1. Nella console API Gateway, apri la ricercaAPI, scegli il GET metodo all'interno della risorsa di ricerca, quindi scegli Test.

  2. Nella finestra di test, fornisci la seguente stringa di query (con distinzione tra maiuscole e minuscole) per l'ID del tenant, quindi scegli Test.

    TenantId=Tenant-1

    La funzione Lambda invia una query ad Amazon OpenSearch Service che filtra il documento del tenant in base alla sicurezza a livello di documento. Il metodo restituisce il documento che appartiene a Tenant-1.

  3. Cambia la stringa di interrogazione in:

    TenantId=Tenant-2

    Questa query restituisce il documento che appartiene a Tenant-2.

Per le illustrazioni delle schermate, vedere la sezione Informazioni aggiuntive.

Architetto del cloud, sviluppatore di app

Risorse correlate

Informazioni aggiuntive

Modelli di partizionamento dei dati

Esistono tre modelli di partizionamento dei dati comuni utilizzati nei sistemi multi-tenant: silo, pool e hybrid. Il modello scelto dipende dalla conformità, dalla rumorosità dei sistemi vicini, dalle operazioni e dalle esigenze di isolamento dell'ambiente.

Modello Silo

Nel modello a silo, i dati di ciascun inquilino vengono archiviati in un'area di archiviazione distinta in cui non vi è alcuna combinazione dei dati del tenant. Puoi utilizzare due approcci per implementare il modello a silo con Amazon OpenSearch Service: dominio per tenant e indice per tenant.

  • Dominio per tenant: puoi utilizzare un dominio Amazon OpenSearch Service separato (sinonimo di cluster Elasticsearch) per tenant. L'inserimento di ogni tenant nel proprio dominio offre tutti i vantaggi associati alla presenza di dati in una struttura autonoma. Tuttavia, questo approccio introduce sfide di gestione e agilità. La sua natura distribuita rende più difficile l'aggregazione e la valutazione dello stato operativo e dell'attività degli inquilini. Si tratta di un'opzione costosa che richiede che ogni dominio Amazon OpenSearch Service disponga di almeno tre nodi master e due nodi di dati per i carichi di lavoro di produzione.

Modello di silo di dominio per tenant per architetture serverless multi-tenant
  • Indice per tenant: puoi inserire i dati dei tenant in indici separati all'interno di un cluster Amazon Service. OpenSearch Con questo approccio, utilizzi un identificatore del tenant quando crei e dai un nome all'indice, anteponendo l'identificatore del tenant al nome dell'indice. L'approccio dell'indice per tenant consente di raggiungere gli obiettivi dei silo senza introdurre un cluster completamente separato per ogni tenant. Tuttavia, se il numero di indici aumenta, si potrebbe verificare una pressione sulla memoria, poiché questo approccio richiede più shard e il nodo master deve gestire una maggiore allocazione e ribilanciamento.

Modello di silo indicizzato per tenant per architetture serverless multi-tenant

Isolamento nel modello a silo: nel modello a silo, si utilizzano le IAM policy per isolare i domini o gli indici che contengono i dati di ciascun tenant. Queste politiche impediscono a un tenant di accedere ai dati di un altro tenant. Per implementare il modello di isolamento dei silo, è possibile creare una politica basata sulle risorse che controlli l'accesso alla risorsa del tenant. Si tratta spesso di una politica di accesso al dominio che specifica quali azioni un principale può eseguire sulle risorse secondarie del dominio, inclusi gli indici Elasticsearch e. APIs Con IAM le policy basate sull'identità, puoi specificare azioni consentite o negate sul dominio, sugli indici o all'interno di Amazon Service. APIs OpenSearch L'Action elemento di una IAM policy descrive l'azione o le azioni specifiche consentite o negate dalla policy e specifica gli account, gli Principal  utenti o i ruoli interessati.

La seguente politica di esempio concede al Tenant-1 l'accesso completo (come specificato daes:*) solo alle risorse secondarie del dominio. tenant-1 La fine /* dell'Resource elemento indica che questa politica si applica alle risorse secondarie del dominio, non al dominio stesso. Quando questa politica è in vigore, i tenant non sono autorizzati a creare un nuovo dominio o modificare le impostazioni su un dominio esistente.

{    "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/*"       }    ] }

Per implementare il modello di silo tenant per Index, è necessario modificare questa politica di esempio per limitare ulteriormente Tenant-1 all'indice o agli indici specificati, specificando il nome dell'indice. La seguente politica di esempio limita Tenant-1 all'indice. 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/*"       }    ] }

Modello di piscina

Nel modello di pool, tutti i dati dei tenant vengono archiviati in un indice all'interno dello stesso dominio. L'identificatore del tenant è incluso nei dati (documento) e utilizzato come chiave di partizione, in modo da poter determinare quali dati appartengono a quale tenant. Questo modello riduce il sovraccarico di gestione. Il funzionamento e la gestione dell'indice raggruppato sono più semplici ed efficienti rispetto alla gestione di più indici. Tuttavia, poiché i dati dei tenant vengono combinati all'interno dello stesso indice, si perde il naturale isolamento dei tenant fornito dal modello a silo. Questo approccio potrebbe inoltre ridurre le prestazioni a causa dell'effetto Noisy Neighbor.

Modello di pool per architetture serverless multi-tenant

Isolamento dei tenant nel modello pool: in generale, l'isolamento dei tenant è difficile da implementare nel modello pool. Il IAM meccanismo utilizzato con il modello a silo non consente di descrivere l'isolamento in base all'ID del tenant memorizzato nel documento.

Un approccio alternativo consiste nell'utilizzare il supporto granulare di controllo degli accessi (FGAC) fornito da Open Distro for Elasticsearch. FGACconsente di controllare le autorizzazioni a livello di indice, documento o campo. Con ogni richiesta, FGAC valuta le credenziali dell'utente e autentica l'utente o nega l'accesso. Se FGAC autentica l'utente, recupera tutti i ruoli mappati a quell'utente e utilizza il set completo di autorizzazioni per determinare come gestire la richiesta. 

Per ottenere l'isolamento richiesto nel modello in pool, è possibile utilizzare la sicurezza a livello di documento, che consente di limitare un ruolo a un sottoinsieme di documenti in un indice. Il seguente ruolo di esempio limita le query a Tenant-1. Applicando questo ruolo a Tenant-1, è possibile ottenere l'isolamento necessario. 

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

Modello ibrido

Il modello ibrido utilizza una combinazione dei modelli a silo e pool nello stesso ambiente per offrire esperienze uniche a ciascun livello di tenant (ad esempio i livelli gratuito, standard e premium). Ogni livello segue lo stesso profilo di sicurezza utilizzato nel modello pool.

Modello ibrido per architetture serverless multi-tenant

Isolamento dei tenant nel modello ibrido: nel modello ibrido, si segue lo stesso profilo di sicurezza del modello pool, dove l'utilizzo del modello di FGAC sicurezza a livello di documento forniva l'isolamento dei tenant. Sebbene questa strategia semplifichi la gestione dei cluster e offra agilità, complica altri aspetti dell'architettura. Ad esempio, il codice richiede una complessità aggiuntiva per determinare quale modello è associato a ciascun tenant. È inoltre necessario assicurarsi che le query relative a un solo tenant non saturino l'intero dominio e compromettano l'esperienza degli altri tenant. 

Test in Gateway API

Finestra di test per la query Tenant-1

Finestra di test per la query Tenant-1

Finestra di test per la query Tenant-2

Finestra di test per la query Tenant-2

Allegati

Per accedere al contenuto aggiuntivo associato a questo documento, decomprimi il seguente file: attachment.zip