As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Tutorial: Criando um aplicativo de pesquisa com o Amazon OpenSearch Service
Uma forma comum de criar um aplicativo de pesquisa com o Amazon OpenSearch Service é usar formulários da web para enviar consultas de usuários a um servidor. Em seguida, você pode autorizar o servidor a ligar OpenSearch APIs diretamente para o e fazer com que o servidor envie solicitações ao OpenSearch Serviço. No entanto, se desejar escrever um código do lado do cliente que não dependa de um servidor, é necessário compensar os riscos de segurança e performance. Não é aconselhável permitir o acesso público não assinado ao OpenSearch APIs . Os usuários podem acessar endpoints não seguros ou afetar a performance do cluster por meio de consultas excessivamente amplas (ou muitas consultas).
Este capítulo apresenta uma solução: use o Amazon API Gateway para restringir os usuários a um subconjunto do OpenSearch APIs e AWS Lambda assinar solicitações do API Gateway para o OpenSearch Service.

nota
Os preços padrão do API Gateway e do Lambda se aplicam, mas dentro do uso limitado desse tutorial, os custos devem ser insignificantes.
Pré-requisitos
Um pré-requisito para este tutorial é um domínio de OpenSearch serviço. Se você ainda não tiver um, siga as etapas em Criar um domínio OpenSearch de serviço para criar um.
Etapa 1: Indexar dados de exemplo
Faça download de sample-movies.zip e use a operação da API _bulkmovies
:
POST https://search-my-domain
.us-west-1
.es.amazonaws.com/_bulk
{ "index": { "_index": "movies", "_id": "tt1979320" } }
{"directors":["Ron Howard"],"release_date":"2013-09-02T00:00:00Z","rating":8.3,"genres":["Action","Biography","Drama","Sport"],"image_url":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg","plot":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.","title":"Rush","rank":2,"running_time_secs":7380,"actors":["Daniel Brühl","Chris Hemsworth","Olivia Wilde"],"year":2013,"id":"tt1979320","type":"add"}
{ "index": { "_index": "movies", "_id": "tt1951264" } }
{"directors":["Francis Lawrence"],"release_date":"2013-11-11T00:00:00Z","genres":["Action","Adventure","Sci-Fi","Thriller"],"image_url":"http://ia.media-imdb.com/images/M/MV5BMTAyMjQ3OTAxMzNeQTJeQWpwZ15BbWU4MDU0NzA1MzAx._V1_SX400_.jpg","plot":"Katniss Everdeen and Peeta Mellark become targets of the Capitol after their victory in the 74th Hunger Games sparks a rebellion in the Districts of Panem.","title":"The Hunger Games: Catching Fire","rank":4,"running_time_secs":8760,"actors":["Jennifer Lawrence","Josh Hutcherson","Liam Hemsworth"],"year":2013,"id":"tt1951264","type":"add"}
...
Observe que o exemplo acima é um comando com um pequeno subconjunto dos dados disponíveis. Para executar a operação _bulk
, você precisa copiar e colar todo o conteúdo do arquivo sample-movies
. Para obter mais instruções, consulte Opção 2: carregar vários documentos.
Também é possível usar o seguinte comando do curl para obter o mesmo resultado:
curl -XPOST -u '
master-user
:master-user-password
' 'domain-endpoint/_bulk' --data-binary @bulk_movies.json -H 'Content-Type: application/json'
Etapa 2: criar e implantar a função do Lambda
Antes de criar sua API no API Gateway, crie a função do Lambda para a qual ela passará as solicitações.
Criar a função do Lambda
Nessa solução, o API Gateway passa solicitações para uma função Lambda, que consulta o OpenSearch Serviço e retorna os resultados. Como essa função de exemplo usa bibliotecas externas, é necessário criar um pacote de implantação e carregar para o Lambda.
Para criar o pacote de implantação
-
Abra um prompt de comando e crie um diretório de projeto do
my-opensearch-function
. Por exemplo, no macOS:mkdir my-opensearch-function
-
Navegue até o diretório de projeto do
my-sourcecode-function
.cd my-opensearch-function
-
Copie o conteúdo do seguinte código Python de exemplo e salve-o em um novo arquivo chamado
opensearch-lambda.py
. Adicione sua região e o endpoint do host ao arquivo.import boto3 import json import requests from requests_aws4auth import AWS4Auth
region
= '' # For example, us-west-1 service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)host
= '' # The OpenSearch domain endpoint with https:// and without a trailing slash index = 'movies' url = host + '/' + index + '/_search' # Lambda execution starts here def lambda_handler(event, context): # Put the user query into the query DSL for more accurate search results. # Note that certain fields are boosted (^). query = { "size": 25, "query": { "multi_match": { "query": event['queryStringParameters']['q'], "fields": ["title^4", "plot^2", "actors", "directors"] } } } # Elasticsearch 6.x requires an explicit Content-Type header headers = { "Content-Type": "application/json" } # Make the signed HTTP request r = requests.get(url, auth=awsauth, headers=headers, data=json.dumps(query)) # Create the response and add some extra content to support CORS response = { "statusCode": 200, "headers": { "Access-Control-Allow-Origin": '*' }, "isBase64Encoded": False } # Add the search results to the response response['body'] = r.text return response -
Instale a biblioteca externa em um novo diretório de
package
.pip3 install --target ./package boto3 pip3 install --target ./package requests pip3 install --target ./package requests_aws4auth
-
Crie um pacote de implantação com a biblioteca instalada na raiz. O seguinte comando gera um arquivo
my-deployment-package.zip
no diretório do projeto.cd package zip -r ../my-deployment-package.zip .
-
Adicione o arquivo
opensearch-lambda.py
à raiz do arquivo zip.cd .. zip my-deployment-package.zip opensearch-lambda.py
Para obter mais informações sobre a criação de funções do Lambda e pacotes de implantação, consulte Implantar funções do Lambda em Python com arquivos .zip no Guia do desenvolvedor do AWS Lambda e Criar o pacote de implantação do Lambda neste guia.
Para criar sua função usando o console do Lambda
-
Navegue até o console Lambda em casahttps://console.aws.amazon.com/lambda/.
No painel de navegação à esquerda, escolha Funções. -
Selecione Criar função.
-
Configure os campos a seguir.
-
Nome da função: opensearch-function
-
Runtime: Python 3.9
-
Arquitetura: x86_64
Mantenha todas as outras opções padrão e escolha Criar função.
-
-
Na seção Fonte do código da página de resumo da função, escolha Carregar no menu suspenso e selecione .zip. file. Localize o arquivo
my-deployment-package.zip
que você criou e escolha Salvar. -
O manipulador é o método no código da sua função que processa eventos. Em Configurações do Runtime, escolha Editar e altere o nome do manipulador de acordo com o nome do arquivo no pacote de implantação onde a função do Lambda está localizada Como seu arquivo se chama
opensearch-lambda.py
, renomeie o manipulador para
. Para obter mais informações, consulte Manipulador de função do Lambda em Python.opensearch-lambda
.lambda_handler
Etapa 3: Criar a API no Gateway da API
O uso do API Gateway permite criar uma API mais limitada e simplifica o processo de interação com a OpenSearch _search
API. O API Gateway também permite ativar recursos de segurança, como a autenticação do Amazon Cognito e a limitação de solicitações. Execute as seguintes etapas para criar e implantar uma API:
Criar e configurar a API
Para criar sua API usando o console do API Gateway
-
Navegue até o console do API Gateway em https://console.aws.amazon.com/apigateway/casa
. No painel de navegação esquerdo, escolha APIs. -
Localize a API REST (não privada) e escolha Compilar.
-
Na página seguinte, localize a seção Criar nova API e verifique se a opção Nova API está selecionada.
-
Configure os campos a seguir.
-
Nome da API: opensearch-api
-
Descrição: API pública para pesquisar um domínio do Amazon OpenSearch Service
-
Tipo do endpoint: Regional
-
-
Selecione Criar API.
-
Escolha Ações e Criar método.
-
Select GET no menu suspenso e clique na marca de seleção para confirmar.
-
Defina as seguintes configurações e escolha Salvar:
Configuração | Valor |
---|---|
Tipo de integração | Função do Lambda |
Usar a integração de proxy do Lambda | Sim |
Região do Lambda | us-west-1 |
Função do Lambda | opensearch-lambda |
Usar o tempo limite padrão | Sim |
Configurar a solicitação de método
Escolha Solicitação de métodot e defina as seguintes configurações:
Configuração | Valor |
---|---|
Autorização | NONE |
Validador da solicitação |
Validar parâmetros e cabeçalhos da string de consulta |
Chave da API necessária | false |
Em Parâmetros da string de consulta do URL), escolha Adicionar string de consulta e configure o seguinte parâmetro:
Configuração | Valor |
---|---|
Name | q |
Obrigatório |
Sim |
Implante a API e configure um estágio
O console do API Gateway permite que você implante uma API criando uma implantação e associando-a a um estágio novo ou existente.
-
Escolha Ações e Implantar API.
-
Para Estágio da implantação), escolha Novo estágio e atribua o nome
opensearch-api-test
ao estágio. -
Escolha Implantar.
-
Defina as seguintes configurações no editor de estágios e, em seguida, escolha Salvar alterações:
Configuração | Valor |
---|---|
Habilitar controle de utilização | Sim |
Taxa |
1000 |
Intermitência | 500 |
Essas definições configuram uma API que possui apenas um método: uma solicitação GET
para a raiz do endpoint (https://
). A solicitação requer um único parâmetro (some-id
.execute-api.us-west-1
.amazonaws.com/search-es-api-testq
), a string de consulta a ser pesquisada. Quando chamado, o método passa a solicitação para o Lambda, que executa a função opensearch-lambda
. Para obter mais informações, consulte Criação de uma API no Amazon API Gateway e Implantação de uma API REST no Amazon API Gateway.
Etapa 4: (opcional) modificar a política de acesso ao domínio
Seu domínio OpenSearch de serviço deve permitir que a função Lambda faça GET
solicitações ao movies
índice. Se o domínio tiver uma política de acesso aberto com controle de acesso refinado habilitado, você pode deixar como está:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:us-west-1:123456789012:domain/
domain-name
/*" } ] }
Ou você pode escolher tornar a política de acesso ao domínio mais granular. Por exemplo, a política mínima a seguir fornece à opensearch-lambda-role
(criada por meio do Lambda) acesso de leitura ao índice movies
. Para obter o nome exato da função que o Lambda cria automaticamente, acesse o console AWS Identity and Access Management (IAM), escolha Roles e pesquise por “lambda”.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/service-role/
opensearch-lambda-role-1abcdefg
" }, "Action": "es:ESHttpGet", "Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name
/movies/_search" } ] }
Importante
Se você tiver um controle de acesso refinado habilitado para o domínio, também precisará mapear a função para um usuário nos OpenSearch painéis, caso contrário, você verá erros de permissão.
Para obter mais informações sobre políticas de acesso, consulte Configuração de políticas de acesso.
Mapeamento da função do Lambda (se estiver usando um controle de acesso minucioso)
O controle de acesso minucioso introduz uma etapa adicional antes de testar a aplicação. Mesmo se você usar a autenticação básica do HTTP para todos os outros fins, será necessário mapear a função do Lambda para um usuário. Caso contrário, você receberá erros de permissões.
-
Navegue até o URL dos OpenSearch painéis do domínio.
-
No menu principal, escolha Segurança, Funções e selecione o link para
all_access
, a função para a qual precisa mapear a função do Lambda. -
Escolha Usuários mapeados e Gerenciar mapeamento.
-
Em Funções de backend, adicione o nome do recurso da Amazon (ARN) da função do Lambda. O ARN deve assumir a forma de
arn:aws:iam::
.123456789123
:role/service-role/opensearch-lambda-role-1abcdefg
-
Selecione Mapa e confirme se o usuário ou função aparece em Usuários mapeados.
Etapa 5: Testar a aplicação Web
Para testar o aplicativo web
-
Faça download do sample-site.zip, descompacte-o e abra
scripts/search.js
em seu editor de texto de preferência. -
Atualize a variável
apigatewayendpoint
para apontar para o endpoint do API Gateway Você pode encontrar rapidamente o endpoint no API Gateway escolhendo Estágios e selecionando o nome da API. A variávelapigatewayendpoint
deve assumir a forma dehttps://
.some-id
.execute-api.us-west-1
.amazonaws.com/opensearch-api-test -
Abra
index.html
e tente executar pesquisas para thor, casa e alguns outros termos.
Solucionar erros CORS
Mesmo que a função do Lambda inclua conteúdo na resposta para ser compatível com o CORS, você ainda pode ver o seguinte erro:
Access to XMLHttpRequest at '<api-gateway-endpoint>' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present in the requested resource.
Se isso acontecer, tente o seguinte:
-
Habilite o CORS no recurso GET. Em Avançado, defina Access-Control-Allow-Credentials como
'true'
. -
Reimplante a API no API Gateway [Ações, Implantar API].
-
Exclua e torne a adicionar o acionador da função do Lambda. Adicione readicionar, escolha Adicionar acionador e crie o endpoint HTTP que invoca sua função. O acionador deve ter a seguinte configuração:
Trigger API Estágio de implantação Segurança API Gateway opensearch-api opensearch-api-test Abra o
Próximas etapas
Este capítulo é apenas um ponto de partida para demonstrar um conceito. Você pode considerar as seguintes modificações:
-
Adicione seus próprios dados ao domínio do OpenSearch Serviço.
-
Adicionar métodos à API.
-
Na função do Lambda, modifique a consulta de pesquisa ou incremente campos diferentes.
-
Estilize os resultados de maneira diferente ou modifique
search.js
para exibir campos diferentes para o usuário.