在 Amazon 服務中建立多租戶無伺服器架構 OpenSearch - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Amazon 服務中建立多租戶無伺服器架構 OpenSearch

由虎斑病房(AWS)和尼莎甘比希爾(AWS)創建

環境:PoC 或試點

技術:現代化、SaaS、無伺服器

工作負載:開源

AWS 服務:Amazon OpenSearch 服務;AWS Lambda;Amazon S3;Amazon API Gateway

Summary

Amazon OpenSearch 服務是一種受管服務,可讓您輕鬆部署、操作和擴展 Elasticsearch,這是一種熱門的開放原始碼搜尋和分析引擎。Amazon Ser OpenSearch vice 提供自由文字搜尋以及近乎即時的擷取和儀表板,以供串流資料 (例如日誌和指標) 使用。

軟體即服務 (SaaS) 供應商經常使用 Amazon Ser OpenSearch vice 來解決各種使用案例,例如以可擴展且安全的方式取得客戶洞察,同時減少複雜性和停機時間。

在多租戶環境中使用 Amazon Ser OpenSearch vice 會引入一系列考量,這些考量會影響 SaaS 解決方案的分割、隔離、部署和管理。SaaS 提供者必須考慮如何在不斷變化的工作負載的情況下,有效地擴展其 Elasticsearch 叢集。他們還需要考慮分層和嘈雜的鄰居條件如何影響其分區模型。

此模式會檢閱使用 Elasticsearch 建構來表示和隔離租用戶資料的模型。此外,該模式著重於簡單的無伺服器參考架構作為範例,以示範在多租戶環境中使用 Amazon Ser OpenSearch vice 進行索引和搜尋。它實作集區資料分割模型,該模型會在所有租用戶之間共用相同的索引,同時維護租用戶的資料隔離。此模式使用以下 Amazon Web Services(AWS)服務:Amazon API Gateway,AWS Lambda,Amazon Simple Storage Service (Amazon S3) 和 Amazon OpenSearch 服務。

需集區模型和其他資料分割模型的詳細資訊,請參閱其他資訊一節。

先決條件和限制

先決條件

  • 有效的 AWS 帳戶

  • AWS Command Line Interface (AWS CLI) (AWS CLI) 2.x 版,已在 macOS、Linux 或視窗上安裝和設定

  • Python 版本 3.7

  • pip3 — Python 原始程式碼是以 .zip 檔案形式提供,以便部署在 Lambda 函數中。如果您想要在本機使用程式碼或自訂程式碼,請依照下列步驟開發並重新編譯原始程式碼:

    1. 在與 Python 腳本相同的目錄中運行以下命令來生成requirements.txt文件:pip3 freeze > requirements.txt

    2. 安裝依賴關係:pip3 install -r requirements.txt

限制

  • 此代碼以 Python 運行,目前不支持其他編程語言。 

  • 範例應用程式不包含 AWS 跨區域或災難復原 (DR) 支援。 

  • 此模式僅用於演示目的。它不打算在生產環境中使用。

架構

下圖說明此模式的高階架構。該架構包括以下內容:

  • AWS Lambda 可為內容建立索引和查詢 

  • Amazon OpenSearch 服務執行搜索 

  • Amazon API Gateway 提供與用戶的 API 交互

  • 用於存放原始 (非索引) 資料的 Amazon S3

  • Amazon CloudWatch 監控日誌

  • AWS Identity and Access Management (IAM) 可建立租用戶角色和政策

高階多租用戶無伺服器架構

自動化和規模

為了簡單起見,該模式使用 AWS CLI 佈建基礎設施和部署範例程式碼。您可以建立 AWS CloudFormation 範本或 AWS Cloud Development Kit (AWS CDK) 指令碼來自動化模式。

工具

AWS 服務

  • AWS CLI — AWS Command Line Interface (AWS CLI) (AWS CLI) 是一種統一的工具,可在命令列殼層中使用命令來管理 AWS 服務和資源。

  • AWS Lambda — AWS Lambda 是一種運算服務,可讓您執行程式碼,而無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼,可自動從每天數項請求擴展成每秒數千項請求。

  • Amazon API Gateway — Amazon API Gateway 是一種 AWS 服務,用於建立、發佈、維護、監控和保護任何規模的 REST、HTTP 和 WebSocket API。

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) 是一種物件儲存服務,可讓您隨時從 Web 上的任何位置存放和擷取任意數量的資訊。

  • Amazon OpenSearch 服務 — Amazon 服 OpenSearch 務是一項全受管服務,可讓您輕鬆地以符合成本效益的方式大規模部署、保護和執行 Elasticsearch。

Code

附件提供此病毒碼的範例檔案。其中包含:

  • index_lambda_package.zip— Lambda 函數,用於使用集區模型在 Amazon OpenSearch 服務中索引資料。

  • search_lambda_package.zip-Lambda 函數用於搜索 Amazon OpenSearch 服務中的數據。

  • Tenant-1-data— 承租人 1 的原始 (非索引) 資料範例。

  • Tenant-2-data— 承租人 2 的原始 (非索引) 資料範例。

重要事項:此模式中的故事包括針對 Unix、Linux 和 macOS 進行格式化的 CLI 命令範例。用於 Windows 時,請以插入號 (^) 取代每一行結尾處的 Unix 接續字元斜線 (\)。

史诗

任務描述所需技能

建立 S3 儲存貯體。

在您的 AWS 區域中建立 S3 儲存貯體。此儲存貯體會保留範例應用程式的非索引租用戶資料。請確定 S3 儲存貯體的名稱是全域唯一的,因為該命名空間是由所有 AWS 帳戶共用的。

若要建立 S3 儲存貯體,您可以使用 AWS CLI 建立儲存貯體命令,如下所示:

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

其中tenantrawdata是 S3 儲存貯體名稱。(您可以使用任何遵循值區命名準則的唯一名稱。)

雲端架構師、雲端管理員
任務描述所需技能

創建一個 Amazon OpenSearch 服務域。

執行 AWS CLI create-elasticsearch-domain命令以建立 Amazon OpenSearch 服務網域:

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

執行個體計數設定為 1,因為網域是用於測試目的。您必須使用advanced-security-options參數來啟用精細的存取控制,因為在建立網域之後就無法變更詳細資料。 

此命令會建立主要使用者名稱 (KibanaUser) 和密碼,以便您用來登入 Kibana 主控台。

由於網域是虛擬私有雲 (VPC) 的一部分,因此您必須確定可以透過指定要使用的存取原則來存取 Elasticsearch 執行個體。

如需詳細資訊,請參閱 AWS 文件中的使用 VPC 啟動 Amazon OpenSearch 服務網域

雲端架構師、雲端管理員

設定防禦主機。

將亞馬遜彈性運算雲端 (Amazon EC2) Windows 執行個體設定為防禦主機,以存取 Kibana 主控台。彈性搜尋安全群組必須允許來自 Amazon EC2 安全群組的流量。如需指示,請參閱使用防禦伺服器控制 EC2 執行個體的網路存取部落格文章。

當防禦主機已設定完成,且您擁有與執行個體相關聯的安全群組時,請使用 AWS CLI authorize-security-group-ingress命令向 Elasticsearch 安全群組新增許可,以允許來自 Amazon EC2 (堡壘主機) 安全群組的連接埠 443。

aws ec2 authorize-security-group-ingress \ --group-id <SecurityGroupIdfElasticSearch> \ --protocol tcp \ --port 443 \ --source-group <SecurityGroupIdfBashionHostEC2>
雲端架構師、雲端管理員
任務描述所需技能

建立 Lambda 執行角色。

執行 AWS CLI 建立角色命令以授與 Lambda 索引函數存取 AWS 服務和資源:

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

其中lambda_assume_role.json是目前資料夾中的 JSON 文件,可授與 Lambda 函數的AssumeRole權限,如下所示:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
雲端架構師、雲端管理員

將受管政策附加至 Lambda 角色。

執行 AWS CLI attach-role-policy命令,將受管政策附加到上一步中建立的角色。這兩個原則會授予角色權限來建立 elastic network interface,以及將記錄寫入記 CloudWatch 錄檔。

aws iam attach-role-policy \ --role-name index-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy \ --role-name index-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole 
雲端架構師、雲端管理員

建立政策以授與 Lambda 索引函數讀取 S3 物件的權限。

執行 AWS CLI 建立政策命令,以授與 Lambda 索引函數讀取 S3 儲存貯體中物件的s3:GetObject權限:

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

該檔案s3-policy.json是目前資料夾中的 JSON 文件,可授與允許讀取 S3 物件的s3:GetObject權限。如果您在建立 S3 儲存貯體時使用了不同的名稱,請在下列Resource 區段中提供正確的儲存貯體名稱:

{     "Version": "2012-10-17",     "Statement": [         {            "Effect": "Allow",            "Action": "s3:GetObject",            "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
雲端架構師、雲端管理員

將 Amazon S3 許可政策附加到 Lambda 執行角色。

執行 AWS CLI attach-role-policy命令,將您在上一步中建立的 Amazon S3 許可政策附加到 Lambda 執行角色:

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

其中PolicyARN是 Amazon S3 許可政策的亞馬遜資源名稱(ARN)。您可以從上一個命令的輸出中獲取此值。

雲端架構師、雲端管理員

建立 Lambda 索引函數。

執行 AWS CLI 建立函數命令以建立 Lambda 索引函數,該函數將存取 Amazon 服務: 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>\"]}"
雲端架構師、雲端管理員

允許 Amazon S3 調用 Lambda 索引函數。

執行 AWS CLI 新增權限命令,授與 Amazon S3 呼叫 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>"
雲端架構師、雲端管理員

為 Amazon S3 事件新增 Lambda 觸發器。

執行 AWS CLI put-bucket-notification-configuration命令,在偵測到 Amazon S3 ObjectCreated 事件時,將通知傳送至 Lambda 索引函數。每當物件上傳到 S3 儲存貯體時,索引函數就會執行。 

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

該檔案s3-trigger.json是目前資料夾中的 JSON 文件,可在 Amazon S3 ObjectCreated 事件發生時將資源政策新增至 Lambda 函數。

雲端架構師、雲端管理員
任務描述所需技能

建立 Lambda 執行角色。

執行 AWS CLI 建立角色命令,以授與 Lambda 搜尋函數存取 AWS 服務和資源的權限:

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

其中lambda_assume_role.json是目前資料夾中的 JSON 文件,可授與 Lambda 函數的AssumeRole權限,如下所示:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
雲端架構師、雲端管理員

將受管政策附加至 Lambda 角色。

執行 AWS CLI attach-role-policy命令,將受管政策附加到上一步中建立的角色。這兩個原則會授予角色權限來建立 elastic network interface,以及將記錄寫入記 CloudWatch 錄檔。

aws iam attach-role-policy \ --role-name search-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy \ --role-name search-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole 
雲端架構師、雲端管理員

建立搜 Lambda 函數。

執行 AWS CLI 建立函數命令以建立 Lambda 搜尋函數,該函數將存取 Amazon 服務: 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>\"]}"
雲端架構師、雲端管理員
任務描述所需技能

建立租用戶 IAM 角色。

執行 AWS CLI 建立角色命令以建立兩個用於測試搜尋功能的租用戶角色:

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

該檔案assume-role-policy.json是目前資料夾中的 JSON 文件,可授與 Lambda 執行角色的AssumeRole權限:

{     "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"         }     ] }
雲端架構師、雲端管理員

建立租用戶 IAM 政策。

執行 AWS CLI 建立政策命令以建立可授予 Elasticsearch 操作存取權的租用戶政策:

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

該文件policy.json是當前文件夾中的 JSON 文檔,它授予對彈性搜索的權限:

{     "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>"             ]         }     ] }
雲端架構師、雲端管理員

將租用戶 IAM 政策附加到租用戶角色。

執行 AWS CLI attach-role-policy命令,將租用戶 IAM 政策附加到您在先前步驟中建立的兩個租用戶角色:

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

原則 ARN 來自上一個步驟的輸出。

雲端架構師、雲端管理員

建立 IAM 政策以授予 Lambda 許可以擔任角色。

執行 AWS CLI 建立政策命令,為 Lambda 建立政策以承擔租用戶角色:

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

該文件lambda_policy.json是當前文件夾中的 JSON 文檔,可授予以下權限AssumeRole

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

對於Resource,您可以使用萬用字元來避免為每個承租人建立新原則。

雲端架構師、雲端管理員

建立 IAM 政策以授予 Lambda 索引角色存取 Amazon S3 的權限。

執行 AWS CLI 建立政策命令,授與 Lambda 索引角色存取 S3 儲存貯體中物件的權限:

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

該文件s3_lambda_policy.json是當前文件夾中的以下 JSON 策略文檔:

{     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": "s3:GetObject",             "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
雲端架構師、雲端管理員

將原則附加至 Lambda 執行角色。

執行 AWS CLI attach-role-policy命令,將上一步中建立的政策附加到您先前建立的 Lambda 索引和搜尋執行角色:

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

原則 ARN 來自上一個步驟的輸出。

雲端架構師、雲端管理員
任務描述所需技能

在 API Gateway 中建立 REST API。

執行 CLI create-rest-api命令以建立其他 API 資源:

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

對於端點組態類型,您可以指定EDGE而不是使REGIONAL用節點位置,而不是使用特定 AWS 區域。

請注意來自命令輸出的id欄位值。這是您將在後續命令中使用的 API ID。

雲端架構師、雲端管理員

建立搜尋 API 的資源。

搜尋 API 資源會以資源名稱啟動 Lambda 搜尋功能search。您不必為 Lambda 索引函數建立 API,因為它會在物件上傳至 S3 儲存貯體時自動執行。)

  1. 執行 AWS CLI 取得資源命令以取得根路徑的父 ID:

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

    請注意 ID 欄位的值。您將在下一個命令中使用此父 ID。

    { "items": [ { "id": "zpsri964ck", "path": "/" } ] }
  2. 執行 AWS CLI 建立資源命令,為搜尋 API 建立資源。對於parent-id,指定上一個指令的 ID。

    aws apigateway create-resource \   --rest-api-id <API-ID> \   --parent-id <Parent-ID> \   --path-part search
雲端架構師、雲端管理員

建立搜尋 API 的 GET 方法。

執行 AWS CLI 放置方法命令以建立搜尋 API 的GET 方法:

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

對於resource-id,指定create-resource命令輸出中的 ID。

雲端架構師、雲端管理員

建立搜尋 API 的方法回應。

執行 AWS CLI put-method-response命令以新增搜尋 API 的方法回應:

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

對於 resource-id,指定先前create-resource命令輸出的 ID。

雲端架構師、雲端管理員

為搜尋 API 設定代理 Lambda 整合。

執行 AWS CLI 命令放置整合命令,以設定與 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

對於resource-id,指定先前指create-resource令中的 ID。

雲端架構師、雲端管理員

授予 API Gateway 權限以呼叫 Lambda 搜尋功能。

執行 AWS CLI 新增權限命令,授與 API Gateway 使用搜尋功能的權限:

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

如果您使用不同的 API 資源名稱而不是更改source-arn路徑search

雲端架構師、雲端管理員

部署搜尋 API。

執行 AWS CLI 建立部署命令以建立名為的階段資源:dev

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

如果您更新 API,則可以使用相同的 CLI 命令將其重新部署到相同的階段。

雲端架構師、雲端管理員
任務描述所需技能

登入木花主控台。

  1. 在 Amazon OpenSearch 服務主控台上的網域儀表板上找到 Kibana 的連結。網址的格式如下:<domain-endpoint>/_plugin/kibana/

  2. 使用您在第一個史詩中配置的堡壘主機來訪問 Kibana 控制台。

  3. 在建立 Amazon OpenSearch 服務網域時,使用先前步驟中的主要使用者名稱和密碼登入 Kibana 主控台。

  4. 當系統提示您選取承租人時,請選擇 [私人]。

雲端架構師、雲端管理員

建立和設定 Kibana 角色。

若要提供資料隔離,並確保一個承租人無法擷取另一個承租人的資料,您需要使用文件安全性,這可讓租用戶只存取包含其租用戶識別碼的文件。

  1. 在 Kibana 主控台的功能窗格中,選擇 [安全性]、[角色]。

  2. 建立新承租人角色。

  3. 將叢集許可設定為indices_all,以便在 Amazon OpenSearch 服務索引上提供建立、讀取、更新和刪除 (CRUD) 權限。 

  4. 限制索引的tenant-data索引權限。(索引名稱應與 Lambda 搜尋和索引函數中的名稱相符。) 

  5. 將索引權限設定為indices_all,可讓使用者執行所有索引相關作業。您可以根據您的需求限制操作以獲得更細微的存取。)

  6. 針對文件層級安全性,請使用下列原則依租用戶識別碼篩選文件,以便為共用索引中的租用戶提供資料隔離:

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

    索引名稱、屬性和值區分大小寫。

雲端架構師、雲端管理員

將使用者對應至角色。

  1. 選擇角色的 [對應的使用者] 索引標籤,然後選擇 [對應使用者]。

  2. 後端角色區段中,指定您先前建立的 IAM 租用戶角色的 ARN,然後選擇 [應]。這會將 IAM 租用戶角色對應至 Kibana 角色,以便承租人特定搜尋只會傳回該租用戶的資料。例如,如果承租人 1 的 IAM 角色名稱是Tenant-1-Role,請在承租人 1 Kibana 角色的後端角色方塊中為 Tenant-1-Role (從建立和設定租用戶角色史詩) 指定 ARN。

  3. 對承租人 2 重複步驟 1 和 2。

我們建議您在承租人上線時自動建立承租人和 Kibana 角色。

雲端架構師、雲端管理員

建立承租人資料索引。

在功能窗格的 [管理] 下,選擇 [開發工具],然後執行下列命令。此指令會建立tenant-data索引以定義TenantId性質的對映。

PUT /tenant-data {   "mappings": {     "properties": {       "TenantId": { "type": "keyword"}     }   } }
雲端架構師、雲端管理員
任務描述所需技能

為 Amazon S3 建立 VPC 端點。

執行 AWS CLI create-vpc-endpoint命令以建立適用於 Amazon S3 的 VPC 端點。端點可讓 VPC 中的 Lambda 索引函數存取 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>

對於vpc-id,請指定您要用於 Lambda 索引函數的 VPC。對於service-name,請使用適用於 Amazon S3 端點的正確 URL。對於route-table-ids,指定與 VPC 端點關聯的路由表。

雲端架構師、雲端管理員

為 AWS STS 建立 VPC 私人雲端端點。

執行 AWS CLI create-vpc-endpoint命令,為 AWS 安全性權杖服務 (AWS STS) 建立 VPC 端點。端點可讓 VPC 中的 Lambda 索引和搜尋函數存取 AWS STS 服務。這些函數在擔任 IAM 角色時會使用 AWS STS。

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>

對於vpc-id,請指定您用於 Lambda 索引和搜尋函數的 VPC。對於subnet-id,請提供應在其中建立此端點的子網路。對於security-group-id,指定要與此端點相關聯的安全群組。(它可能與 Lambda 使用的安全性群組相同。)

雲端架構師、雲端管理員
任務描述所需技能

更新 Python 文件的索引和搜索功能。

  1. index_lambda_package.zip檔案中,編輯 lamba_index.py檔案以更新 AWS 帳戶 ID、AWS 區域和彈性搜尋端點資訊。

  2. search_lambda_package.zip檔案中,編輯lambda_search.py檔案以更新 AWS 帳戶 ID、AWS 區域和彈性搜尋端點資訊。

您可以從 Amazon OpenSearch 服務主控台的概觀索引標籤取得彈性搜尋端點。它具有格式<AWS-Region>.es.amazonaws.com

雲架構師、應用程式開發

更新程 Lambda 碼。

使用 AWS CLI update-function-code命令,以您對 Python 檔案所做的變更來更新 Lambda 程式碼:

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
雲架構師、應用程式開發

將原始資料上傳到 S3 儲存貯體。

使用 AWS CLI cp 命令將承租人 1 和承租人 2 物件的資料上傳到儲存tenantrawdata貯體 (指定為此目的建立的 S3 儲存貯體的名稱):

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

S3 儲存貯體設定為在每次上傳資料時執行 Lambda 索引函數,以便在 Elasticsearch 中為文件建立索引。

雲端架構師、雲端管理員

從 Kibana 控制台搜索數據。

在 Kibana 主控台上,執行下列查詢:

GET tenant-data/_search

此查詢會顯示所有在 Elasticsearch 中編製索引的文件。在這種情況下,您應該看到租戶 1 和承租人 2 的兩個單獨的文件。

雲端架構師、雲端管理員

從 API Gateway 測試搜尋 API。

  1. 在 API Gateway 主控台中,開啟搜尋 API,選擇搜尋資源內的GET方法,然後選擇 [測試]。

  2. 在測試視窗中,為租用戶識別碼提供下列查詢字串 (區分大小寫),然後選擇 [測試]。

    TenantId=Tenant-1

    Lambda 函數會傳送查詢至 Amazon OpenSearch 服務,根據文件層級安全性篩選租用戶文件。該方法返回屬於承租人 1 的文檔。

  3. 將查詢字串變更為:

    TenantId=Tenant-2

    此查詢會傳回屬於承租人 2 的文件。

如需螢幕插圖,請參閱其他資訊一節。

雲架構師、應用程式開發

相關資源

其他資訊

資料分割模型

多租戶系統中使用三種常見的資料分割模型:筒倉、集區和混合式。您選擇的模型取決於環境的合規性、嘈雜鄰點、作業和隔離需求。

筒倉模型

在筒倉模型中,每個租戶的數據存儲在不包含租戶數據混合的不同存儲區域中。您可以使用兩種方法透過 Amazon Ser OpenSearch vice 實作筒倉模型:每個租用戶的網域和每個租用戶的索引。

  • 每個租用戶的網域 — 您可以為每個租用戶使用個別的 Amazon OpenSearch 服務網域 (與 Elasticsearch 叢集同義)。將每個承租人放置在其自己的網域中,可提供與在獨立建構中擁有資料相關的所有好處。但是,這種方法引入了管理和敏捷性挑戰。其分佈式特性使得匯總和評估租戶的運營健康狀況和活動變得更加困難。這是一個昂貴的選項,要求每個 Amazon Ser OpenSearch vice 網域至少要有三個主節點和兩個資料節點來處理生產工作負載。

適用於多租戶無伺服器架構的每個租用戶的網域孤島模型
  • 每個租用戶索引 — 您可以將租用戶資料放置在 Amazon OpenSearch 服務叢集中的個別索引中。透過這種方法,您可以在建立索引並命名索引時使用承租人識別碼,方法是將承租人識別碼預先擱置至索引名稱。每個租用戶索引方法可協助您達成孤島目標,而無需為每個租用戶引入完全獨立的叢集。但是,如果索引數量增加,您可能會遇到內存壓力,因為這種方法需要更多的碎片,並且主節點必須處理更多的配置和重新平衡。

針對多租用戶無伺服器架構的每個租用戶筒倉模型索引

隔離筒倉模型 — 在筒倉模型中,您可以使用 IAM 政策隔離保存每個租用戶資料的網域或索引。這些原則可防止一個承租人存取另一個承租人的資料。若要實作筒倉隔離模型,您可以建立以資源為基礎的政策,以控制對租用戶資源的存取。這通常是網域存取原則,用來指定主體可以對網域的子資源執行哪些動作,包括 Elasticsearch 索引和 API。使用 IAM 身分型政策,您可以針對 Amazon 服務中的網域、索引或 API 指定允許拒絕的動作。 OpenSearch IAM 政策的Action 元素描述政策允許或拒絕的特定動作,並指定受影響的帳戶、使用者或角色。Principal 

下列範例原則僅授與 Tenant 1 對網域上子資源的完整存取權 (如指定es:*)。tenant-1Resource 元素/*中的尾端表示此原則適用於網域的子資源,而非網域本身。此原則生效時,不允許租用戶在現有網域上建立新網域或修改設定。

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

若要實作每個索引筒倉模型的承租人,您需要修改此範例原則,藉由指定索引名稱,進一步將 Tenant 1 限制為指定的一或多個索引。下列範例原則會將承租人 1 限制為索引。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/*"       }    ] }

泳池模型

在集區模型中,所有承租人資料都儲存在相同網域內的索引中。承租人識別碼包含在資料 (文件) 中並做為磁碟分割索引鍵使用,因此您可以判斷哪些資料屬於哪個承租人。這種模式減少了管理開銷。操作和管理集區索引比管理多個索引更容易,更有效率。但是,由於租用戶資料混合在相同的索引中,因此您會失去筒倉模型提供的自然租用戶隔離。此方法也可能會因為鄰近雜訊效應而降低效能。

適用於多租戶無伺服器架構的集區模型

集區模型中的租用戶隔離 — 一般而言,在集區模型中實作租用戶隔離具有挑戰性。與筒倉模型搭配使用的 IAM 機制不允許您根據文件中儲存的租用戶 ID 來描述隔離。

另一種方法是使用 Elasticsearch 開放發行版提供的精細訪問控制(FGAC)支持。FGAC 可讓您在索引、文件或欄位層級控制權限。FGAC 會針對每個要求評估使用者認證,並驗證使用者或拒絕存取。如果 FGAC 驗證使用者,它會擷取對應至該使用者的所有角色,並使用完整的權限集來決定如何處理要求。 

若要在集區模型中達到所需的隔離,您可以使用文件層級安全性,這可讓您將角色限制為索引中的文件子集。下列範例角色會將查詢限制為承租人 1。透過將此角色套用至承租人 1,您可以達到必要的隔離。 

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

混合模型

混合模型在相同環境中使用筒倉和集區模型的組合,為每個租用戶層 (例如免費、標準和進階層) 提供獨特的體驗。每個層都遵循集區模型中使用的相同安全性設定檔。

適用於多租戶無伺服器架構的混合模型

混合模型中的租用戶隔離 — 在混合模型中,您遵循與集區模型中相同的安全性設定檔,在此模型中使用文件層級的 FGAC 安全性模型會提供租用戶隔離。雖然此策略簡化了叢集管理並提供敏捷性,但是它使架構的其他層面變得複雜。例如,您的程式碼需要額外的複雜性,才能判斷與每個租用戶相關聯的模型。您還必須確保單租用戶查詢不會飽和整個網域,並降低其他租用戶的體驗。 

在 API Gateway 中進行測試

租戶 1 查詢的測試窗口

租戶 1 查詢的測試窗口

承租人 2 查詢的測試視窗

承租人 2 查詢的測試視窗

附件

若要存取與此文件相關聯的其他內容,請解壓縮下列檔案:attachment.zip