Tutorial: criação de uma aplicação de pesquisa com o Amazon OpenSearch Service - OpenSearch Serviço Amazon

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.

Diagrama de fluxo do aplicativo de pesquisa.
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 _bulk para adicionar os 5.000 documentos ao índice movies:

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
  1. Abra um prompt de comando e crie um diretório de projeto do my-opensearch-function. Por exemplo, no macOS:

    mkdir my-opensearch-function
  2. Navegue até o diretório de projeto do my-sourcecode-function.

    cd my-opensearch-function
  3. 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
  4. 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
  5. 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 .
  6. 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

  1. Navegue até o console do Lambda em https://console.aws.amazon.com/lambda/home. No painel de navegação à esquerda, escolha Funções.

  2. Selecione Criar função.

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

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

  5. 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 opensearch-lambda.lambda_handler. Para obter mais informações, consulte Manipulador de função do Lambda em Python.

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

  1. Navegue até o console do Gateway da API em https://console.aws.amazon.com/apigateway/home. No painel de navegação à esquerda, escolha APIs.

  2. Localize a API REST (não privada) e escolha Compilar.

  3. Na página seguinte, localize a seção Criar nova API e verifique se a opção Nova API está selecionada.

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

  5. Selecione Criar API.

  6. Escolha Ações e Criar método.

  7. Select GET no menu suspenso e clique na marca de seleção para confirmar.

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

  1. Escolha Ações e Implantar API.

  2. Para Estágio da implantação), escolha Novo estágio e atribua o nome opensearch-api-test ao estágio.

  3. Escolha Deploy (Implantar).

  4. 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://some-id.execute-api.us-west-1.amazonaws.com/search-es-api-test). A solicitação requer um único parâmetro (q), 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.

  1. Navegue até o URL do OpenSearch Dashboards do domínio.

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

  3. Escolha Usuários mapeados e Gerenciar mapeamento.

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

  5. 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
  1. Faça download do sample-site.zip, descompacte-o e abra scripts/search.js em seu editor de texto de preferência.

  2. 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ável apigatewayendpoint deve assumir a forma de https://some-id.execute-api.us-west-1.amazonaws.com/opensearch-api-test.

  3. Abra index.html e tente executar pesquisas para thor, casa e alguns outros termos.

    Um exemplo de pesquisa por thor.

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:

  1. Habilite o CORS no recurso GET. Em Avançado, defina Access-Control-Allow-Credentials como 'true'.

  2. Reimplante a API no API Gateway [Ações, Implantar API].

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