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: criação de uma aplicação de pesquisa com o Amazon OpenSearch Service
Uma maneira comum de criar uma aplicação de pesquisa com o Amazon OpenSearch Service é usar formulários da Web para enviar consultas do usuário a um servidor. Em seguida, você pode autorizar o servidor para chamar as APIs do OpenSearch diretamente e fazer com que o servidor envie solicitações ao OpenSearch Service. 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. Permitir o acesso público não assinado às APIs do OpenSearch não é aconselhável. 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 usuários a um subconjunto das APIs do OpenSearch e o AWS Lambda para 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
Ter um domínio do OpenSearch Service é um pré-requisito para este tutorial. Se você ainda não tem um, siga as etapas em Criar um domínio do OpenSearch Service para criá-lo.
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
Nesta solução, o Gateway da API passa solicitações para uma função do Lambda, que consulta o OpenSearch Service e retorna 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 do Lambda em https://console.aws.amazon.com/lambda/home
. 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
Usar o API Gateway permite a você criar uma API mais limitada e simplifica o processo de interação com a API _search
do OpenSearch. 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 Gateway da API em https://console.aws.amazon.com/apigateway/home
. No painel de navegação à esquerda, 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 |
---|---|
Nome | 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 Deploy (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
O domínio do OpenSearch Service deve permitir que a função do Lambda faça solicitações GET
ao índice movies
. 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, vá para o console do AWS Identity and Access Management (IAM), escolha Funções e procure 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 minucioso habilitado para o domínio, será necessário mapear a função para um usuário no OpenSearch Dashboards. Caso contrário, você receberá erros de permissões.
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 do OpenSearch Dashboards 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 Service.
-
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.