Interaja com o MongoDB Atlas em uma função do AWS Lambda usando C#
Avalie esse Tutorial
O AWS Lambda é uma ótima opção para desenvolvedores C# que procuram uma solução sólida sem servidor com muitas opções de integração com o restante do ecossistema da AWS. Quando um banco de dados é necessário, a leitura e a gravação no MongoDB Atlas na velocidade da luz é fácil, pois os bancos de dados do Atlas podem ser instanciados no mesmo centro de dados que a função do AWS Lambda.
Neste tutorial, aprenderemos como criar uma função sem servidor C# que gerencia eficientemente o número de conexões do MongoDB Atlas para tornar sua função Lambda o mais escalável possível.
- Conhecimento da linguagem de programação C#.
- MongoDB Atlas cluster com dados de amostra, acesso à rede (firewall) e funções de usuário já configuradas.
Este tutorial passo a passo do MongoDB Atlas o orientará na criação de um banco de dados do Atlas (camada gratuita disponível) e no carregamento dos dados de amostra.
Abriremos o acesso à rede a qualquer IP recebido para manter este tutorial simples e fazer com que ele funcione com a camada gratuita do Atlas cluster. Veja como adicionar um IP ao seu projeto Atlas. Adicionando 0.0.0.0 significa que qualquer IP externo pode acessar seu cluster.
Em um ambiente de produção, você deve restringir o acesso e seguir as melhores práticas de segurança do MongoDB, incluindo o uso de emparelhamento de rede entre o AWS Lambda e o MongoDB Atlas. A camada do cluster gratuito não suporta emparelhamento.
No Visual Studio, crie um projeto básico do AWS lambda usando o modelo de projeto "AWS Lambda Project (.NET Core - C#)" com o esquema da "Função vazia". Usaremos isso como base deste tutorial. Aqui está o tutorial oficial da AWS para criar esse projeto, mas essencialmente:
- Abra o Visual Studio e, no menu Arquivo, escolha Novo, Projeto.
- Crie um novo projeto "AWS Lambda Project (.NET Core - C#)".
- Chamaremos o projeto de "AWSLambda1."
Siga o tutorial oficial da AWS acima para garantir que você possa carregar o projeto no Lambda e que ele seja executado. Se sim, estamos prontos para fazer alterações para nos conectar ao MongoDB a partir do AWS Lambda!
Em nosso projeto, a classe principal é chamada
Function
. Ele será instanciado toda vez que a função Lambda for acionada. Dentro, temos um método chamado FunctionHandler
, (Function:: FunctionHandler
), que designaremos a Lambda como ponto de entrada.Para se conectar ao MongoDB, é necessário adicionar o pacote MongoDB.Driver (da MongoDB Inc) aos pacotes do seu projeto.
Em seguida, adicione os seguintes namespaces na parte superior do seu arquivo de origem:
1 using MongoDB.Bson; 2 using MongoDB.Driver;
Na classe Function, declararemos um membro MongoClient estático. É fundamentaltê-lo como um membro
static
porque queremos compartilhá-lo em várias instâncias que o AWS Lambda poderia gerar.Embora não tenhamos controle total ou visibilidade do ambiente sem servidor do Lambda, esta é a prática recomendada para manter o número de conexões de volta ao Atlas cluster no mínimo.
Se não declararmos MongoClient como
static
, cada instância de classe criará seu próprio conjunto de recursos. Em vez disso, o MongoClient estático é compartilhado entre várias instâncias de classe depois que uma primeira instância foi criada (início a quente). Você pode ler mais detalhes técnicos sobre o gerenciamento de conexões do MongoDB Atlas com o AWS Lambda.Também adicionaremos um método
CreateMongoClient()
que inicializa o cliente MongoDB quando a classe é instanciada. Agora, as coisas devem ficar assim:1 public class Function 2 { 3 private static MongoClient? Client; 4 private static MongoClient CreateMongoClient() 5 { 6 var mongoClientSettings = MongoClientSettings.FromConnectionString(Environment.GetEnvironmentVariable("MONGODB_URI")); 7 return new MongoClient(mongoClientSettings); 8 } 9 10 static Function() 11 { 12 Client = CreateMongoClient(); 13 } 14 ... 15 }
Para manter suas credenciais do MongoDB seguras, sua connection string pode ser armazenada em uma variável de ambiente Amazon Web Services Lambda . A connection string tem a seguinte aparência abaixo, e aqui está como obtê-la no Atlas.
mongodb+srv://USER:PASSWORD@INSTANCENAME.owdak.mongodb.net/?retryWrites=true&w=majority
Observação: o Visual Studio pode armazenar a cadeia de conexão com suas credenciais em um arquivo aws-lambda-tools-defaults.json em algum momento, portanto, não inclua isso em um repositório de código.
Se você quiser usar variáveis de ambiente na Ferramenta de Teste Mock Lambda, deverá criar um perfil específico da "Ferramenta de Teste Mock Lambda" com seu próprio conjunto de variáveis de ambiente no
aws-lambda-tools-defaults.json
(aqui está um exemplo).Você pode saber mais sobre variáveis de ambiente do AWS Lambda. No entanto, esteja ciente de que essas variáveis podem ser definidas de dentro do seu Visual Studio ao publicar no AWS Lambda ou diretamente no console de gerenciamento da AWS em sua página de função do AWS Lambda.
Para fins de teste, e se você não quiser se dar ao trabalho, algumas pessoas codificam a connection string da seguinte forma:
1 var mongoClientSettings = FromConnectionString("mongodb+srv://USER:PASSWORD@instancename.owdak.mongodb.net/?retryWrites=true&w=majority");
Por fim, podemos modificar a função FunctionHandler() para ler o primeiro documento de sample_airbnb.listingsAndReviews banco de dados e collection que pré-carregamos nos pré-requisitos.
As declarações try/catch não são obrigatórias, mas podem ajudar a detectar pequenos problemas, como o firewall que não está sendo configurado ou outros erros de configuração.
1 public string FunctionHandler(string input, ILambdaContext context) 2 { 3 if (Client != null) 4 { 5 try 6 { 7 var database = Client.GetDatabase("sample_airbnb"); 8 var collection = database.GetCollection<BsonDocument>("listingsAndReviews"); 9 var result = collection.Find(FilterDefinition<BsonDocument>.Empty).First(); 10 return result.ToString(); 11 } 12 catch 13 { 14 return "Handling failed"; 15 } 16 } else 17 { 18 return "DB not initialized"; 19 } 20 }
Usando a collection "listingsAndReviews" (uma "tabela" no gíria SQL) no banco de dados "sample_airbnb", o código obtém o primeiro documento da collection.
collection.Find()
normalmente usa uma query do MongoDB construída como um BsonDocument, mas, neste caso, precisamos apenas de uma query vazia.É hora de carregá-lo no AWS Lambda. No Solution Explorer, clique com o botão direito do mouse no projeto e selecione "Publicar no AWS Lambda." Anteriormente, você pode ter feito isso ao configurar o projeto usando o tutorial oficial do AWS Lambda C#.
Se for a primeira vez que você publica essa função, reserve um tempo para dar um nome a ela (usamos " mongdb-csharp-function-001"). Ele será utilizado durante a criação inicial da função Lambda.
Na captura de tela abaixo, as informações do manipulador defunção do AWS Lambda ("Handler") são essenciais, pois informam ao Lambda qual método chamar quando um evento é acionado. O formato geral é Conjunto::Namespace.ClassName::MethodName
No nosso caso, o manipulador é
AWSLambda1::AWSLambda1.Function::FunctionHandler
.Se a opção estiver marcada, esta caixa de diálogo salvará essas opções no arquivo
aws-lambda-tools-defaults.json
.Clique em "Avançar" para ver a segunda tela de upload. O aspecto mais importante disso são as variáveis de ambiente, como a cadeia de conexão.
Quando estiver pronto, clique em "Upload". O Visual Studio criará/atualizará sua função do Lambda para a AWS e iniciará uma janela de teste na qual você poderá definir sua entrada de exemplo e executar o método para ver sua resposta.
Nossa função Lambda espera uma string de entrada, então usaremos a string "hello" em nossa Sample Input e, em seguida, clicaremos no botão "Invoke". A resposta da execução será enviada para o campo "Resposta" à direita. Como esperado, o primeiro registro do banco de dados é convertido em uma string, como mostrado abaixo.
Acabamos de aprender como criar uma função sem servidor C# AWS Lambda de forma eficiente criando e compartilhando um cliente MongoDB e conectando várias instâncias de classe. Se você está considerando construir com uma arquitetura sem servidor e AWS Lambda, o MongoDB Atlas é uma ótima opção.
A flexibilidade do nosso document model facilita o início rápido e a evolução da sua estrutura de dados ao longo do tempo. Crie um Atlas cluster gratuito agora para testá-lo.
Se você quiser saber mais sobre nosso driver C# do MongoDB, consulte a documentação atualizada continuamente. Você pode fazer muito mais com o MongoDB Atlas, e nosso Início Rápido em C# é um ótimo primeiro passo em sua viagem para o MongoDB.