Criando um localizador de restaurantes usando Atlas, Neurelo e AWS Lambda
Anaiya Raisinghani, Guru Kamat8 min read • Published Mar 08, 2024 • Updated Apr 02, 2024
Avalie esse Tutorial
Pronto para criar um aplicativo robusto e eficiente que possa processar rapidamente dados em tempo real, capaz de se adaptar a ambientes em mudança e totalmente personalizável com integração perfeita?
A trifeta dos sonhos do desenvolvedor, MongoDB Atlas, Neurelo e AWS Lambda, impulsionará seus aplicativos baseados em nuvem de maneiras que você não sabia que eram possíveis! Com essa combinação letal, você pode criar uma grande variedade de aplicativos, como o localizador de restaurantes que criaremos neste tutorial.
Essa combinação de plataformas pode ajudar os desenvolvedores a criar funções sem servidor escaláveis, econômicas e de alto desempenho. Alguns grandes benefícios são que as funções Lambda usadas ainda permanecem sem estado — as operações de dados agora são chamadas de API sem estado e não há conexões com estado abertas a cada invocação do Lambdaquando o Nurelo é incorporado ao aplicativo. Também estamos permitindo maior desempenho e custos mais baixos, pois nenhum tempo de execução (e cobrança) é gasto na configuração ou na desmontagem de conexões estabelecidas. Isso também permite uma simultaneidade significativamente maior de invocações do Lambda, pois podemos aproveitar o pool de conexões integrado por meio do Nurelo, o que permite que você abra menos conexões em sua instância do MongoDB.
Examinaremos como configurar adequadamente a infraestrutura de integração para garantir que você esteja preparado para o sucesso e, em seguida, nos aprofundaremos na criação real de nosso aplicativo. No final, teremos um localizador de restaurantes que poderemos usar para pesquisar restaurantes que se encaixem em nossos critérios desejados. Vamos começar!
- conta AWS; O acesso lambda é necessário
Nosso primeiro passo é criar um cluster MongoDB gratuito e baixar o conjunto de dados de amostra. Para obter ajuda sobre como fazer isso, consulte nosso tutorial.
Para este tutorial, usaremos a coleção
sample_restaurants
que está localizada dentro do conjunto de dados de amostra. Certifique-se de ter incluído o acesso ao endereço IP correto para este tutorial, juntamente com um nome de usuário e uma senha seguros, pois você precisará deles durante todo o processo.Quando seu cluster estiver instalado e funcionando, podemos começar a configurar nosso projeto Neurelo.
Depois de criarmos nosso cluster MongoDB, precisamos criar um projeto em Nurelo. Para obter ajuda nesta etapa, consulte nosso primeiro tutorial desta série, Nurelo e MongoDB: Começando e Diversão Extras.
Salve sua chave API em algum lugar seguro. Caso contrário, você precisará criar uma nova chave se ela se perder. Além disso, verifique se seu projeto Neurelo está conectado ao seu cluster MongoDB. Para obter ajuda para obter uma cadeia de conexão do MongoDB, temos instruções para orientá-lo. Agora, podemos prosseguir para a configuração de nossa função AWS Lambda.
Faça login em sua conta da AWS e acesse o Lambda por meio da barra de pesquisa ou na seção “Services”. Clique no botão laranja "Create function" e certifique-se de pressionar a opção "Author from scratch" na tela que aparece. Selecione um nome para sua função — estamos usando “ConnectTest” para simplificar as coisas — e, em seguida, escolha “Python 3.12” para seu tempo de execução, já que este é um tutorial de Python! Sua função Lambda deve ter a seguinte aparência antes de pressionar "Create function. "
Depois de acessar a página “Function overview”, podemos começar a escrever nosso código para integrar perfeitamente o MongoDB Atlas, o Neurelo e o AWS Lambda. Vamos mergulhar nisso.
Felizmente, não precisamos importar nenhum requisito para este tutorial de função Lambda e podemos escrever nosso código diretamente na função que acabamos de criar.
O primeiro passo é importar os pacotes
urllib3
e json
com a linha:1 import urllib3, json
Esses dois pacotes contêm tudo o que precisamos para lidar com nossas connection strings e fazer com que não precisemos escrever nosso código em um IDE separado.
Depois de termos nossas importações, podemos configurar nossa chave de API para nosso ambiente Nurelo. Estamos usando um espaço reservado
API_KEY
e, para facilitar neste tutorial, você pode colocar sua chave diretamente nele. Mas não é uma boa prática codificar suas chaves no código e, em um ambiente de produção, isso nunca deve ser feito.1 # Put in your API Key to connect to your Neurelo environment 2 NEURELO_API_KEY = ‘API_KEY’
Depois de configurar a conexão da chave da API, podemos configurar nossos cabeçalhos para a chamada à REST API. Para isso, podemos usar a função
lambda_function
gerada automaticamente e editá-la para atender melhor às nossas necessidades:1 def lambda_handler(event, context): 2 3 # Setup the headers 4 headers = { 5 'X-API-KEY': NEURELO_API_KEY 6 } 7 8 # Creating a PoolManager instance for sending HTTP requests 9 http = urllib3.PoolManager()
Aqui, estamos criando um dicionário chamado
headers
para definir o valor de nossa chave de API. Esta etapa é necessária para que Nurelo possa autenticar nossa solicitação de API e possamos retornar nossos documentos necessários. Em seguida, estamos utilizando a classePoolManager
para gerenciar nossas conexões de servidor. Essa é uma maneira eficiente de garantir que estamos reutilizando conexões com o Lambda em vez de criar uma nova conexão com cada chamada individual. Para este tutorial, estamos usando apenas uma conexão, mas se você tiver um Lambda mais complexo ou um projeto com a necessidade de várias conexões, poderá ver um pouco mais da classePoolManager
.Agora, estamos prontos para configurar nossa primeira chamada de API! Lembre-se de que, nesta primeira etapa, estamos nos conectando à nossa coleção "restaurants " dentro do nosso banco de dados
sample_restaurants
e estamos devolvendo nossos documentos necessários.Decidimos que queremos recuperar uma lista de restaurantes desta coleção que se atendam a critérios específicos: Esses restaurantes estão localizados no bairro de Brooklyn, em Nova York, e servem comida típica da América. Antes de escrever o código abaixo, sugerimos que você pare um segundo para examinar o banco de dados de exemplo para visualizar os campos dentro de nossos documentos.
Então, agora que definimos os parâmetros de consulta nos quais estamos interessados, vamos traduzi-los em uma solicitação de consulta. Vamos usar três parâmetros para nossa consulta: "filter," "take," e "select." Estas são as mesmas chaves de parâmetro do nosso primeiro artigo desta série, portanto, consulte-as se precisar de ajuda. Estamos usando o parâmetro "filter" para garantir que estamos recebendo restaurantes que se encaixam em nossos critérios de estar no Brooklyn e que são americanos, o parâmetro "take" é para que retornemos apenas cinco documentos em vez de milhares (nossa coleção tem mais de 25,000 documentos!), e o parâmetro "select" é para que apenas nossos campos específicos sejam retornados em nossa saída.
Nossa solicitação de consulta ficará assim:
1 # Define the query parameters 2 params1 = { 3 'filter': '{"AND": {"borough": {"equals": "Brooklyn"}, "cuisine": {"equals": "American"}}}', 4 'take': '5', 5 'select': '{"id": false, "name": true, "borough": true, "cuisine": true}', 6 }
Não se lembre de enviar uma solicitação GET com os parâmetros necessários e configurar algumas declarações de impressão para que possamos ver se nossa solicitação foi bem-sucedida. Depois de concluído, todo o bloco de código para nossa Parte 1 deve ser semelhante a este:
1 import urllib3, json 2 3 # Configure the API Key for our Neurelo environment 4 NEURELO_API_KEY = 'API_KEY' 5 6 def lambda_handler(event, context): 7 8 # Setup the headers 9 headers = { 10 'X-API-KEY': NEURELO_API_KEY 11 } 12 13 # Creating a PoolManager instance for sending HTTP requests 14 http = urllib3.PoolManager() 15 16 # Choose the "restaurants" collection from our Neurelo environment connected to 'sample_restaurants' 17 api1 = 'https://us-east-2.aws.neurelo.com/rest/restaurants' 18 19 # Define the query parameters 20 params1 = { 21 'filter': '{"AND": {"borough": {"equals": "Brooklyn"}, "cuisine": {"equals": "American"}}}', 22 'take': '5', 23 'select': '{"id": false, "name": true, "borough": true, "cuisine": true}', 24 } 25 26 # Send a GET request with URL parameters 27 response = http.request("GET", api1, headers=headers, fields=params1) 28 29 # Print results if the request was successful 30 if response.status == 200: 31 # Print the JSON content of the response 32 print ('Restaurants Endpoint: ' + json.dumps(json.loads(response.data), indent=4))
E nossa saída ficará assim:
Parabéns! Como você pode ver, devolvemos com sucesso cinco restaurantes de culinária americana localizados no Brooklyn e integramos com sucesso nosso cluster MongoDB ao nosso projeto Neurelo e usamos o AWS Lambda para acessar nossos dados.
Agora que configuramos tudo, vamos para a segunda parte do nosso tutorial, onde filtraremos nossos resultados com um endpoint de API personalizado para os melhores restaurantes possíveis.
Antes de podermos chamar nosso endpoint personalizado para filtrar os resultados desejados, precisamos criar um. Embora o Neurelo tenha uma grande lista de endpoints gerados automaticamente disponíveis para seu projeto, às vezes precisamos de um endpoint que possamos personalizar com uma query complexa para retornar informações detalhadas. No banco de dados de amostra em nosso cluster, podemos ver que há um campo
grades
onde existem a nota e a pontuação recebidas por cada restaurante.Então, e se quisermos devolver documentos com base em suas pontuações? Digamos que queremos expandir nossa Atlas Search e encontrar restaurantes que são realmente bons restaurantes.
Go até Nurelo e acesse a aba "Definitions " no lado esquerdo da tela. Go para a guia "Custom Queries " e crie uma query complexa chamada "getGoodRestaurants. " Para obter mais ajuda sobre esta seção, consulte o primeiro artigo desta série para obter uma explicação mais detalhada.
Queremos filtrar restaurantes em que as notas mais recentes sejam "A " ou "B, " e a pontuação da nota mais recente seja maior que 10. Em seguida, queremos agregar os restaurantes por cozinha e bairro e listar o nome do restaurante, para que possamos saber onde ir!
Nossa consulta personalizada ficará assim:
1 { 2 "aggregate": "restaurants", 3 "pipeline": [ 4 { 5 "$match": { 6 "borough": "Brooklyn", 7 "cuisine": "American", 8 "grades.0.grade": { 9 "$in": [ 10 "A", 11 "B" 12 ] 13 }, 14 "grades.1.grade": { 15 "$in": [ 16 "A", 17 "B" 18 ] 19 }, 20 "grades.0.score": { 21 "$gt": 10 22 } 23 } 24 }, 25 { 26 "$limit": 5 27 }, 28 { 29 "$group": { 30 "_id": { 31 "cuisine": "$cuisine", 32 "borough": "$borough" 33 }, 34 "restaurants_info": { 35 "$push": { 36 "name": "$name" 37 } 38 } 39 } 40 } 41 ], 42 "cursor": {} 43 }
Ótimo! Agora que nossa consulta personalizada está pronta, clique no botão “Commit” na parte superior da tela, adicione uma mensagem de confirmação e verifique se a opção “Deploy to environment” está selecionada. Essa é uma etapa crucial que garantirá que estamos confirmando nossa consulta personalizada no repositório de definições do projeto e implantando as mudanças em nosso ambiente.
Agora, podemos voltar ao Lambda e incorporar nosso segundo endpoint para retornar restaurantes com pontuações altas que servem a comida desejada no local desejado.
Adicione este código ao final do código anterior que escrevemos.
1 # Choose the custom-query endpoint from our Neurelo environment connected to 'sample_restaurants' 2 api2 = 'https://us-east-2.aws.neurelo.com/custom/getGoodRestaurants' 3 4 # Send a GET request with URL parameters 5 response = http.request("GET", api2, headers=headers) 6 7 if response.status == 200: 8 # Print the JSON content of the response 9 print ('Custom Query Endpoint: ' + json.dumps(json.loads(response.data), indent=4))
Aqui, estamos escolhendo nosso endpoint personalizado,
getGoodRestaurants
, e, em seguida, enviando uma solicitação GET para adquirir as informações necessárias.Implemente as alterações no Lambda e clique no botão "Test ".
Sua saída ficará assim:
Como você pode ver nos resultados acima, recebemos uma amostra de cinco restaurantes de culinária americana no bairro do Brooklyn que atendem aos nossos critérios e são considerados bons restaurantes!
Neste tutorial, abordamos como integrar adequadamente um MongoDB Atlas cluster com nosso projeto Neurelo e retornar os resultados desejados usando o AWS Lambda. Mostramos todo o processo de utilização de nossos endpoints de API automatizados do projeto Neurelo e até mesmo como usar endpoints exclusivos e totalmente personalizáveis!
Para obter mais ajuda com o uso do MongoDB Atlas, Nureloe AWS Lambda, acesse a documentação com link específico.
Este tutorial é o segundo de nossa série. Confira o primeiro tutorial: Neurelo e MongoDB: Começando e Diversão Extras.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.