在 Amazon ES 中建置多租戶無伺服器架構 - AWS Prescriptive Guidance

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

在 Amazon ES 中建置多租戶無伺服器架構

由塔比沃德(AWS)和尼莎·甘比爾(AWS)創建

環境:PoC 或試驗

技能:現代化;SaaS;無伺服器

工作負載:開放原始碼

AWS 服務:亞馬遜 ES AWS Lambda Amazon S3; 亞 Amazon API Gateway

Summary

Amazon Elasticsearch Service (Amazon ES) 是可輕鬆部署、操作和擴展 Elasticsearch Service (一個熱門的開放原始碼搜尋和分析引擎) 的受管服務。Amazon ES 為日誌和指標等串流資料提供免費文字搜尋以及近乎即時的擷取和儀表板。

軟體即服務 (SaaS) 供應商經常使用 Amazon ES 處理廣泛的使用案例,例如以可擴展和安全的方式獲取客戶見解,同時降低複雜性和停機時間。

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

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

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

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

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

  • 3.7 版

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

    1. 產生requirements.txt檔案,方法是在與 Python 腳本相同的目錄中執行下列命令:pip3 freeze > requirements.txt

    2. 安裝相依性:pip3 install -r requirements.txt

限制

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

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

  • 此模式僅用於示範用途。它不打算用於生產環境。

Architecture

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

  • AWS Lambda 來索引和查詢內容 

  • 亞馬遜 ES 執行搜索 

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

  • Amazon S3 來存儲原始(非索引)數據

  • Amazon CloudWatch 察監控日誌

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

自動化與擴充

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

Tools

AWS 服務

  • AWS CLI-AWS Command Line Interface (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 ES-Amazon Elasticsearch Service (Amazon ES) 是可輕鬆部署、保護和執行 Elasticsearch Service (Amazon ES) 的全受管服務。

Code

附件提供了此病毒碼的示例文件。其中包括:

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

  • search_lambda_package.zip— 用於在亞馬遜 ES 中搜索數據的 Lambda 函數。

  • Tenant-1-data— 租用戶-1 的原始 (未編製索引) 資料範例。

  • Tenant-2-data— 租用戶-2 的原始 (未編製索引) 資料範例。

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

Epics

任務描述所需技能
建立 S3 儲存貯體。

在 AWS 區域建立 S3 儲存貯體。此儲存貯體會保留範例應用程式的未編製索引的租用戶資料。確保 S3 儲存貯體的名稱必須是全域唯一,因為命名空間會由所有 AWS 帳戶共享。

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

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

wheretenantrawdata是 S3 儲存貯體名稱。(您可以使用任何遵循的唯一名稱儲存貯體命名指導方針。)

雲端管理員
任務描述所需技能
建立 Amazon ES 網域。

執行 AWS CLI創建彈性搜索域命令來建立 Amazon ES 網域:

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 執行個體。

如需詳細資訊,請參閱「」使用 VPC 啟動您的 Amazon Elasticsearch Service 域在亞馬遜 ES 文檔中。

雲端管理員
設定堡壘主機。

將 Amazon Elastic Compute Cloud (Amazon EC2) Windows 執行個體設定為堡壘主機,以存取 Kibana 主控台。彈性搜尋安全群組必須允許來自 Amazon EC2 安全群組的流量。如需指示,請參閱部落格文章使用 Bastion 伺服器控制對 EC2 執行個體的網路存取

當您設定了基礎主機,且您有與可用執行個體相關聯的安全群組時,請使用 AWS CLI授權-安全-群組入口命令將權限新增至 Elasticsearch 安全群組,以允許來自 Amazon EC2 (堡壘主機) 安全群組的連接埠 443。

aws ec2 authorize-security-group-ingress \ --group-id <SecurityGroupIdfElasticSearch> \ --protocol tcp \ --port 443 \ --source-group <SecurityGroupIdfBashionHostEC2>
雲端管理員
任務描述所需技能
建立 Lambda 執行角色。

執行 AWS CLIcreate-role命令授與 Lambda 索引函數存取 AWS 服務和資源的權限:

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

wherelambda_assume_role.json為 JSON 檔案,其位於目前授予AssumeRole許可 Lambda 如下所示:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
雲端管理員
將受管理的原則附加至 Lambda 角色。

執行 AWS CLIattach-role-policy命令,將受管政策連接到前一步驟所建立的角色。這兩個原則賦予角色權限,以建立 elastic network interface,並將記錄寫入 CloudWatch Logs。

aws iam attach-role-policy \ --role-name index-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy \ --role-name index-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole 
雲端管理員
建立原則以授與 Lambda 索引函數讀取 S3 物件的權限。

執行 AWS CLIcreate-policy命令來提供 Lambda 索引函數s3:GetObject許可以讀取 S3 儲存貯體中的物件:

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

檔案s3-policy.json為 JSON 檔案,其位於目前授予s3:GetObject權限來允許對 S3 物件的讀取權限。如果您在建立 S3 儲存貯體時使用了不同的名稱,請在Resource 區段中的

{     "Version": "2012-10-17",     "Statement": [         {            "Effect": "Allow",            "Action": "s3:GetObject",            "Resource": "arn:aws:s3:::tenantrawdata/*"         }     ] }
雲端管理員
將 Amazon S3 權限政策附加到 Lambda 執行角色。

執行 AWS CLIattach-role-policy命令,將您在之前的步驟中建立的 Amazon S3 許可政策連接到 Lambda 執行角色:

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

wherePolicyARN為 Amazon S3 許可政策的 Amazon Resource Name (ARN)。您可以從上一個命令的輸出取得此值。

雲端管理員
建立 Lambda 索引函數。

執行 AWS CLI建立函數命令來創建 Lambda 索引函數,該函數將訪問亞馬遜 ES:

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放置儲存貯體通知-配置命令以在 Amazon S3 時傳送通知至 Lambda 索引函數ObjectCreated事件。每當物件上傳至 S3 儲存貯體時,索引函式就會執行。 

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

檔案s3-trigger.json是一個 JSON 檔案,可將資源政策加入到 Lambda 函式,當 Amazon S3ObjectCreated事件發生。

雲端管理員
任務描述所需技能
建立 Lambda 執行角色。

執行 AWS CLIcreate-role命令授與 Lambda 搜尋功能存取 AWS 服務和資源的權限:

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

wherelambda_assume_role.json為 JSON 檔案,其位於目前授予AssumeRole許可 Lambda 如下所示:

{      "Version": "2012-10-17",      "Statement": [          {              "Effect": "Allow",              "Principal": {                  "Service": "lambda.amazonaws.com"                },              "Action": "sts:AssumeRole"          }      ]  }
雲端管理員
將受管理的原則附加至 Lambda 角色。

執行 AWS CLIattach-role-policy命令,將受管政策連接到前一步驟所建立的角色。這兩個原則賦予角色權限,以建立 elastic network interface,並將記錄寫入 CloudWatch Logs。

aws iam attach-role-policy \ --role-name search-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy \ --role-name search-lambda-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole 
雲端管理員
建立 Lambda 搜尋函數。

執行 AWS CLI建立函數命令來創建 Lambda 搜索函數,該函數將訪問亞馬遜 ES:

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 CLIcreate-role命令來建立兩個用來測試搜尋功能的承租人角色:

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 檔案,其位於目前授予AssumeRole權限設定為 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"         }     ] }
雲端管理員
建立租用戶 IAM 政策。

執行 AWS CLIcreate-policy命令來建立授與 Elasticsearch 作業存取權的承租人原則:

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

檔案policy.json為 JSON 檔案,其位於目前授予 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>"             ]         }     ] }
雲端管理員
將租用戶 IAM 原則附加至租用戶角色。

執行 AWS CLIattach-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 CLIcreate-policy命令來建立 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 CLIcreate-policy命令來授與 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 CLIattach-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創建-休息-API命令來建立 REST 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 CLIput-method命令建立GET 方法用於搜索 API:

aws apigateway put-method \   --rest-api-id <API-ID> \   --resource-id <ID from the previous command output> \   --http-method GET \   --authorization-type "NONE" \ --no-api-key-required

適用於resource-id,指定 ID 從的輸出create-resource命令。

雲端管理員
建立搜尋 API 的方法回應。

執行 AWS CLI推向方法響應命令為搜索 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,指定來自先前的輸出的 IDcreate-resource命令。

雲端管理員
設定搜尋 API 的代理 Lambda 整合。

執行 AWS CLI 命令put-整合命令來設定與 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命令。

雲端管理員
授與 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

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

雲端管理員
部署搜尋 API。

執行 AWS CLI建立部署命令來建立名為dev

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

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

雲端管理員
任務描述所需技能
登入 Kibana 主控台。
  1. 在 Amazon ES 主控台的網域儀表板上尋找 Kibana 的連結。URL 的形式為:<domain-endpoint>/_plugin/kibana/

  2. 使用您在第一部史詩級中設定的堡壘主機來存取 Kibana 主機。

  3. 當您建立 Amazon ES 網域時,請使用先前步驟中的主要使用者名稱和密碼登入 Kibana 主控台。

  4. 提示您選取承租人時,請選擇私有

雲端管理員
建立和設定 Kibana 角色。

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

  1. 在 Kibana 主控台的導覽窗格中,選擇安全性Role

  2. 建立新的承租人角色。

  3. 將叢集權限設定為indices_all,可讓您為 Amazon ES 索引提供建立、讀取、更新和刪除 (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,請指定的 ARNTenant-1-Role(來自建立和設定承租人角色史詩)在後端角色] 方塊中的 [租用戶-1 Kibana 角色。

  3. 對租用戶-2 重複步驟 1 和 2。

建議您在租用戶上架時,自動建立租用戶和 Kibana 角色。

雲端管理員
建立租用戶資料索引。

在導覽窗格中,於管理中,選擇開發工具,然後執行下列命令。這個命令會建立tenant-data索引來定義對應TenantId屬性。

PUT /tenant-data {   "mappings": {     "properties": {       "TenantId": { "type": "keyword"}     }   } }
雲端管理員
任務描述所需技能
為 Amazon S3 建立 VPC 端點。

執行 AWS CLI建立-vPC-端點命令為 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建立-vPC-端點命令,為 AWS Security Token Service (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 區域和 Elasticsearch 端點資訊。

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

您可以從概觀索引標籤。它具有格式<AWS-Region>.es.amazonaws.com

雲端應用程式開發人員
更新 Lambda 程式碼。

使用 AWS CLI更新功能代碼命令來更新 Lambda 程式碼,其位於您對 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
雲端應用程式開發人員
將原始資料上傳至 S3 儲存貯體。

使用 AWS CLICP命令,將承租人-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 ES,該查詢會根據文件層級安全性篩選租用戶文件。該方法返回屬於租戶-1 的文檔。

  3. 將查詢字串變更為:

    TenantId=Tenant-2

    此查詢會傳回屬於租用戶-2 的文件。

如需螢幕插圖,請參閱其他資訊區段。

雲端應用程式開發人員

相關資源

其他資訊

資料分割模型

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

筒倉模型

在筒倉模型中,每個租用戶的資料會儲存在不同的儲存區域中,其中沒有共同的租用戶資料。您可以使用兩種方法透過 Amazon ES 實作筒倉模型:每個租用戶的網域和每個租用戶的索引。

  • 每個租用戶的網域— 您可以為每個租用戶使用不同的 Amazon ES 網域 (與 Elasticsearch 叢集的同義詞)。將每個租用戶放置在自己的網域中,可提供與在獨立建構中擁有資料相關的所有優點。然而,這種方法引入了管理和敏捷性的挑戰。它的分佈性使得它更難以整合和評估租戶的運作健康和活動。這是一個昂貴的選項,需要每個 Amazon ES 網域至少擁有三個主節點和兩個資料節點,以供生產工作負載使用。

  • 每個租用戶的索引— 您可以將租用戶資料放置在 Amazon ES 叢集中的個別索引中。使用此方法,您可以在建立索引並命名索引時使用承租人識別碼,方法是預先擱置承租人識別碼至索引名稱。每個租用戶的索引方法可協助您達成孤島目標,而不需為每個租用戶引入完全獨立的叢集。但是,如果索引數量增加,則可能會遇到內存壓力,因為此方法需要更多的分片,並且主節點必須處理更多的分配和重新平衡。

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

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

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

若要實作每個索引筒倉模型的租用戶,您必須修改此範例原則,藉由指定索引名稱,以進一步將承租人 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 機制不允許您根據儲存在文件中的租用戶識別碼來描述隔離。

另一種方法是使用精細存取控制(FGAC) 支援由 Open Distro in Elasticsearch. FGAC 可讓您控制索引、文件或欄位層級的權限。每次要求時,FGAC 都會評估使用者認證,並驗證使用者或拒絕存取。如果 FGAC 通過身份驗證使用者,則會擷取所有映射到該使用者的角色,並使用完整的許可集合來判斷如何處理請求。 

要在池模型中實現所需的隔離,您可以使用文件層級的安全,它允許您將角色限制為索引中的文檔子集。下列範例角色會限制查詢租用戶-1。藉由將此角色套用至承租人-1,您可以達到必要的隔離。 

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

混合模型

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

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

在 API Gateway 中進行測試

租用戶-1 查詢的測試視窗

租用戶-2 查詢的測試視窗

Attachments

attachment.zip