Erstellen Sie eine serverlose Architektur mit mehreren Mandanten in Amazon Service OpenSearch - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erstellen Sie eine serverlose Architektur mit mehreren Mandanten in Amazon Service OpenSearch

Erstellt von Tabby Ward (AWS) und Nisha Gambhir () AWS

Umgebung: PoC oder Pilot

Technologien: Modernisierung; SaaS; Serverlos

Arbeitslast: Open Source

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

Übersicht

Amazon OpenSearch Service ist ein verwalteter Service, der die Bereitstellung, den Betrieb und die Skalierung von Elasticsearch, einer beliebten Open-Source-Such- und Analyse-Engine, vereinfacht. Amazon OpenSearch Service bietet Freitextsuche sowie Erfassung und Dashboarding nahezu in Echtzeit für Streaming-Daten wie Logs und Metriken.

Anbieter von Software as a Service (SaaS) nutzen Amazon OpenSearch Service häufig, um eine Vielzahl von Anwendungsfällen abzudecken, z. B. um Kundeninformationen auf skalierbare und sichere Weise zu gewinnen und gleichzeitig Komplexität und Ausfallzeiten zu reduzieren.

Die Verwendung von Amazon OpenSearch Service in einer Umgebung mit mehreren Mandanten bringt eine Reihe von Überlegungen mit sich, die sich auf die Partitionierung, Isolierung, Bereitstellung und Verwaltung Ihrer SaaS-Lösung auswirken. SaaS-Anbieter müssen überlegen, wie sie ihre Elasticsearch-Cluster bei sich ständig ändernden Workloads effektiv skalieren können. Sie müssen auch berücksichtigen, wie sich Stufenbildung und laute Nachbarschaftsbedingungen auf ihr Partitionierungsmodell auswirken könnten.

In diesem Muster werden die Modelle untersucht, die zur Darstellung und Isolierung von Mandantendaten mit Elasticsearch-Konstrukten verwendet werden. Darüber hinaus konzentriert sich das Muster auf eine einfache serverlose Referenzarchitektur als Beispiel, um die Indizierung und Suche mithilfe von Amazon OpenSearch Service in einer Umgebung mit mehreren Mandanten zu demonstrieren. Es implementiert das Pool-Datenpartitionierungsmodell, das denselben Index für alle Mandanten verwendet und gleichzeitig die Datenisolierung eines Mandanten gewährleistet. Dieses Muster verwendet die folgenden Amazon Web Services (AWS) -Dienste: Amazon API Gateway, AWS Lambda, Amazon Simple Storage Service (Amazon S3) und Amazon OpenSearch Service.

Weitere Informationen zum Poolmodell und anderen Datenpartitionierungsmodellen finden Sie im Abschnitt Zusätzliche Informationen.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives Konto AWS

  • AWSCommand Line Interface (AWSCLI) Version 2.x, installiert und konfiguriert auf macOS, Linux oder Windows

  • Python-Version 3.7

  • pip3 — Der Python-Quellcode wird als ZIP-Datei zur Bereitstellung in einer Lambda-Funktion bereitgestellt. Wenn Sie den Code lokal verwenden oder anpassen möchten, gehen Sie wie folgt vor, um den Quellcode zu entwickeln und neu zu kompilieren:

    1. Generieren Sie die requirements.txt Datei, indem Sie den folgenden Befehl im selben Verzeichnis wie die Python-Skripte ausführen: pip3 freeze > requirements.txt

    2. Installieren Sie die Abhängigkeiten: pip3 install -r requirements.txt

Einschränkungen

  • Dieser Code läuft in Python und unterstützt derzeit keine anderen Programmiersprachen. 

  • Die Beispielanwendung bietet keine AWS regionsübergreifende Unterstützung oder Unterstützung für Disaster Recovery (DR). 

  • Dieses Muster dient nur zu Demonstrationszwecken. Es ist nicht für die Verwendung in einer Produktionsumgebung vorgesehen.

Architektur

Das folgende Diagramm veranschaulicht die allgemeine Architektur dieses Musters. Die Architektur umfasst Folgendes:

  • AWSLambda zum Indizieren und Abfragen des Inhalts 

  • Amazon OpenSearch Service zur Durchführung der Suche 

  • Amazon API Gateway, um eine API Interaktion mit dem Benutzer zu ermöglichen

  • Amazon S3 zum Speichern von Rohdaten (nicht indexiert)

  • Amazon CloudWatch zur Überwachung von Protokollen

  • AWSIdentity and Access Management (IAM) zur Erstellung von Mandantenrollen und Richtlinien

Serverlose Mehrmandanten-Architektur auf hohem Niveau

Automatisierung und Skalierung

Der Einfachheit halber wird das Muster für AWS CLI die Bereitstellung der Infrastruktur und für die Bereitstellung des Beispielcodes verwendet. Sie können eine AWS CloudFormation Vorlage oder AWS Cloud Development Kit (AWSCDK) -Skripts erstellen, um das Muster zu automatisieren.

Tools

AWSDienste

  • AWSCLI— AWS Command Line Interface (AWSCLI) ist ein einheitliches Tool zur Verwaltung von AWS Diensten und Ressourcen mithilfe von Befehlen in Ihrer Befehlszeilen-Shell.

  • AWSLambda — AWS Lambda ist ein Rechendienst, mit dem Sie Code ausführen können, ohne Server bereitzustellen oder zu verwalten. Lambda führt Ihren Code nur bei Bedarf aus und skaliert automatisch – von einigen Anforderungen pro Tag bis zu Tausenden pro Sekunde.

  • Amazon API Gateway — Amazon API Gateway ist ein AWS Service für die Erstellung, Veröffentlichung, Wartung, Überwachung und Sicherung RESTHTTP, und zwar WebSocket APIs in jeder Größenordnung.

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) ist ein Objektspeicherservice, mit dem Sie jederzeit und von überall im Internet eine beliebige Menge an Informationen speichern und abrufen können.

  • Amazon OpenSearch Service — Amazon OpenSearch Service ist ein vollständig verwalteter Service, der es Ihnen leicht macht, Elasticsearch kostengünstig und skalierbar bereitzustellen, zu sichern und auszuführen.

Code

Der Anhang enthält Beispieldateien für dieses Muster. Dazu zählen:

  • index_lambda_package.zip— Die Lambda-Funktion für die Indizierung von Daten in Amazon OpenSearch Service mithilfe des Pool-Modells.

  • search_lambda_package.zip— Die Lambda-Funktion für die Suche nach Daten in Amazon OpenSearch Service.

  • Tenant-1-data— Beispiel für Rohdaten (nicht indexiert) für Tenant-1.

  • Tenant-2-data— Stichprobe von Rohdaten (nicht indexiert) für Tenant-2.

Wichtig: Die Geschichten in diesem Muster enthalten CLI Befehlsbeispiele, die für Unix, Linux und macOS formatiert sind. Ersetzen Sie unter Windows den umgekehrten Schrägstrich (\), das Unix-Fortsetzungszeichen, am Ende jeder Zeile durch ein Caret-Zeichen oder Zirkumflex (^).

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie einen S3-Bucket.

Erstellen Sie einen S3-Bucket in Ihrer AWS Region. Dieser Bucket enthält die nicht indizierten Mandantendaten für die Beispielanwendung. Stellen Sie sicher, dass der Name des S3-Buckets global eindeutig ist, da der Namespace von allen Konten gemeinsam genutzt wird. AWS

Um einen S3-Bucket zu erstellen, können Sie den Befehl AWS CLI create-bucket wie folgt verwenden:

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

wo tenantrawdata ist der Name des S3-Buckets. (Sie können jeden eindeutigen Namen verwenden, der den Richtlinien zur Benennung von Buckets entspricht.)

Cloud-Architekt, Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Amazon OpenSearch Service-Domain.

Führen Sie den AWS CLI create-elasticsearch-domainBefehl aus, um eine Amazon OpenSearch Service-Domain zu erstellen:

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

Die Anzahl der Instanzen ist auf 1 gesetzt, da die Domain zu Testzwecken dient. Sie müssen mithilfe des advanced-security-options Parameters eine differenzierte Zugriffskontrolle aktivieren, da die Details nach der Erstellung der Domäne nicht mehr geändert werden können. 

Dieser Befehl erstellt einen Master-Benutzernamen (KibanaUser) und ein Passwort, mit denen Sie sich bei der Kibana-Konsole anmelden können.

Da die Domain Teil einer virtuellen privaten Cloud (VPC) ist, müssen Sie sicherstellen, dass Sie die Elasticsearch-Instanz erreichen können, indem Sie die zu verwendende Zugriffsrichtlinie angeben.

Weitere Informationen finden Sie VPC in der AWS Dokumentation unter Starten Ihrer Amazon OpenSearch Service-Domains mithilfe von a.

Cloud-Architekt, Cloud-Administrator

Richten Sie einen Bastion-Host ein.

Richten Sie eine Amazon Elastic Compute Cloud (AmazonEC2) Windows-Instance als Bastion-Host für den Zugriff auf die Kibana-Konsole ein. Die Elasticsearch-Sicherheitsgruppe muss Datenverkehr von der EC2 Amazon-Sicherheitsgruppe zulassen. Eine Anleitung finden Sie im Blogbeitrag Controlling Network Access to EC2 Instances Using a Bastion Server.

Wenn der Bastion-Host eingerichtet wurde und Sie die Sicherheitsgruppe, die der Instance zugeordnet ist, verfügbar haben, verwenden Sie den AWS CLI authorize-security-group-ingressBefehl, um der Elasticsearch-Sicherheitsgruppe die Erlaubnis hinzuzufügen, Port 443 von der Amazon-Sicherheitsgruppe EC2 (Bastion Host) zuzulassen.

aws ec2 authorize-security-group-ingress \ --group-id <SecurityGroupIdfElasticSearch> \ --protocol tcp \ --port 443 \ --source-group <SecurityGroupIdfBashionHostEC2>
Cloud-Architekt, Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie die Lambda-Ausführungsrolle.

Führen Sie den Befehl AWS CLI create-role aus, um der Lambda-Indexfunktion Zugriff auf AWS Dienste und Ressourcen zu gewähren:

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

wo lambda_assume_role.json befindet sich ein JSON Dokument im aktuellen Ordner, das der Lambda-Funktion wie folgt AssumeRole Berechtigungen gewährt:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
Cloud-Architekt, Cloud-Administrator

Hängen Sie verwaltete Richtlinien an die Lambda-Rolle an.

Führen Sie den AWS CLI attach-role-policyBefehl aus, um verwaltete Richtlinien an die im vorherigen Schritt erstellte Rolle anzuhängen. Diese beiden Richtlinien gewähren der Rolle Berechtigungen zum Erstellen einer elastic network interface und zum Schreiben von Protokollen in CloudWatch 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 
Cloud-Architekt, Cloud-Administrator

Erstellen Sie eine Richtlinie, um der Lambda-Indexfunktion die Berechtigung zum Lesen der S3-Objekte zu erteilen.

Führen Sie den Befehl AWS CLI create-policy aus, um der Lambda-Indexfunktion die s3:GetObject Erlaubnis zu erteilen, die Objekte im S3-Bucket zu lesen:

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

Die Datei s3-policy.json ist ein JSON Dokument im aktuellen Ordner, das s3:GetObject Berechtigungen für den Lesezugriff auf S3-Objekte gewährt. Wenn Sie bei der Erstellung des S3-Buckets einen anderen Namen verwendet haben, geben Sie im folgenden Resource  Abschnitt den richtigen Bucket-Namen an:

{     "Version": "2012-10-17",     "Statement": [         {            "Effect": "Allow",            "Action": "s3:GetObject",            "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
Cloud-Architekt, Cloud-Administrator

Hängen Sie die Amazon S3 S3-Berechtigungsrichtlinie an die Lambda-Ausführungsrolle an.

Führen Sie den AWS CLI attach-role-policyBefehl aus, um die Amazon S3 S3-Berechtigungsrichtlinie, die Sie im vorherigen Schritt erstellt haben, an die Lambda-Ausführungsrolle anzuhängen:

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

wo PolicyARN ist der Amazon-Ressourcenname (ARN) der Amazon S3-Genehmigungsrichtlinie. Sie können diesen Wert aus der Ausgabe des vorherigen Befehls abrufen.

Cloud-Architekt, Cloud-Administrator

Erstellen Sie die Lambda-Index-Funktion.

Führen Sie den Befehl AWS CLI create-function aus, um die Lambda-Index-Funktion zu erstellen, die auf Amazon Service zugreift: 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>\"]}"
Cloud-Architekt, Cloud-Administrator

Erlauben Sie Amazon S3, die Lambda-Index-Funktion aufzurufen.

Führen Sie den Befehl AWS CLI add-permission aus, um Amazon S3 die Erlaubnis zu erteilen, die Lambda-Index-Funktion aufzurufen:

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>"
Cloud-Architekt, Cloud-Administrator

Fügen Sie einen Lambda-Trigger für das Amazon S3 S3-Ereignis hinzu.

Führen Sie den AWS CLI put-bucket-notification-configurationBefehl aus, um Benachrichtigungen an die Lambda-Indexfunktion zu senden, wenn das Amazon S3 ObjectCreated S3-Ereignis erkannt wird. Die Indexfunktion wird immer dann ausgeführt, wenn ein Objekt in den S3-Bucket hochgeladen wird. 

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

Die Datei s3-trigger.json ist ein JSON Dokument im aktuellen Ordner, das die Ressourcenrichtlinie zur Lambda-Funktion hinzufügt, wenn das Amazon S3 ObjectCreated S3-Ereignis eintritt.

Cloud-Architekt, Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie die Lambda-Ausführungsrolle.

Führen Sie den Befehl AWS CLI create-role aus, um der Lambda-Suchfunktion Zugriff auf AWS Dienste und Ressourcen zu gewähren:

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

wo lambda_assume_role.json befindet sich ein JSON Dokument im aktuellen Ordner, das der Lambda-Funktion wie folgt AssumeRole Berechtigungen gewährt:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
Cloud-Architekt, Cloud-Administrator

Hängen Sie verwaltete Richtlinien an die Lambda-Rolle an.

Führen Sie den AWS CLI attach-role-policyBefehl aus, um verwaltete Richtlinien an die im vorherigen Schritt erstellte Rolle anzuhängen. Diese beiden Richtlinien gewähren der Rolle Berechtigungen zum Erstellen einer elastic network interface und zum Schreiben von Protokollen in CloudWatch 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 
Cloud-Architekt, Cloud-Administrator

Erstellen Sie die Lambda-Suchfunktion.

Führen Sie den Befehl AWS CLI create-function aus, um die Lambda-Suchfunktion zu erstellen, die auf Amazon Service zugreift: 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>\"]}"
Cloud-Architekt, Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie IAM Mandantenrollen.

Führen Sie den Befehl AWS CLI create-role aus, um zwei Mandantenrollen zu erstellen, die zum Testen der Suchfunktion verwendet werden:

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

Die Datei assume-role-policy.json ist ein JSON Dokument im aktuellen Ordner, das der Lambda-Ausführungsrolle AssumeRole Berechtigungen gewährt:

{     "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"         }     ] }
Cloud-Architekt, Cloud-Administrator

Erstellen Sie eine IAM Mandantenrichtlinie.

Führen Sie den Befehl AWS CLI create-policy aus, um eine Mandantenrichtlinie zu erstellen, die Zugriff auf Elasticsearch-Operationen gewährt:

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

Die Datei policy.json ist ein JSON Dokument im aktuellen Ordner, das Berechtigungen für Elasticsearch gewährt:

{     "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>"             ]         }     ] }
Cloud-Architekt, Cloud-Administrator

Hängen Sie die IAM Mandantenrichtlinie an die Mandantenrollen an.

Führen Sie den AWS CLI attach-role-policyBefehl aus, um die IAM Mandantenrichtlinie an die beiden Mandantenrollen anzuhängen, die Sie im vorherigen Schritt erstellt haben:

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

Die Richtlinie ARN stammt aus der Ausgabe des vorherigen Schritts.

Cloud-Architekt, Cloud-Administrator

Erstellen Sie eine IAM Richtlinie, um Lambda Berechtigungen zur Übernahme einer Rolle zu erteilen.

Führen Sie den Befehl AWS CLI create-policy aus, um eine Richtlinie zu erstellen, damit Lambda die Mandantenrolle übernimmt:

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

Die Datei lambda_policy.json ist ein JSON Dokument im aktuellen Ordner, das Berechtigungen gewährt für: AssumeRole

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

Denn Sie können ein Platzhalterzeichen verwendenResource, um zu vermeiden, dass für jeden Mandanten eine neue Richtlinie erstellt wird.

Cloud-Architekt, Cloud-Administrator

Erstellen Sie eine IAM Richtlinie, um der Lambda-Indexrolle Zugriff auf Amazon S3 zu gewähren.

Führen Sie den Befehl AWS CLI create-policy aus, um der Lambda-Indexrolle die Erlaubnis zu erteilen, auf die Objekte im S3-Bucket zuzugreifen:

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

Bei der Datei s3_lambda_policy.json handelt es sich um das folgende JSON Richtliniendokument im aktuellen Ordner:

{     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": "s3:GetObject",             "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
Cloud-Architekt, Cloud-Administrator

Hängen Sie die Richtlinie an die Lambda-Ausführungsrolle an.

Führen Sie den AWS CLI attach-role-policyBefehl aus, um die im vorherigen Schritt erstellte Richtlinie an die zuvor erstellten Lambda-Index- und Suchausführungsrollen anzuhängen:

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

Die Richtlinie ARN stammt aus der Ausgabe des vorherigen Schritts.

Cloud-Architekt, Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie ein REST API API In-Gateway.

Führen Sie den CLI create-rest-apiBefehl aus, um eine REST API Ressource zu erstellen:

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

Für den Endpunkt-Konfigurationstyp können Sie angeben, EDGE statt einer bestimmten AWS Region Kantenstandorte REGIONAL zu verwenden.

Notieren Sie sich den Wert des id Felds aus der Befehlsausgabe. Dies ist die API ID, die Sie in nachfolgenden Befehlen verwenden werden.

Cloud-Architekt, Cloud-Administrator

Erstellen Sie eine Ressource für die SucheAPI.

Die API Suchressource startet die Lambda-Suchfunktion mit dem Ressourcennamensearch. (Sie müssen keine Indexfunktion API für den Lambda erstellen, da sie automatisch ausgeführt wird, wenn Objekte in den S3-Bucket hochgeladen werden.)

  1. Führen Sie den Befehl AWS CLI get-resources aus, um die übergeordnete ID für den Stammpfad abzurufen:

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

    Notieren Sie sich den Wert des ID-Felds. Sie werden diese übergeordnete ID im nächsten Befehl verwenden.

    { "items": [ { "id": "zpsri964ck", "path": "/" } ] }
  2. Führen Sie den Befehl AWS CLI create-resource aus, um eine Ressource für die Suche zu erstellen. API Geben Sie für parent-id die ID aus dem vorherigen Befehl an.

    aws apigateway create-resource \   --rest-api-id <API-ID> \   --parent-id <Parent-ID> \   --path-part search
Cloud-Architekt, Cloud-Administrator

Erstellen Sie eine GET Methode für die SucheAPI.

Führen Sie den Befehl AWS CLI put-method aus, um eine GET  Methode für die Suche zu erstellen: 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

Geben Sie für resource-id die ID aus der Ausgabe des create-resource Befehls an.

Cloud-Architekt, Cloud-Administrator

Erstellen Sie eine Methodenantwort für die SucheAPI.

Führen Sie den AWS CLI put-method-responseBefehl aus, um eine Methodenantwort für die Suche hinzuzufügenAPI:

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

Geben Sie für  resource-id die ID aus der Ausgabe des vorherigen create-resource Befehls an.

Cloud-Architekt, Cloud-Administrator

Richten Sie eine Proxy-Lambda-Integration für die Suche API ein.

Führen Sie den AWS CLI Befehl put-integration aus, um eine Integration mit der Lambda-Suchfunktion einzurichten:

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

Geben Sie für resource-id die ID aus dem vorherigen Befehl an. create-resource

Cloud-Architekt, Cloud-Administrator

Erteilen Sie API Gateway die Erlaubnis, die Lambda-Suchfunktion aufzurufen.

Führen Sie den Befehl AWS CLI add-permission aus, um API Gateway die Erlaubnis zur Verwendung der Suchfunktion zu erteilen:

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

Ändern Sie den source-arn Pfad, wenn Sie anstelle von search einen anderen API Ressourcennamen verwendet haben.

Cloud-Architekt, Cloud-Administrator

Stellen Sie die Suche bereitAPI.

Führen Sie den Befehl AWS CLI create-deployment aus, um eine Staging-Ressource mit dem Namen zu erstellen: dev

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

Wenn Sie den aktualisierenAPI, können Sie denselben CLI Befehl verwenden, um ihn erneut in derselben Phase bereitzustellen.

Cloud-Architekt, Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Loggen Sie sich in die Kibana-Konsole ein.

  1. Suchen Sie den Link zu Kibana in Ihrem Domain-Dashboard auf der Amazon OpenSearch Service-Konsole. Das URL ist in der Form:<domain-endpoint>/_plugin/kibana/.

  2. Verwenden Sie den Bastion-Host, den Sie im ersten Epic konfiguriert haben, um auf die Kibana-Konsole zuzugreifen.

  3. Melden Sie sich bei der Kibana-Konsole an, indem Sie den Master-Benutzernamen und das Passwort aus dem vorherigen Schritt verwenden, als Sie die Amazon OpenSearch Service-Domain erstellt haben.

  4. Wenn Sie aufgefordert werden, einen Mandanten auszuwählen, wählen Sie Privat.

Cloud-Architekt, Cloud-Administrator

Erstellen und konfigurieren Sie Kibana-Rollen.

Um Daten zu isolieren und sicherzustellen, dass ein Mandant die Daten eines anderen Mandanten nicht abrufen kann, müssen Sie Document Security verwenden, sodass Mandanten nur auf Dokumente zugreifen können, die ihre Mandanten-ID enthalten.

  1. Wählen Sie auf der Kibana-Konsole im Navigationsbereich Sicherheit, Rolle aus.

  2. Erstellen Sie eine neue Mandantenrolle.

  3. Legen Sie die Cluster-Berechtigungen auf festindices_all, wodurch die Berechtigungen zum Erstellen, Lesen, Aktualisieren und Löschen (CRUD) für den Amazon OpenSearch Service-Index erteilt werden. 

  4. Beschränken Sie die Indexberechtigungen auf den tenant-data Index. (Der Indexname sollte mit dem Namen in den Lambda-Such- und Indexfunktionen übereinstimmen.) 

  5. Legen Sie die Indexberechtigungen auf festindices_all, damit Benutzer alle indexbezogenen Operationen ausführen können. (Je nach Ihren Anforderungen können Sie die Vorgänge für einen detaillierteren Zugriff einschränken.)

  6. Verwenden Sie aus Sicherheitsgründen auf Dokumentebene die folgende Richtlinie, um Dokumente nach Mandanten-ID zu filtern, um die Datenisolierung für Mandanten in einem gemeinsam genutzten Index zu gewährleisten:

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

    Beim Indexnamen, den Eigenschaften und Werten wird zwischen Groß- und Kleinschreibung unterschieden.

Cloud-Architekt, Cloud-Administrator

Ordnen Sie Benutzer Rollen zu.

  1. Wählen Sie die Registerkarte Zugeordnete Benutzer für die Rolle und wählen Sie dann Benutzer zuordnen aus.

  2. Geben Sie im Abschnitt Backend-Rollen die ARN IAM Mandantenrolle an, die Sie zuvor erstellt haben, und wählen Sie dann Zuordnen aus. Dadurch wird die IAM Mandantenrolle der Kibana-Rolle zugeordnet, sodass bei der mandantenspezifischen Suche nur Daten für diesen Mandanten zurückgegeben werden. Wenn der IAM Rollenname für Tenant-1 beispielsweise lautetTenant-1-Role, geben Sie im Feld Backend-Rollen ARN für die Kibana-Rolle Tenant-1 den Wert für Tenant-1-Role (aus dem Abschnitt Mandantenrollen erstellen und konfigurieren) an.

  3. Wiederholen Sie die Schritte 1 und 2 für Tenant-2.

Wir empfehlen Ihnen, die Erstellung der Mandanten- und Kibana-Rollen beim Onboarding des Mandanten zu automatisieren.

Cloud-Architekt, Cloud-Administrator

Erstellen Sie den Mieterdatenindex.

Wählen Sie im Navigationsbereich unter Verwaltung die Option Dev Tools aus, und führen Sie dann den folgenden Befehl aus. Dieser Befehl erstellt den tenant-data Index, um die Zuordnung für die TenantId Eigenschaft zu definieren.

PUT /tenant-data {   "mappings": {     "properties": {       "TenantId": { "type": "keyword"}     }   } }
Cloud-Architekt, Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie einen VPC Endpunkt für Amazon S3.

Führen Sie den AWS CLI create-vpc-endpointBefehl aus, um einen VPC Endpunkt für Amazon S3 zu erstellen. Der Endpunkt ermöglicht der Lambda-Index-Funktion in den VPC Zugriff auf den Amazon S3 S3-Service.

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

Geben Sie für die an vpc-idVPC, die Sie für die Lambda-Indexfunktion verwenden. Verwenden Sie für service-name den Amazon S3 S3-Endpunkt den richtigenURL. Geben Sie für route-table-ids die Routing-Tabelle an, die dem VPC Endpunkt zugeordnet ist.

Cloud-Architekt, Cloud-Administrator

Erstellen Sie einen VPC Endpunkt für AWSSTS.

Führen Sie den AWS CLI create-vpc-endpointBefehl aus, um einen VPC Endpunkt für den AWS Security Token Service (AWSSTS) zu erstellen. Der Endpunkt ermöglicht dem Lambda-Index und den Suchfunktionen in den VPC Zugriff auf den AWS STS Service. Die Funktionen verwenden AWSSTS, wenn sie die IAM Rolle übernehmen.

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>

Geben Sie für die anvpc-id, VPC die Sie für den Lambda-Index und die Suchfunktionen verwenden. Geben Sie für das Subnetz ansubnet-id, in dem dieser Endpunkt erstellt werden soll. Geben Sie für die Sicherheitsgruppe ansecurity-group-id, der dieser Endpunkt zugeordnet werden soll. (Es könnte dasselbe sein wie die Sicherheitsgruppe, die Lambda verwendet.)

Cloud-Architekt, Cloud-Administrator
AufgabeBeschreibungErforderliche Fähigkeiten

Aktualisieren Sie die Python-Dateien für die Index- und Suchfunktionen.

  1. Bearbeiten Sie in der index_lambda_package.zip Datei die  lamba_index.py Datei, um die AWS Konto-ID, die AWS Region und die Elasticsearch-Endpunktinformationen zu aktualisieren.

  2. Bearbeiten Sie in der search_lambda_package.zip Datei die Datei, um die lambda_search.py AWS Konto-ID, die AWS Region und die Elasticsearch-Endpunktinformationen zu aktualisieren.

Sie können den Elasticsearch-Endpunkt auf der Registerkarte Übersicht der Amazon OpenSearch Service-Konsole abrufen. Er hat das Format<AWS-Region>.es.amazonaws.com.

Cloud-Architekt, App-Entwickler

Aktualisieren Sie den Lambda-Code.

Verwenden Sie den AWS CLI update-function-codeBefehl, um den Lambda-Code mit den Änderungen zu aktualisieren, die Sie an den Python-Dateien vorgenommen haben:

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
Cloud-Architekt, App-Entwickler

Laden Sie Rohdaten in den S3-Bucket hoch.

Verwenden Sie den Befehl AWS CLI cp, um Daten für die Objekte Tenant-1 und Tenant-2 in den tenantrawdata Bucket hochzuladen (geben Sie den Namen des S3-Buckets an, den Sie zu diesem Zweck erstellt haben):

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

Der S3-Bucket ist so eingerichtet, dass er bei jedem Upload von Daten die Lambda-Indexfunktion ausführt, sodass das Dokument in Elasticsearch indexiert wird.

Cloud-Architekt, Cloud-Administrator

Suchen Sie Daten von der Kibana-Konsole aus.

Führen Sie auf der Kibana-Konsole die folgende Abfrage aus:

GET tenant-data/_search

Diese Abfrage zeigt alle in Elasticsearch indexierten Dokumente an. In diesem Fall sollten Sie zwei separate Dokumente für Tenant-1 und Tenant-2 sehen.

Cloud-Architekt, Cloud-Administrator

Testen Sie die Suche API von API Gateway aus.

  1. Öffnen Sie in der API Gateway-Konsole die SucheAPI, wählen Sie die GET Methode in der Suchressource aus, und wählen Sie dann Test aus.

  2. Geben Sie im Testfenster die folgende Abfragezeichenfolge (Groß- und Kleinschreibung beachten) für die Mandanten-ID ein und wählen Sie dann Test aus.

    TenantId=Tenant-1

    Die Lambda-Funktion sendet eine Abfrage an Amazon OpenSearch Service, die das Mandantendokument anhand der Sicherheit auf Dokumentebene filtert. Die Methode gibt das Dokument zurück, das zu Tenant-1 gehört.

  3. Ändern Sie die Abfragezeichenfolge in:

    TenantId=Tenant-2

    Diese Abfrage gibt das Dokument zurück, das zu Tenant-2 gehört.

Bildschirmdarstellungen finden Sie im Abschnitt Zusätzliche Informationen.

Cloud-Architekt, App-Entwickler

Zugehörige Ressourcen

Zusätzliche Informationen

Modelle zur Datenpartitionierung

Es gibt drei gängige Datenpartitionierungsmodelle, die in Systemen mit mehreren Mandanten verwendet werden: Silo, Pool und Hybrid. Welches Modell Sie wählen, hängt von den Anforderungen Ihrer Umgebung in Bezug auf Compliance, Noisy Neighbor, Betrieb und Isolierung ab.

Silo-Modell

Im Silomodell werden die Daten jedes Mandanten in einem eigenen Speicherbereich gespeichert, in dem es nicht zu einer Vermischung von Mandantendaten kommt. Sie können zwei Ansätze verwenden, um das Silomodell mit Amazon OpenSearch Service zu implementieren: Domain pro Mandant und Index pro Mandant.

  • Domain pro Mandant — Sie können pro Mandant eine separate Amazon OpenSearch Service-Domain (gleichbedeutend mit einem Elasticsearch-Cluster) verwenden. Die Platzierung jedes Mandanten in einer eigenen Domain bietet alle Vorteile, die mit der Speicherung von Daten in einem eigenständigen Konstrukt verbunden sind. Dieser Ansatz bringt jedoch Herausforderungen in Bezug auf Management und Agilität mit sich. Aufgrund seines dezentralen Charakters ist es schwieriger, den betrieblichen Zustand und die Aktivität der Mieter zu aggregieren und zu bewerten. Dies ist eine kostspielige Option, bei der jede Amazon OpenSearch Service-Domain mindestens über drei Masterknoten und zwei Datenknoten für Produktionsworkloads verfügen muss.

Silomodell „Domain pro Mandant“ für serverlose Architekturen mit mehreren Mandanten
  • Index pro Mandant — Sie können Mandantendaten in separaten Indizes innerhalb eines Amazon OpenSearch Service-Clusters platzieren. Bei diesem Ansatz verwenden Sie eine Mandanten-ID, wenn Sie den Index erstellen und benennen, indem Sie die Mandanten-ID dem Indexnamen voranstellen. Der Ansatz „Index pro Mandant“ hilft Ihnen dabei, Ihre Siloziele zu erreichen, ohne für jeden Mandanten einen komplett separaten Cluster einzuführen. Es kann jedoch zu Speicherauslastung kommen, wenn die Anzahl der Indizes zunimmt, da dieser Ansatz mehr Shards erfordert und der Master-Knoten mehr Zuweisung und Neuverteilung bewältigen muss.

Silomodell mit Index pro Mandant für serverlose Architekturen mit mehreren Mandanten

Isolierung im Silomodell — Im Silomodell verwenden Sie IAM Richtlinien, um die Domänen oder Indizes zu isolieren, die die Daten der einzelnen Mandanten enthalten. Diese Richtlinien verhindern, dass ein Mandant auf die Daten eines anderen Mandanten zugreift. Um Ihr Silo-Isolationsmodell zu implementieren, können Sie eine ressourcenbasierte Richtlinie erstellen, die den Zugriff auf Ihre Mandantenressource steuert. Dabei handelt es sich häufig um eine Domain-Zugriffsrichtlinie, die festlegt, welche Aktionen ein Principal an den Unterressourcen der Domain durchführen kann, einschließlich Elasticsearch-Indizes und. APIs Mit IAM identitätsbasierten Richtlinien können Sie zulässige oder verweigerte Aktionen für die Domain, Indizes oder APIs innerhalb von Amazon Service angeben. OpenSearch Das Action  Element einer IAM Richtlinie beschreibt die spezifischen Aktionen, die durch die Richtlinie zugelassen oder verweigert werden, und das Principal  Element spezifiziert die betroffenen Konten, Benutzer oder Rollen.

Die folgende Beispielrichtlinie gewährt Tenant-1 vollen Zugriff (wie von angegebenes:*) nur auf die Unterressourcen in der tenant-1 Domäne. Das nachstehende /* Resource  Element weist darauf hin, dass diese Richtlinie für die Unterressourcen der Domain gilt, nicht für die Domain selbst. Wenn diese Richtlinie in Kraft ist, dürfen Mandanten keine neue Domäne erstellen oder Einstellungen für eine bestehende Domäne ändern.

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

Um das Silo-Modell „Mandant pro Index“ zu implementieren, müssten Sie diese Beispielrichtlinie ändern, um Tenant-1 weiter auf den angegebenen Index oder die angegebenen Indizes zu beschränken, indem Sie den Indexnamen angeben. Die folgende Beispielrichtlinie beschränkt Tenant-1 auf den Index. 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/*"       }    ] }

Pool-Modell

Im Poolmodell werden alle Mandantendaten in einem Index innerhalb derselben Domäne gespeichert. Die Mandanten-ID ist in den Daten (Dokument) enthalten und wird als Partitionsschlüssel verwendet, sodass Sie bestimmen können, welche Daten zu welchem Mandanten gehören. Dieses Modell reduziert den Verwaltungsaufwand. Der Betrieb und die Verwaltung des gepoolten Indexes sind einfacher und effizienter als die Verwaltung mehrerer Indizes. Da Mandantendaten jedoch innerhalb desselben Index zusammengefasst sind, verlieren Sie die natürliche Mandantenisolierung, die das Silomodell bietet. Dieser Ansatz kann aufgrund des Noisy-Neighbor-Effekts auch zu Leistungseinbußen führen.

Pool-Modell für serverlose Architekturen mit mehreren Mandanten

Mandantenisolierung im Poolmodell — Im Allgemeinen ist die Implementierung der Mandantenisolierung im Poolmodell schwierig. Der im Silomodell verwendete IAM Mechanismus ermöglicht es Ihnen nicht, die Isolierung anhand der in Ihrem Dokument gespeicherten Mandanten-ID zu beschreiben.

Ein alternativer Ansatz besteht darin, die differenzierte Access Control (FGAC) -Unterstützung zu verwenden, die von der Open Distro for Elasticsearch bereitgestellt wird. FGACermöglicht es Ihnen, Berechtigungen auf Index-, Dokument- oder Feldebene zu kontrollieren. FGACWertet bei jeder Anfrage die Benutzeranmeldedaten aus und authentifiziert entweder den Benutzer oder verweigert den Zugriff. Wenn der Benutzer FGAC authentifiziert wird, ruft es alle Rollen ab, die diesem Benutzer zugeordnet sind, und verwendet den vollständigen Satz von Berechtigungen, um zu bestimmen, wie die Anfrage behandelt werden soll. 

Um die erforderliche Isolierung im Poolmodell zu erreichen, können Sie die Sicherheit auf Dokumentebene verwenden, sodass Sie eine Rolle auf eine Teilmenge von Dokumenten in einem Index beschränken können. Die folgende Beispielrolle beschränkt Abfragen auf Tenant-1. Indem Sie diese Rolle auf Tenant-1 anwenden, können Sie die erforderliche Isolierung erreichen. 

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

Hybrides Modell

Das Hybridmodell verwendet eine Kombination der Silo- und Poolmodelle in derselben Umgebung, um jedem Mieter (z. B. kostenlose Tarife, Standard- und Premium-Tarife) einzigartige Erlebnisse zu bieten. Jede Stufe folgt demselben Sicherheitsprofil, das im Poolmodell verwendet wurde.

Hybridmodell für serverlose Architekturen mit mehreren Mandanten

Mandantenisolierung im Hybridmodell — Im Hybridmodell verwenden Sie dasselbe Sicherheitsprofil wie im Poolmodell, wo die Verwendung des FGAC Sicherheitsmodells auf Dokumentenebene die Mandantenisolierung ermöglichte. Diese Strategie vereinfacht zwar die Clusterverwaltung und bietet Flexibilität, verkompliziert jedoch andere Aspekte der Architektur. Ihr Code erfordert beispielsweise zusätzliche Komplexität, um zu bestimmen, welches Modell jedem Mandanten zugeordnet ist. Sie müssen außerdem sicherstellen, dass Abfragen für einzelne Mandanten nicht die gesamte Domäne überlasten und die Benutzererfahrung für andere Mandanten beeinträchtigen. 

Testen im Gateway API

Testfenster für Tenant-1-Abfrage

Testfenster für Tenant-1-Abfrage

Testfenster für Tenant-2-Abfrage

Testfenster für Tenant-2-Abfrage

Anlagen

Um auf zusätzliche Inhalte zuzugreifen, die mit diesem Dokument verknüpft sind, entpacken Sie die folgende Datei: attachment.zip