

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Membangun arsitektur tanpa server multi-tenant di Amazon Service OpenSearch
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service"></a>

*Tabby Ward dan Nisha Gambhir, Amazon Web Services*

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

Amazon OpenSearch Service adalah layanan terkelola yang memudahkan penerapan, pengoperasian, dan skala Elasticsearch, yang merupakan mesin pencari dan analitik sumber terbuka yang populer. OpenSearch Layanan menyediakan pencarian teks gratis serta konsumsi dan dasbor mendekati waktu nyata untuk streaming data seperti log dan metrik. 

Penyedia perangkat lunak sebagai layanan (SaaS) sering menggunakan OpenSearch Layanan untuk mengatasi berbagai kasus penggunaan, seperti mendapatkan wawasan pelanggan dengan cara yang terukur dan aman sekaligus mengurangi kompleksitas dan waktu henti.

Menggunakan OpenSearch Layanan di lingkungan multi-penyewa memperkenalkan serangkaian pertimbangan yang memengaruhi partisi, isolasi, penyebaran, dan pengelolaan solusi SaaS Anda. Penyedia SaaS harus mempertimbangkan cara menskalakan cluster Elasticsearch mereka secara efektif dengan beban kerja yang terus berubah. Mereka juga perlu mempertimbangkan bagaimana kondisi tetangga yang berjenjang dan bising dapat memengaruhi model partisi mereka.

Pola ini meninjau model yang digunakan untuk mewakili dan mengisolasi data penyewa dengan konstruksi Elasticsearch. Selain itu, pola berfokus pada arsitektur referensi tanpa server sederhana sebagai contoh untuk menunjukkan pengindeksan dan pencarian menggunakan OpenSearch Layanan di lingkungan multi-penyewa. Ini mengimplementasikan model partisi data pool, yang berbagi indeks yang sama di antara semua penyewa sambil mempertahankan isolasi data penyewa. Pola ini menggunakan AWS layanan berikut: Amazon API Gateway, AWS Lambda, Amazon Simple Storage Service (Amazon S3), dan Service. OpenSearch 

Untuk informasi selengkapnya tentang model kumpulan dan model partisi data lainnya, lihat bagian [Informasi tambahan](#build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional).

## Prasyarat dan batasan
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-prereqs"></a>

**Prasyarat**
+ Aktif Akun AWS
+ [AWS Command Line Interface (AWS CLI) versi 2.x](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html), diinstal dan dikonfigurasi di macOS, Linux, atau Windows
+ [Python versi 3.9](https://www.python.org/downloads/release/python-3921/)
+ [pip3](https://pip.pypa.io/en/stable/) — Kode sumber Python disediakan sebagai file.zip untuk digunakan dalam fungsi Lambda. Jika Anda ingin menggunakan kode secara lokal atau menyesuaikannya, ikuti langkah-langkah berikut untuk mengembangkan dan mengkompilasi ulang kode sumber:

  1. Hasilkan `requirements.txt` file dengan menjalankan perintah berikut di direktori yang sama dengan skrip Python: `pip3 freeze > requirements.txt`

  1. Instal dependensi: `pip3 install -r requirements.txt`

**Batasan**
+ Kode ini berjalan dengan Python, dan saat ini tidak mendukung bahasa pemrograman lainnya. 
+ Aplikasi sampel tidak menyertakan dukungan AWS Cross-region atau Disaster Recovery (DR). 
+ Pola ini dimaksudkan untuk tujuan demonstrasi saja. Ini tidak dimaksudkan untuk digunakan dalam lingkungan produksi.

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

Diagram berikut menggambarkan arsitektur tingkat tinggi dari pola ini. Arsitekturnya meliputi:
+ Lambda untuk mengindeks dan menanyakan konten 
+ OpenSearch Layanan untuk melakukan pencarian 
+ API Gateway untuk menyediakan interaksi API dengan pengguna
+ Amazon S3 untuk menyimpan data mentah (tidak diindeks)
+ Amazon CloudWatch untuk memantau log
+ AWS Identity and Access Management (IAM) untuk membuat peran dan kebijakan penyewa

![\[Arsitektur tanpa server multi-tenant tingkat tinggi.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/1a8501e7-0776-4aca-aed3-28e3ada1d15d.png)


**Otomatisasi dan skala**

Untuk kesederhanaan, pola menggunakan AWS CLI untuk menyediakan infrastruktur dan untuk menyebarkan kode sampel. Anda dapat membuat CloudFormation template atau AWS Cloud Development Kit (AWS CDK) skrip untuk mengotomatiskan pola.

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

**Layanan AWS**
+ [AWS CLI](https://aws.amazon.com/cli/)adalah alat terpadu untuk mengelola Layanan AWS dan sumber daya dengan menggunakan perintah di shell baris perintah Anda.
+ [Lambda](https://aws.amazon.com/lambda/) adalah layanan komputasi yang memungkinkan Anda menjalankan kode tanpa menyediakan atau mengelola server. Lambda menjalankan kode Anda hanya saat diperlukan dan menskalakan secara otomatis, dari beberapa permintaan per hari hingga ribuan per detik.
+ [API Gateway](https://aws.amazon.com/api-gateway/) adalah Layanan AWS untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs pada skala apa pun.
+ [Amazon S3](https://aws.amazon.com/s3/) adalah layanan penyimpanan objek yang memungkinkan Anda menyimpan dan mengambil sejumlah informasi kapan saja, dari mana saja di web.
+ [OpenSearch Layanan adalah layanan](https://aws.amazon.com/opensearch-service/) yang dikelola sepenuhnya yang memudahkan Anda untuk menerapkan, mengamankan, dan menjalankan Elasticsearch dengan biaya efektif dalam skala besar.

**Kode**

Lampiran menyediakan file sampel untuk pola ini. Ini termasuk:
+ `index_lambda_package.zip`— Fungsi Lambda untuk mengindeks data di OpenSearch Layanan dengan menggunakan model pool.
+ `search_lambda_package.zip`— Fungsi Lambda untuk mencari data di OpenSearch Layanan.
+ `Tenant-1-data`— Sampel data mentah (tidak diindeks) untuk Penyewa - 1.
+ `Tenant-2-data`— Sampel data mentah (tidak diindeks) untuk Penyewa-2.

**penting**  
Cerita dalam pola ini mencakup contoh AWS CLI perintah yang diformat untuk Unix, Linux, dan macOS. Untuk Windows, ganti karakter kelanjutan backslash (\$1) Unix di akhir setiap baris dengan tanda sisipan (^).

**catatan**  
Dalam AWS CLI perintah, ganti semua nilai dalam kurung sudut (<>) dengan nilai yang benar.

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

### Buat dan konfigurasikan bucket S3
<a name="create-and-configure-an-s3-bucket"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat ember S3. | Buat ember S3 di. Wilayah AWS Bucket ini akan menyimpan data penyewa yang tidak diindeks untuk aplikasi sampel. Pastikan nama bucket S3 unik secara global, karena namespace dibagikan oleh semua orang. Akun AWSUntuk membuat bucket S3, Anda dapat menggunakan perintah AWS CLI [create-bucket](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html) sebagai berikut:<pre>aws s3api create-bucket \<br />  --bucket <tenantrawdata> \<br />  --region <your-AWS-Region></pre>di `tenantrawdata` mana nama bucket S3. (Anda dapat menggunakan nama unik apa pun yang mengikuti [pedoman penamaan bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).) | Arsitek cloud, Administrator Cloud | 

### Membuat dan mengkonfigurasi cluster Elasticsearch
<a name="create-and-configure-an-elasticsearch-cluster"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat domain OpenSearch Layanan. | Jalankan AWS CLI [create-elasticsearch-domain](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/es/create-elasticsearch-domain.html)perintah untuk membuat domain OpenSearch Layanan:<pre>aws es create-elasticsearch-domain \<br />  --domain-name vpc-cli-example \<br />  --elasticsearch-version 7.10 \<br />  --elasticsearch-cluster-config InstanceType=t3.medium.elasticsearch,InstanceCount=1 \<br />  --ebs-options EBSEnabled=true,VolumeType=gp2,VolumeSize=10 \<br />  --domain-endpoint-options "{\"EnforceHTTPS\": true}" \<br />  --encryption-at-rest-options "{\"Enabled\": true}" \<br />  --node-to-node-encryption-options "{\"Enabled\": true}" \<br />  --advanced-security-options "{\"Enabled\": true, \"InternalUserDatabaseEnabled\": true, \<br />    \"MasterUserOptions\": {\"MasterUserName\": \"KibanaUser\", \<br />    \"MasterUserPassword\": \"NewKibanaPassword@123\"}}" \<br />  --vpc-options "{\"SubnetIds\": [\"<subnet-id>\"], \"SecurityGroupIds\": [\"<sg-id>\"]}" \<br />  --access-policies "{\"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \ <br />    \"Principal\": {\"AWS\": \"*\" }, \"Action\":\"es:*\", \<br />    \"Resource\": \"arn:aws:es:<region>:<account-id>:domain\/vpc-cli-example\/*\" } ] }"</pre>Jumlah instans diatur ke 1 karena domain adalah untuk tujuan pengujian. Anda perlu mengaktifkan kontrol akses berbutir halus dengan menggunakan `advanced-security-options` parameter, karena detailnya tidak dapat diubah setelah domain dibuat. Perintah ini membuat nama pengguna master (`KibanaUser`) dan kata sandi yang dapat Anda gunakan untuk masuk ke konsol Kibana.Karena domain merupakan bagian dari virtual private cloud (VPC), Anda harus memastikan bahwa Anda dapat menjangkau instance Elasticsearch dengan menentukan kebijakan akses yang akan digunakan.Untuk informasi selengkapnya, lihat [Meluncurkan domain OpenSearch Layanan Amazon Anda dalam VPC](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html) dalam AWS dokumentasi. | Arsitek cloud, Administrator Cloud | 
| Siapkan host benteng. | Siapkan instans Windows Amazon Elastic Compute Cloud (Amazon EC2) sebagai host bastion untuk mengakses konsol Kibana. Grup keamanan Elasticsearch harus mengizinkan lalu lintas dari grup EC2 keamanan Amazon. Untuk petunjuk, lihat posting blog [Mengontrol Akses Jaringan ke EC2 Instans Menggunakan Server Bastion.](https://aws.amazon.com/blogs/security/controlling-network-access-to-ec2-instances-using-a-bastion-server/)Ketika host bastion telah disiapkan, dan Anda memiliki grup keamanan yang terkait dengan instance yang tersedia, gunakan AWS CLI [authorize-security-group-ingress](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/authorize-security-group-ingress.html)perintah untuk menambahkan izin ke grup keamanan Elasticsearch untuk mengizinkan port 443 dari grup keamanan Amazon EC2 (bastion host).<pre>aws ec2 authorize-security-group-ingress \<br />  --group-id <SecurityGroupIdfElasticSearch> \ <br />  --protocol tcp \<br />  --port 443 \<br />  --source-group <SecurityGroupIdfBashionHostEC2></pre> | Arsitek cloud, Administrator Cloud | 

### Buat dan konfigurasikan fungsi indeks Lambda
<a name="create-and-configure-the-lam-index-function"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran eksekusi Lambda. | Jalankan perintah AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) untuk memberikan akses dan sumber daya fungsi indeks Lambda: Layanan AWS <pre>aws iam create-role \<br />  --role-name index-lambda-role \<br />  --assume-role-policy-document file://lambda_assume_role.json</pre>di mana `lambda_assume_role.json` adalah dokumen JSON yang memberikan `AssumeRole` izin ke fungsi Lambda, sebagai berikut:<pre>{<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />         {<br />             "Effect": "Allow",<br />             "Principal": {<br />                 "Service": "lambda.amazonaws.com"<br />               },<br />             "Action": "sts:AssumeRole"<br />         }<br />     ]<br /> }</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan terkelola ke peran Lambda. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan terkelola ke peran yang dibuat pada langkah sebelumnya. Kedua kebijakan ini memberikan izin peran untuk membuat elastic network interface dan menulis log ke CloudWatch Log.<pre>aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br /><br />aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole </pre> | Arsitek cloud, Administrator Cloud | 
| Buat kebijakan untuk memberikan izin fungsi indeks Lambda untuk membaca objek S3. | Jalankan perintah AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) untuk `s3:GetObject` memberikan izin fungsi indeks Lambda untuk membaca objek di bucket S3:<pre>aws iam create-policy \<br />  --policy-name s3-permission-policy \<br />  --policy-document file://s3-policy.json</pre>File tersebut `s3-policy.json` adalah dokumen JSON yang ditunjukkan di bawah ini yang memberikan `s3:GetObject` izin untuk memungkinkan akses baca ke objek S3. Jika Anda menggunakan nama yang berbeda saat membuat bucket S3, berikan nama bucket yang benar di `Resource ` bagian ini:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />           "Effect": "Allow",<br />           "Action": "s3:GetObject",<br />           "Resource": "arn:aws:s3:::<tenantrawdata>/*"<br />        }<br />    ]<br />}</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan izin Amazon S3 ke peran eksekusi Lambda. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan izin Amazon S3 yang Anda buat di langkah sebelumnya ke peran eksekusi Lambda:<pre>aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn <PolicyARN></pre>di `PolicyARN` mana Nama Sumber Daya Amazon (ARN) dari kebijakan izin Amazon S3. Anda bisa mendapatkan nilai ini dari output dari perintah sebelumnya. | Arsitek cloud, Administrator Cloud | 
| Buat fungsi indeks Lambda. | Jalankan perintah AWS CLI [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) untuk membuat fungsi indeks Lambda, yang akan mengakses Service: OpenSearch <pre>aws lambda create-function \<br />  --function-name index-lambda-function \<br />  --zip-file fileb://index_lambda_package.zip \<br />  --handler lambda_index.lambda_handler \<br />  --runtime python3.9 \<br />  --role "arn:aws:iam::account-id:role/index-lambda-role" \<br />  --timeout 30 \<br />  --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \<br />    \"SecurityGroupIds\": [\"<sg-1>\"]}"</pre> | Arsitek cloud, Administrator Cloud | 
| Izinkan Amazon S3 memanggil fungsi indeks Lambda. | Jalankan perintah AWS CLI [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) untuk memberi Amazon S3 izin untuk memanggil fungsi indeks Lambda:<pre>aws lambda add-permission \<br />  --function-name index-lambda-function \<br />  --statement-id s3-permissions \<br />  --action lambda:InvokeFunction \<br />  --principal s3.amazonaws.com \<br />  --source-arn "arn:aws:s3:::<tenantrawdata>" \<br />  --source-account "<account-id>" </pre> | Arsitek cloud, Administrator Cloud | 
| Tambahkan pemicu Lambda untuk acara Amazon S3. | Jalankan AWS CLI [put-bucket-notification-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-notification-configuration.html)perintah untuk mengirim notifikasi ke fungsi indeks Lambda saat peristiwa Amazon `ObjectCreated` S3 terdeteksi. Fungsi indeks berjalan setiap kali objek diunggah ke bucket S3. <pre>aws s3api put-bucket-notification-configuration \<br />  --bucket <tenantrawdata> \<br />  --notification-configuration file://s3-trigger.json</pre>File tersebut `s3-trigger.json` adalah dokumen JSON di folder saat ini yang menambahkan kebijakan sumber daya ke fungsi Lambda saat peristiwa Amazon `ObjectCreated` S3 terjadi. | Arsitek cloud, Administrator Cloud | 

### Buat dan konfigurasikan fungsi pencarian Lambda
<a name="create-and-configure-the-lam-search-function"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran eksekusi Lambda. | Jalankan perintah AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) untuk memberikan akses dan sumber daya fungsi pencarian Lambda: Layanan AWS <pre>aws iam create-role \<br />  --role-name search-lambda-role \<br />  --assume-role-policy-document file://lambda_assume_role.json</pre>di mana `lambda_assume_role.json` adalah dokumen JSON di folder saat ini yang memberikan `AssumeRole` izin ke fungsi Lambda, sebagai berikut:<pre>{<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />         {<br />             "Effect": "Allow",<br />             "Principal": {<br />                 "Service": "lambda.amazonaws.com"<br />               },<br />             "Action": "sts:AssumeRole"<br />         }<br />     ]<br /> }</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan terkelola ke peran Lambda. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan terkelola ke peran yang dibuat pada langkah sebelumnya. Kedua kebijakan ini memberikan izin peran untuk membuat elastic network interface dan menulis log ke CloudWatch Log.<pre>aws iam attach-role-policy \<br />  --role-name search-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br /><br />aws iam attach-role-policy \<br />  --role-name search-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole </pre> | Arsitek cloud, Administrator Cloud | 
| Buat fungsi pencarian Lambda. | Jalankan perintah AWS CLI [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) untuk membuat fungsi pencarian Lambda, yang akan mengakses Service: OpenSearch <pre>aws lambda create-function \<br />  --function-name search-lambda-function \<br />  --zip-file fileb://search_lambda_package.zip \<br />  --handler lambda_search.lambda_handler \<br />  --runtime python3.9 \<br />  --role "arn:aws:iam::account-id:role/search-lambda-role" \<br />  --timeout 30 \<br />  --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \<br />    \"SecurityGroupIds\": [\"<sg-1>\"]}"</pre> | Arsitek cloud, Administrator Cloud | 

### Buat dan konfigurasikan peran penyewa
<a name="create-and-configure-tenant-roles"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran IAM penyewa. | Jalankan perintah AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) untuk membuat dua peran penyewa yang akan digunakan untuk menguji fungsionalitas pencarian:<pre>aws iam create-role \<br />  --role-name Tenant-1-role \<br />  --assume-role-policy-document file://assume-role-policy.json</pre><pre>aws iam create-role \<br />  --role-name Tenant-2-role \<br />  --assume-role-policy-document file://assume-role-policy.json</pre>File tersebut `assume-role-policy.json` adalah dokumen JSON di folder saat ini yang memberikan `AssumeRole` izin untuk peran eksekusi Lambda:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Principal": {<br />                 "AWS": "<Lambda execution role for index function>",<br />                 "AWS": "<Lambda execution role for search function>"<br />             },<br />            "Action": "sts:AssumeRole"<br />        }<br />    ]<br />}</pre> | Arsitek cloud, Administrator Cloud | 
| Buat kebijakan IAM penyewa. | Jalankan perintah AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) untuk membuat kebijakan penyewa yang memberikan akses ke operasi Elasticsearch:<pre>aws iam create-policy \<br />  --policy-name tenant-policy \<br />  --policy-document file://policy.json</pre>File tersebut `policy.json` adalah dokumen JSON di folder saat ini yang memberikan izin di Elasticsearch:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": [<br />                "es:ESHttpDelete",<br />                "es:ESHttpGet",<br />                "es:ESHttpHead",<br />                "es:ESHttpPost",<br />                "es:ESHttpPut",<br />                "es:ESHttpPatch"<br />            ],<br />            "Resource": [<br />                "<ARN of Elasticsearch domain created earlier>"<br />            ]<br />        }<br />    ]<br />}</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan IAM penyewa ke peran penyewa. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan IAM penyewa ke dua peran penyewa yang Anda buat di langkah sebelumnya:<pre>aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/tenant-policy \<br />  --role-name Tenant-1-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/tenant-policy \<br />  --role-name Tenant-2-role</pre>Kebijakan ARN berasal dari output dari langkah sebelumnya. | Arsitek cloud, Administrator Cloud | 
| Buat kebijakan IAM untuk memberikan izin Lambda untuk mengambil peran. | Jalankan perintah AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) untuk membuat kebijakan bagi Lambda untuk mengambil peran penyewa:<pre>aws iam create-policy \<br />  --policy-name assume-tenant-role-policy \<br />  --policy-document file://lambda_policy.json</pre>File tersebut `lambda_policy.json` adalah dokumen JSON di folder saat ini yang memberikan izin untuk: `AssumeRole`<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />       {<br />            "Effect": "Allow",<br />            "Action":  "sts:AssumeRole",<br />            "Resource": "<ARN of tenant role created earlier>"<br />       }<br />    ]<br />}</pre>Untuk`Resource`, Anda dapat menggunakan karakter wildcard untuk menghindari pembuatan kebijakan baru untuk setiap penyewa. | Arsitek cloud, Administrator Cloud | 
| Buat kebijakan IAM untuk memberikan izin peran indeks Lambda untuk mengakses Amazon S3. | Jalankan perintah AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) untuk memberikan izin peran indeks Lambda untuk mengakses objek di bucket S3:<pre>aws iam create-policy \<br />  --policy-name s3-permission-policy \<br />  --policy-document file://s3_lambda_policy.json</pre>File tersebut `s3_lambda_policy.json` adalah dokumen kebijakan JSON berikut di folder saat ini:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": "s3:GetObject",<br />            "Resource": "arn:aws:s3:::tenantrawdata/*"<br />        }<br />    ]<br />}</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan ke peran eksekusi Lambda. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan yang dibuat pada langkah sebelumnya ke indeks Lambda dan peran eksekusi pencarian yang Anda buat sebelumnya:<pre>aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/assume-tenant-role-policy \<br />  --role-name index-lambda-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/assume-tenant-role-policy \<br />  --role-name search-lambda-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/s3-permission-policy \<br />  --role-name index-lambda-role</pre>Kebijakan ARN berasal dari output dari langkah sebelumnya. | Arsitek cloud, Administrator Cloud | 

### Membuat dan mengonfigurasi API penelusuran
<a name="create-and-configure-a-search-api"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat REST API di API Gateway. | Jalankan AWS CLI [create-rest-api](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/create-rest-api.html)perintah untuk membuat sumber daya REST API:<pre>aws apigateway create-rest-api \<br />  --name Test-Api \<br />  --endpoint-configuration "{ \"types\": [\"REGIONAL\"] }"</pre>Untuk jenis konfigurasi titik akhir, Anda dapat menentukan `EDGE` alih-alih `REGIONAL` menggunakan lokasi tepi, bukan lokasi tertentu Wilayah AWS.Perhatikan nilai `id` bidang dari output perintah. Ini adalah ID API yang akan Anda gunakan dalam perintah berikutnya. | Arsitek cloud, Administrator Cloud | 
| Buat sumber daya untuk API pencarian. | Sumber daya API pencarian memulai fungsi pencarian Lambda dengan nama sumber daya. `search` (Anda tidak perlu membuat API untuk fungsi indeks Lambda, karena ini berjalan secara otomatis saat objek diunggah ke bucket S3.)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | Arsitek cloud, Administrator Cloud | 
| Buat metode GET untuk API pencarian. | Jalankan perintah AWS CLI [put-method](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-method.html) untuk membuat `GET ` metode untuk API pencarian:<pre>aws apigateway put-method \<br />  --rest-api-id <API-ID> \<br />  --resource-id <ID from the previous command output> \<br />  --http-method GET \<br />  --authorization-type "NONE" \<br />  --no-api-key-required</pre>Untuk`resource-id`, tentukan ID dari output `create-resource` perintah. | Arsitek cloud, Administrator Cloud | 
| Buat respons metode untuk API penelusuran. | Jalankan AWS CLI [put-method-response](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-method-response.html)perintah untuk menambahkan respons metode untuk API pencarian:<pre>aws apigateway put-method-response \<br />  --rest-api-id <API-ID> \<br />  --resource-id  <ID from the create-resource command output> \<br />  --http-method GET \<br />  --status-code 200 \<br />  --response-models "{\"application/json\": \"Empty\"}"</pre>Untuk`resource-id`, tentukan ID dari output dari `create-resource` perintah sebelumnya. | Arsitek cloud, Administrator Cloud | 
| Siapkan integrasi Lambda proxy untuk API pencarian. | Jalankan perintah AWS CLI [put-integration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-integration.html) untuk mengatur integrasi dengan fungsi pencarian Lambda:<pre>aws apigateway put-integration \<br />  --rest-api-id <API-ID> \<br />  --resource-id  <ID from the create-resource command output> \<br />  --http-method GET \<br />  --type AWS_PROXY \<br />  --integration-http-method GET \<br />  --uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/arn:aws:lambda:<region>:<account-id>:function:<function-name>/invocations</pre>Untuk`resource-id`, tentukan ID dari `create-resource` perintah sebelumnya. | Arsitek cloud, Administrator Cloud | 
| Berikan izin API Gateway untuk memanggil fungsi pencarian Lambda. | Jalankan perintah AWS CLI [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) untuk memberikan izin API Gateway untuk menggunakan fungsi pencarian:<pre>aws lambda add-permission \<br />  --function-name <function-name> \<br />  --statement-id apigateway-get \<br />  --action lambda:InvokeFunction \<br />  --principal apigateway.amazonaws.com \<br />  --source-arn "arn:aws:execute-api:<region>:<account-id>:api-id/*/GET/search</pre>Ubah `source-arn` jalur jika Anda menggunakan nama sumber daya API yang berbeda, bukan`search`. | Arsitek cloud, Administrator Cloud | 
| Terapkan API pencarian. | Jalankan perintah AWS CLI [create-deployment](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/create-deployment.html) untuk membuat sumber daya panggung bernama: `dev`<pre>aws apigateway create-deployment \<br />  --rest-api-id <API-ID> \<br />  --stage-name dev</pre>Jika Anda memperbarui API, Anda dapat menggunakan AWS CLI perintah yang sama untuk menerapkannya kembali ke tahap yang sama. | Arsitek cloud, Administrator Cloud | 

### Buat dan konfigurasikan peran Kibana
<a name="create-and-configure-kibana-roles"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Masuk ke konsol Kibana. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | Arsitek cloud, Administrator Cloud | 
| Buat dan konfigurasikan peran Kibana. | Untuk memberikan isolasi data dan memastikan bahwa satu penyewa tidak dapat mengambil data penyewa lain, Anda perlu menggunakan keamanan dokumen, yang memungkinkan penyewa untuk mengakses hanya dokumen yang berisi ID penyewa mereka.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | Arsitek cloud, Administrator Cloud | 
| Memetakan pengguna ke peran. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)Kami menyarankan Anda mengotomatiskan pembuatan peran penyewa dan Kibana pada saat orientasi penyewa. | Arsitek cloud, Administrator Cloud | 
| Buat indeks data penyewa. | Di panel navigasi, di bawah **Manajemen**, pilih **Alat Pengembang**, lalu jalankan perintah berikut. Perintah ini membuat `tenant-data` indeks untuk menentukan pemetaan untuk `TenantId` properti.<pre>PUT /tenant-data<br />{<br />  "mappings": {<br />    "properties": {<br />      "TenantId": { "type": "keyword"}<br />    }<br />  }<br />}</pre> | Arsitek cloud, Administrator Cloud | 

### Buat titik akhir VPC untuk Amazon S3 dan AWS STS
<a name="create-vpc-endpoints-for-s3-and-sts"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat titik akhir VPC untuk Amazon S3. | Jalankan AWS CLI [create-vpc-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-vpc-endpoint.html)perintah untuk membuat titik akhir VPC untuk Amazon S3. Titik akhir memungkinkan fungsi indeks Lambda di VPC untuk mengakses Amazon S3.<pre>aws ec2 create-vpc-endpoint \<br />  --vpc-id <VPC-ID> \<br />  --service-name com.amazonaws.us-east-1.s3 \<br />  --route-table-ids <route-table-ID></pre>Untuk`vpc-id`, tentukan VPC yang Anda gunakan untuk fungsi indeks Lambda. Untuk`service-name`, gunakan URL yang benar untuk titik akhir Amazon S3. Untuk`route-table-ids`, tentukan tabel rute yang terkait dengan titik akhir VPC. | Arsitek cloud, Administrator Cloud | 
| Buat titik akhir VPC untuk. AWS STS | Jalankan AWS CLI [create-vpc-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-vpc-endpoint.html)perintah untuk membuat titik akhir VPC untuk AWS Security Token Service ().AWS STS Titik akhir memungkinkan indeks Lambda dan fungsi pencarian di VPC untuk mengakses. AWS STS Fungsi digunakan AWS STS ketika mereka mengambil peran IAM.<pre>aws ec2 create-vpc-endpoint \<br />  --vpc-id <VPC-ID> \<br />  --vpc-endpoint-type Interface \<br />  --service-name com.amazonaws.us-east-1.sts \<br />  --subnet-id <subnet-ID> \<br />  --security-group-id <security-group-ID></pre>Untuk`vpc-id`, tentukan VPC yang Anda gunakan untuk indeks Lambda dan fungsi pencarian. Untuk`subnet-id`, berikan subnet di mana titik akhir ini harus dibuat. Untuk`security-group-id`, tentukan grup keamanan untuk mengaitkan titik akhir ini dengan. (Ini bisa sama dengan kelompok keamanan yang digunakan Lambda.) | Arsitek cloud, Administrator Cloud | 

### Uji multi-tenancy dan isolasi data
<a name="test-multi-tenancy-and-data-isolation"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Perbarui file Python untuk fungsi indeks dan pencarian. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)Anda bisa mendapatkan titik akhir Elasticsearch dari tab **Ikhtisar** konsol Layanan. OpenSearch Ini memiliki format`<AWS-Region>.es.amazonaws.com`. | Arsitek cloud, Pengembang aplikasi | 
| Perbarui kode Lambda. | Gunakan AWS CLI [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah untuk memperbarui kode Lambda dengan perubahan yang Anda buat pada file Python:<pre>aws lambda update-function-code \<br />  --function-name index-lambda-function \<br />  --zip-file fileb://index_lambda_package.zip<br /><br />aws lambda update-function-code \<br />  --function-name search-lambda-function \<br />  --zip-file fileb://search_lambda_package.zip</pre> | Arsitek cloud, Pengembang aplikasi | 
| Unggah data mentah ke bucket S3. | Gunakan perintah AWS CLI [cp](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html) untuk mengunggah data objek Tenant-1 dan Tenant-2 ke `tenantrawdata` bucket (tentukan nama bucket S3 yang Anda buat untuk tujuan ini):<pre>aws s3 cp tenant-1-data s3://tenantrawdata<br />aws s3 cp tenant-2-data s3://tenantrawdata</pre>Bucket S3 diatur untuk menjalankan fungsi indeks Lambda setiap kali data diunggah sehingga dokumen diindeks di Elasticsearch. | Arsitek cloud, Administrator Cloud | 
| Cari data dari konsol Kibana. | Di konsol Kibana, jalankan kueri berikut:<pre>GET tenant-data/_search</pre>Kueri ini menampilkan semua dokumen yang diindeks di Elasticsearch. Dalam hal ini, Anda akan melihat dua dokumen terpisah untuk Tenant-1 dan Tenant-2. | Arsitek cloud, Administrator Cloud | 
| Uji API pencarian dari API Gateway. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)Untuk ilustrasi layar, lihat bagian [Informasi tambahan](#build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional). | Arsitek cloud, Pengembang aplikasi | 
| Pembersihan sumber daya  | Bersihkan semua sumber daya yang Anda buat untuk mencegah biaya tambahan ke akun Anda. | AWS DevOps, arsitek Cloud, Administrator Cloud | 

## Sumber daya terkait
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-resources"></a>
+ [AWS SDK for Python (Boto)](https://aws.amazon.com/sdk-for-python/)
+ [AWS Lambda dokumentasi](https://docs.aws.amazon.com/lambda/)
+ [Dokumentasi API Gateway](https://docs.aws.amazon.com/apigateway/)
+ [Dokumentasi Amazon S3](https://docs.aws.amazon.com/s3/)
+ [Dokumentasi OpenSearch Layanan Amazon](https://docs.aws.amazon.com/elasticsearch-service/)
  + [Kontrol akses berbutir halus di Layanan Amazon OpenSearch ](https://docs.amazonaws.cn/en_us/elasticsearch-service/latest/developerguide/fgac.html)
  + [Membuat aplikasi pencarian dengan Amazon OpenSearch Service](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/search-example.html)
  + [Meluncurkan domain OpenSearch Layanan Amazon Anda dalam VPC](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html)

## Informasi tambahan
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional"></a>

**Model partisi data**

Ada tiga model partisi data umum yang digunakan dalam sistem multi-tenant: silo, pool, dan hybrid. Model yang Anda pilih tergantung pada kepatuhan, tetangga yang bising, operasi, dan kebutuhan isolasi lingkungan Anda.

*Model silo*

Dalam model silo, setiap data penyewa disimpan di area penyimpanan yang berbeda di mana tidak ada percampuran data penyewa. Anda dapat menggunakan dua pendekatan untuk mengimplementasikan model silo dengan OpenSearch Layanan: domain per penyewa dan indeks per penyewa.
+ **Domain per penyewa** — Anda dapat menggunakan domain OpenSearch Layanan terpisah (identik dengan cluster Elasticsearch) per penyewa. Menempatkan setiap penyewa di domainnya sendiri memberikan semua manfaat yang terkait dengan memiliki data dalam konstruksi mandiri. Namun, pendekatan ini memperkenalkan tantangan manajemen dan kelincahan. Sifatnya yang terdistribusi membuat lebih sulit untuk mengumpulkan dan menilai kesehatan operasional dan aktivitas penyewa. Ini adalah opsi mahal yang mengharuskan setiap domain OpenSearch Layanan memiliki tiga node master dan dua node data untuk beban kerja produksi seminimal mungkin.

![\[Domain per model silo penyewa untuk arsitektur tanpa server multi-tenant.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/c2195f82-e5ed-40bb-b76a-3b0210bf1254.png)


 
+ **Indeks per penyewa** — Anda dapat menempatkan data penyewa dalam indeks terpisah dalam kluster Layanan. OpenSearch Dengan pendekatan ini, Anda menggunakan pengenal penyewa saat membuat dan memberi nama indeks, dengan mengawali pengenal penyewa ke nama indeks. Pendekatan indeks per penyewa membantu Anda mencapai tujuan silo Anda tanpa memperkenalkan cluster yang benar-benar terpisah untuk setiap penyewa. Namun, Anda mungkin mengalami tekanan memori jika jumlah indeks bertambah, karena pendekatan ini membutuhkan lebih banyak pecahan, dan node master harus menangani lebih banyak alokasi dan penyeimbangan kembali.

![\[Indeks per model silo penyewa untuk arsitektur tanpa server multi-tenant.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/354a9463-25bb-422b-84de-d4875a7c8ea2.png)


 

**Isolasi dalam model silo** — Dalam model silo, Anda menggunakan kebijakan IAM untuk mengisolasi domain atau indeks yang menyimpan data setiap penyewa. Kebijakan ini mencegah satu penyewa mengakses data penyewa lain. Untuk menerapkan model isolasi silo, Anda dapat membuat kebijakan berbasis sumber daya yang mengontrol akses ke sumber daya penyewa Anda. Ini sering merupakan kebijakan akses domain yang menentukan tindakan mana yang dapat dilakukan prinsipal pada sub-sumber daya domain, termasuk indeks Elasticsearch dan. APIs Dengan kebijakan berbasis identitas IAM, Anda dapat menentukan tindakan yang *diizinkan* atau *ditolak* pada domain, indeks, atau dalam Layanan. APIs OpenSearch `Action`Elemen kebijakan IAM menjelaskan tindakan atau tindakan spesifik yang diizinkan atau ditolak oleh kebijakan, dan `Principal ` elemen tersebut menentukan akun, pengguna, atau peran yang terpengaruh.

Kebijakan contoh berikut memberikan akses penuh Penyewa-1 (seperti yang ditentukan oleh`es:*`) ke sub-sumber daya pada domain saja. `tenant-1` Bagian tambahan `/*` dalam `Resource` elemen menunjukkan bahwa kebijakan ini berlaku untuk sub-sumber daya domain, bukan untuk domain itu sendiri. Ketika kebijakan ini berlaku, penyewa tidak diizinkan untuk membuat domain baru atau mengubah setelan pada domain yang sudah ada.

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

Untuk mengimplementasikan model silo penyewa per indeks, Anda perlu memodifikasi kebijakan sampel ini untuk lebih membatasi Penyewa-1 ke indeks atau indeks yang ditentukan, dengan menentukan nama indeks. Kebijakan sampel berikut membatasi Penyewa-1 ke indeks. `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/*"
      }
   ]
}
```

*Model kolam*

Dalam model pool, semua data penyewa disimpan dalam indeks dalam domain yang sama. Pengenal penyewa disertakan dalam data (dokumen) dan digunakan sebagai kunci partisi, sehingga Anda dapat menentukan data mana yang menjadi milik penyewa mana. Model ini mengurangi overhead manajemen. Mengoperasikan dan mengelola indeks gabungan lebih mudah dan lebih efisien daripada mengelola beberapa indeks. Namun, karena data penyewa bercampur dalam indeks yang sama, Anda kehilangan isolasi penyewa alami yang disediakan oleh model silo. Pendekatan ini mungkin juga menurunkan kinerja karena efek tetangga yang bising.

![\[Model kolam untuk arsitektur tanpa server multi-tenant.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/c2c3bb0f-6ccd-47a7-ab67-e7f3f8c7f289.png)


 

**Isolasi penyewa dalam model kolam** — Secara umum, isolasi penyewa menantang untuk diterapkan dalam model kolam renang. Mekanisme IAM yang digunakan dengan model silo tidak memungkinkan Anda untuk menggambarkan isolasi berdasarkan ID penyewa yang disimpan dalam dokumen Anda.

Pendekatan alternatif adalah dengan menggunakan dukungan [kontrol akses halus](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/fgac.html) (FGAC) yang disediakan oleh Open Distro untuk Elasticsearch. FGAC memungkinkan Anda mengontrol izin pada tingkat indeks, dokumen, atau bidang. Dengan setiap permintaan, FGAC mengevaluasi kredensi pengguna dan mengautentikasi pengguna atau menolak akses. Jika FGAC mengautentikasi pengguna, FGAC mengambil semua peran yang dipetakan ke pengguna tersebut dan menggunakan set lengkap izin untuk menentukan cara menangani permintaan. 

Untuk mencapai isolasi yang diperlukan dalam model gabungan, Anda dapat menggunakan [keamanan tingkat dokumen](https://opendistro.github.io/for-elasticsearch-docs/docs/security/access-control/document-level-security/), yang memungkinkan Anda membatasi peran pada subset dokumen dalam indeks. Peran contoh berikut membatasi kueri ke Penyewa-1. Dengan menerapkan peran ini ke Penyewa-1, Anda dapat mencapai isolasi yang diperlukan. 

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

*Model hibrida*

Model hibrida menggunakan kombinasi model silo dan kolam renang di lingkungan yang sama untuk menawarkan pengalaman unik untuk setiap tingkat penyewa (seperti tingkatan gratis, standar, dan premium). Setiap tingkatan mengikuti profil keamanan yang sama yang digunakan dalam model pool.

 

![\[Model hybrid untuk arsitektur tanpa server multi-tenant.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/e7def98a-38ef-435a-9881-7e95ae4d4940.png)


**Isolasi penyewa dalam model hybrid** — Dalam model hybrid, Anda mengikuti profil keamanan yang sama seperti pada model pool, di mana menggunakan model keamanan FGAC pada tingkat dokumen menyediakan isolasi penyewa. Meskipun strategi ini menyederhanakan manajemen cluster dan menawarkan kelincahan, ini memperumit aspek lain dari arsitektur. Misalnya, kode Anda memerlukan kompleksitas tambahan untuk menentukan model mana yang terkait dengan setiap penyewa. Anda juga harus memastikan bahwa kueri penyewa tunggal tidak memenuhi seluruh domain dan menurunkan pengalaman untuk penyewa lain. 

**Pengujian di API Gateway**

*Jendela uji untuk kueri Penyewa-1*

![\[Jendela uji untuk kueri Penyewa-1.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/a6757d3f-977a-4ecc-90cb-83ab7f1c3588.png)


*Jendela uji untuk kueri Penyewa-2*

 

![\[Jendela uji untuk kueri Penyewa-2.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/31bfd656-33ca-4750-b6e6-da4d703c2071.png)


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

[Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip](samples/p-attach/750196bb-03f6-4b6e-92cd-eb7141602547/attachments/attachment.zip)