Membangun arsitektur tanpa server multi-tenant di Amazon Service OpenSearch - AWS Prescriptive Guidance

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

Tabby Ward dan Nisha Gambhir, Amazon Web Services

Ringkasan

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.

Prasyarat dan batasan

Prasyarat

  • Aktif Akun AWS

  • AWS Command Line Interface (AWS CLI) versi 2.x, diinstal dan dikonfigurasi di macOS, Linux, atau Windows

  • Python versi 3.9

  • pip3 — 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

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

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.

Otomatisasi dan skala

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

Alat

Layanan AWS

  • AWS CLIadalah alat terpadu untuk mengelola Layanan AWS dan sumber daya dengan menggunakan perintah di shell baris perintah Anda.

  • 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 adalah Layanan AWS untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs pada skala apa pun.

  • Amazon S3 adalah layanan penyimpanan objek yang memungkinkan Anda menyimpan dan mengambil sejumlah informasi kapan saja, dari mana saja di web.

  • OpenSearch Layanan adalah layanan 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 (\) Unix di akhir setiap baris dengan tanda sisipan (^).

catatan

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

Epik

TugasDeskripsiKeterampilan 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 AWS

Untuk membuat bucket S3, Anda dapat menggunakan perintah AWS CLI create-bucket sebagai berikut:

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

di tenantrawdata mana nama bucket S3. (Anda dapat menggunakan nama unik apa pun yang mengikuti pedoman penamaan bucket.)

Arsitek cloud, Administrator Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Buat domain OpenSearch Layanan.

Jalankan AWS CLI create-elasticsearch-domainperintah untuk membuat domain OpenSearch Layanan:

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

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

Ketika host bastion telah disiapkan, dan Anda memiliki grup keamanan yang terkait dengan instance yang tersedia, gunakan AWS CLI authorize-security-group-ingressperintah untuk menambahkan izin ke grup keamanan Elasticsearch untuk mengizinkan port 443 dari grup keamanan Amazon EC2 (bastion host).

aws ec2 authorize-security-group-ingress \ --group-id <SecurityGroupIdfElasticSearch> \ --protocol tcp \ --port 443 \ --source-group <SecurityGroupIdfBashionHostEC2>
Arsitek cloud, Administrator Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Buat peran eksekusi Lambda.

Jalankan perintah AWS CLI create-role untuk memberikan akses dan sumber daya fungsi indeks Lambda: Layanan AWS

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

di mana lambda_assume_role.json adalah dokumen JSON yang memberikan AssumeRole izin ke fungsi Lambda, sebagai berikut:

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

Lampirkan kebijakan terkelola ke peran Lambda.

Jalankan AWS CLI attach-role-policyperintah 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.

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
Arsitek cloud, Administrator Cloud

Buat kebijakan untuk memberikan izin fungsi indeks Lambda untuk membaca objek S3.

Jalankan perintah AWS CLI create-policy untuk s3:GetObject memberikan izin fungsi indeks Lambda untuk membaca objek di bucket S3:

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

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:

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

Lampirkan kebijakan izin Amazon S3 ke peran eksekusi Lambda.

Jalankan AWS CLI attach-role-policyperintah untuk melampirkan kebijakan izin Amazon S3 yang Anda buat di langkah sebelumnya ke peran eksekusi Lambda:

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

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 untuk membuat fungsi indeks Lambda, yang akan mengakses 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.9 \ --role "arn:aws:iam::account-id:role/index-lambda-role" \ --timeout 30 \ --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \ \"SecurityGroupIds\": [\"<sg-1>\"]}"
Arsitek cloud, Administrator Cloud

Izinkan Amazon S3 memanggil fungsi indeks Lambda.

Jalankan perintah AWS CLI add-permission untuk memberi Amazon S3 izin untuk memanggil fungsi indeks 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>"
Arsitek cloud, Administrator Cloud

Tambahkan pemicu Lambda untuk acara Amazon S3.

Jalankan AWS CLI put-bucket-notification-configurationperintah untuk mengirim notifikasi ke fungsi indeks Lambda saat peristiwa Amazon ObjectCreated S3 terdeteksi. Fungsi indeks berjalan setiap kali objek diunggah ke bucket S3. 

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

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
TugasDeskripsiKeterampilan yang dibutuhkan

Buat peran eksekusi Lambda.

Jalankan perintah AWS CLI create-role untuk memberikan akses dan sumber daya fungsi pencarian Lambda: Layanan AWS

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

di mana lambda_assume_role.json adalah dokumen JSON di folder saat ini yang memberikan AssumeRole izin ke fungsi Lambda, sebagai berikut:

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

Lampirkan kebijakan terkelola ke peran Lambda.

Jalankan AWS CLI attach-role-policyperintah 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.

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
Arsitek cloud, Administrator Cloud

Buat fungsi pencarian Lambda.

Jalankan perintah AWS CLI create-function untuk membuat fungsi pencarian Lambda, yang akan mengakses 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.9 \ --role "arn:aws:iam::account-id:role/search-lambda-role" \ --timeout 30 \ --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \ \"SecurityGroupIds\": [\"<sg-1>\"]}"
Arsitek cloud, Administrator Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Buat peran IAM penyewa.

Jalankan perintah AWS CLI create-role untuk membuat dua peran penyewa yang akan digunakan untuk menguji fungsionalitas pencarian:

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

File tersebut assume-role-policy.json adalah dokumen JSON di folder saat ini yang memberikan AssumeRole izin untuk peran eksekusi 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" } ] }
Arsitek cloud, Administrator Cloud

Buat kebijakan IAM penyewa.

Jalankan perintah AWS CLI create-policy untuk membuat kebijakan penyewa yang memberikan akses ke operasi Elasticsearch:

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

File tersebut policy.json adalah dokumen JSON di folder saat ini yang memberikan izin di 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>" ] } ] }
Arsitek cloud, Administrator Cloud

Lampirkan kebijakan IAM penyewa ke peran penyewa.

Jalankan AWS CLI attach-role-policyperintah untuk melampirkan kebijakan IAM penyewa ke dua peran penyewa yang Anda buat di langkah sebelumnya:

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

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 untuk membuat kebijakan bagi Lambda untuk mengambil peran penyewa:

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

File tersebut lambda_policy.json adalah dokumen JSON di folder saat ini yang memberikan izin untuk: AssumeRole

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

UntukResource, 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 untuk memberikan izin peran indeks Lambda untuk mengakses objek di bucket S3:

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

File tersebut s3_lambda_policy.json adalah dokumen kebijakan JSON berikut di folder saat ini:

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

Lampirkan kebijakan ke peran eksekusi Lambda.

Jalankan AWS CLI attach-role-policyperintah untuk melampirkan kebijakan yang dibuat pada langkah sebelumnya ke indeks Lambda dan peran eksekusi pencarian yang Anda buat sebelumnya:

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

Kebijakan ARN berasal dari output dari langkah sebelumnya.

Arsitek cloud, Administrator Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Buat REST API di API Gateway.

Jalankan AWS CLI create-rest-apiperintah untuk membuat sumber daya REST API:

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

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

  1. Jalankan perintah AWS CLI get-resources untuk mendapatkan ID induk untuk jalur root:

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

    Perhatikan nilai bidang ID. Anda akan menggunakan ID induk ini di perintah berikutnya.

    { "items": [ { "id": "zpsri964ck", "path": "/" } ] }
  2. Jalankan perintah AWS CLI create-resource untuk membuat resource untuk API pencarian. Untukparent-id, tentukan ID dari perintah sebelumnya.

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

Buat metode GET untuk API pencarian.

Jalankan perintah AWS CLI put-method untuk membuat GET  metode untuk API pencarian:

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

Untukresource-id, tentukan ID dari output create-resource perintah.

Arsitek cloud, Administrator Cloud

Buat respons metode untuk API penelusuran.

Jalankan AWS CLI put-method-responseperintah untuk menambahkan respons metode untuk API pencarian:

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

Untukresource-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 untuk mengatur integrasi dengan fungsi pencarian 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

Untukresource-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 untuk memberikan izin API Gateway untuk menggunakan fungsi pencarian:

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

Ubah source-arn jalur jika Anda menggunakan nama sumber daya API yang berbeda, bukansearch.

Arsitek cloud, Administrator Cloud

Terapkan API pencarian.

Jalankan perintah AWS CLI create-deployment untuk membuat sumber daya panggung bernama: dev

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

Jika Anda memperbarui API, Anda dapat menggunakan AWS CLI perintah yang sama untuk menerapkannya kembali ke tahap yang sama.

Arsitek cloud, Administrator Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Masuk ke konsol Kibana.

  1. Temukan tautan ke Kibana di dasbor domain Anda di konsol OpenSearch Layanan. URL dalam bentuk:<domain-endpoint>/_plugin/kibana/.

  2. Gunakan host bastion yang Anda konfigurasikan di epik pertama untuk mengakses konsol Kibana.

  3. Masuk ke konsol Kibana dengan menggunakan nama pengguna dan kata sandi master dari langkah sebelumnya, saat Anda membuat domain OpenSearch Layanan.

  4. Ketika diminta untuk memilih penyewa, pilih Pribadi.

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.

  1. Di konsol Kibana, di panel navigasi, pilih Keamanan, Peran.

  2. Buat peran penyewa baru.

  3. Setel izin cluster keindices_all, yang memberikan izin buat, baca, perbarui, dan hapus (CRUD) pada indeks Layanan. OpenSearch  

  4. Batasi izin indeks ke indeks. tenant-data (Nama indeks harus cocok dengan nama dalam fungsi pencarian dan indeks Lambda.) 

  5. Tetapkan izin indeks keindices_all, untuk memungkinkan pengguna melakukan semua operasi terkait indeks. (Anda dapat membatasi operasi untuk akses yang lebih terperinci, tergantung pada kebutuhan Anda.)

  6. Untuk keamanan tingkat dokumen, gunakan kebijakan berikut untuk memfilter dokumen berdasarkan ID penyewa, untuk menyediakan isolasi data bagi penyewa dalam indeks bersama:

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

    Nama indeks, properti, dan nilai peka huruf besar/kecil.

Arsitek cloud, Administrator Cloud

Memetakan pengguna ke peran.

  1. Pilih tab Pengguna yang dipetakan untuk peran tersebut, lalu pilih Pengguna peta.

  2. Di bagian peran Backend, tentukan ARN dari peran penyewa IAM yang Anda buat sebelumnya, lalu pilih Peta. Ini memetakan peran penyewa IAM ke peran Kibana sehingga pencarian khusus penyewa mengembalikan data untuk penyewa itu saja. Misalnya, jika nama peran IAM untuk Penyewa-1 adalahTenant-1-Role, tentukan ARN untuk Tenant-1-Role (dari epik Buat dan konfigurasikan peran penyewa) di kotak peran Backend untuk peran Penyewa-1 Kibana.

  3. Ulangi langkah 1 dan 2 untuk Penyewa-2.

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.

PUT /tenant-data { "mappings": { "properties": { "TenantId": { "type": "keyword"} } } }
Arsitek cloud, Administrator Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Buat titik akhir VPC untuk Amazon S3.

Jalankan AWS CLI create-vpc-endpointperintah untuk membuat titik akhir VPC untuk Amazon S3. Titik akhir memungkinkan fungsi indeks Lambda di VPC untuk mengakses 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>

Untukvpc-id, tentukan VPC yang Anda gunakan untuk fungsi indeks Lambda. Untukservice-name, gunakan URL yang benar untuk titik akhir Amazon S3. Untukroute-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-endpointperintah 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.

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>

Untukvpc-id, tentukan VPC yang Anda gunakan untuk indeks Lambda dan fungsi pencarian. Untuksubnet-id, berikan subnet di mana titik akhir ini harus dibuat. Untuksecurity-group-id, tentukan grup keamanan untuk mengaitkan titik akhir ini dengan. (Ini bisa sama dengan kelompok keamanan yang digunakan Lambda.)

Arsitek cloud, Administrator Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Perbarui file Python untuk fungsi indeks dan pencarian.

  1. Dalam index_lambda_package.zip file, edit  lamba_index.py file untuk memperbarui Akun AWS ID, Wilayah AWS, dan informasi titik akhir Elasticsearch.

  2. Dalam search_lambda_package.zip file, edit lambda_search.py file untuk memperbarui Akun AWS ID, Wilayah AWS, dan informasi titik akhir Elasticsearch.

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-codeperintah untuk memperbarui kode Lambda dengan perubahan yang Anda buat pada 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
Arsitek cloud, Pengembang aplikasi

Unggah data mentah ke bucket S3.

Gunakan perintah AWS CLI cp untuk mengunggah data objek Tenant-1 dan Tenant-2 ke tenantrawdata bucket (tentukan nama bucket S3 yang Anda buat untuk tujuan ini):

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

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:

GET tenant-data/_search

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.

  1. Di konsol API Gateway, buka API pencarian, pilih GET metode di dalam sumber penelusuran, lalu pilih Uji.

  2. Di jendela pengujian, berikan string kueri berikut (peka huruf besar/kecil) untuk ID penyewa, lalu pilih Uji.

    TenantId=Tenant-1

    Fungsi Lambda mengirimkan kueri ke OpenSearch Layanan yang memfilter dokumen penyewa berdasarkan keamanan tingkat dokumen. Metode mengembalikan dokumen milik Tenant-1.

  3. Ubah string kueri menjadi:

    TenantId=Tenant-2

    Query ini mengembalikan dokumen milik Tenant-2.

Untuk ilustrasi layar, lihat bagian Informasi tambahan.

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

Informasi tambahan

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.

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

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 ActionElemen 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 olehes:*) 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.

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 (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, 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.

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.

Jendela uji untuk kueri Penyewa-2

Jendela uji untuk kueri Penyewa-2.

Lampiran

Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip