O Azure Functions é a resposta da Microsoft aos Lambdas da Amazon ou ao Cloud Functions do Google (também conhecido como arquitetura "sem servidor"). Elas oferecem uma maneira de implantar pequenos trechos de código e deixar que o Azure cuide do servidor subjacente. Como nunca as usei antes, pensei em experimentá-las além do "Hello, World", fazendo-as funcionar com o Couchbase Server.
Existem mais opções no Azure Functions além dos eventos HTTP simples (por exemplo, acionadores de Blob, webhooks do GitHub, acionadores de fila do Armazenamento do Azure etc.). Mas, para esta postagem do blog, vou me concentrar apenas em eventos HTTP. Criarei pontos de extremidade "Get" e "Set" simples que interagem com o Couchbase Server.
Antes de começar, você pode acompanhar o processo obtendo o código-fonte para esta postagem do blog no GitHub.
Além disso, leia o Publicação sobre Azure Functions e Lazy Initialization com o Couchbase Server. Ele contém uma atualização importante sobre o uso do Couchbase Server e do Azure Functions.
Como se preparar para desenvolver o Azure Functions
Para esta postagem do blog, decidi tentar Visualização do Visual Studio.
Fiz isso porque há um ferramenta útil para criar Projetos do Azure Function no Visual Studio.
Mas, no momento, isso só funciona para a versão de visualização. Você não precisa usar essas ferramentas para desenvolver o Azure Functions, mas elas tornaram o processo mais simples para mim.
Depois de instalar essas ferramentas, tudo o que precisei fazer foi acessar File→New→Project. Em seguida, em "Cloud" (Nuvem), selecione "Azure Functions" (Funções do Azure).
Depois de fazer isso, você terá um projeto vazio com alguns arquivos JSON. Clique com o botão direito do mouse no projeto, adicione um item e selecione "Azure Function".
Em seguida, você precisará selecionar o tipo de Função do Azure que deseja criar. Eu escolhi "HttpTrigger". Também escolhi "Anônimo" para manter esta postagem simples, mas, dependendo do seu caso de uso, talvez você queira exigir um token de autenticação. Depois de fazer isso, será gerado um shell muito simples de uma função (como uma classe C#). Você pode executar essa função localmente (na verdade, é para isso que serve o arquivo local.settings.json) para que possa testá-la sem implantar no Azure ainda.
Escrevendo uma função "Get"
Primeiro, decidi que queria duas Azure Functions: uma para "obter" um dado por ID e outra para "definir" um novo dado. Comecei definindo a forma dos meus dados com um simples POCO C#:
1 2 3 4 5 6 |
público classe MeuDocumento { público string Nome { obter; definir; } público int Tamanho do calçado { obter; definir; } público decimal Equilíbrio { obter; definir; } } |
Aqui está a função do Azure que escrevi para "obter" esse documento do Couchbase Server:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
público estático assíncrono Tarefa<HttpResponseMessage> Obter([Acionador http(Nível de autorização.Anônimo, "obter", Rota = nulo)]HttpRequestMessage req, Rastreador registro) { // analisar parâmetro de consulta var id = req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Comparar(q.Chave, "id", verdadeiro) == 0) .Valor; usando (var agrupamento = GetCluster()) { usando (var balde = GetBucket(agrupamento)) { var doc = aguardar balde.GetAsync<MeuDocumento>(id); retorno req.CreateResponse(HttpStatusCode.OK, doc.Valor, novo JsonMediaTypeFormatter()); } } } |
Alguns aspectos a serem observados:
- Removo o
"post"
que foi gerado pela ferramenta, pois quero que isso seja apenas um"obter"
função. - Analisar o parâmetro de consulta parece ser muito código extra para esse caso simples. Como alternativa, você pode criar uma "função com parâmetros"
GetCluster
eGetBucket
será discutido mais adiante neste post. Mas a história resumida é que eu quero que esse código funcione tanto localmente quanto implantado no Azure
Em seguida, execute essa função localmente e você obterá uma tela de console semelhante a esta:
Na parte inferior, você notará que ele informa o(s) URL(s) da Função Azure. Supondo que eu tivesse um documento no Couchbase (ainda não tenho), eu poderia criar uma solicitação HTTP com uma ferramenta como o Postman para: http://localhost:7071/api/HttpTriggerCsharpGet?id=123456
Atualmente, se eu fizer isso, receberei "null" como resposta (já que não tenho nenhum código de validação ou verificação de erros). Portanto, vamos seguir em frente e criar uma função "Set".
Escrever uma função "Set"
A função "Set" será um pouco diferente. Quero que as informações do documento sejam POSTADAS para ela e que ela retorne uma mensagem como "Novo documento inserido com ID 123456".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
público estático assíncrono Tarefa<HttpResponseMessage> Conjunto([Acionador http(Nível de autorização.Anônimo, "post", Rota = nulo)] MeuDocumento req, Rastreador registro) { var id = Guia.NovoGuia().ToString(); usando (var agrupamento = GetCluster()) { usando (var balde = GetBucket(agrupamento)) { aguardar balde.InsertAsync(id, req); } } retorno novo HttpResponseMessage { Conteúdo = novo StringContent($"Novo documento inserido com ID {id}"), StatusCode = HttpStatusCode.OK }; } |
Essa função tem um formato semelhante ao da função Get, mas há alguns aspectos importantes a serem observados:
- Há apenas
"post"
no atributo HttpTrigger. - Em vez de
HttpRequestMessage
como primeiro parâmetro, decidi usarMeuDocumento
e deixar que o Azure Functions faça a vinculação para mim. - Como não tenho
HttpRequestMessage
Não posso chamar seuCreateResponse
então, em vez disso, eu instancio um novo métodoHttpResponseMessage
diretamente para retornar a mensagem de sucesso no final.
Para criar uma solicitação no Postman, usarei um URL de http://localhost:7071/api/HttpTriggerCsharpSet
. Nos cabeçalhos, definirei Tipo de conteúdo
para "application/json". Por fim, o corpo será JSON:
1 2 3 4 5 |
{ "Nome": "matthew", "Saldo": 107.18, "ShoeSize" (tamanho do sapato): 14 } |
Agora, quando eu fizer um POST para o endpoint, receberei uma mensagem de resposta do tipo "Novo documento inserido com ID f05ea97e-7c2f-4f88-b72d-19756f6a6f35".
Conexão com o servidor Couchbase
Eu não mencionei como essas funções se conectam ao Couchbase Server.
Anteriormente, mencionei dois métodos, GetCluster
e GetBucket
que se conectarão ao cluster e ao bucket, respectivamente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
privado estático Aglomerado GetCluster() { var uri = Gerenciador de configuração.Configurações do aplicativo["couchbaseUri"]; retorno novo Aglomerado(novo Configuração de cliente { Servidores = novo Lista<Uri> { novo Uri(uri) } }); } privado estático IBucket GetBucket(Aglomerado agrupamento) { var bucketName = Gerenciador de configuração.Configurações do aplicativo["couchbaseBucketName"]; var bucketPassword = Gerenciador de configuração.Configurações do aplicativo["couchbaseBucketPassword"]; retorno agrupamento.OpenBucket(bucketName, bucketPassword); } |
Neste ponto, a maior parte desse código deve ser familiar se você já tiver usado o Couchbase Server e o Couchbase .NET SDK antes. Estou me conectando a um cluster de nó único e, em seguida, conectando um bucket que tem uma senha definida (estou usando o Couchbase Server 4.6).
Porém, o importante a ser destacado aqui é o uso de Configuration.AppSettings
. No local.settings.json
adicionei essas configurações do Couchbase à seção Value:
1 2 3 4 5 6 7 8 9 10 |
{ "IsEncrypted": falso, "Valores": { "AzureWebJobsStorage": "", "AzureWebJobsDashboard": "", "couchbaseUri": "http://localhost:8091", "couchbaseBucketName": "azurefunctions", "couchbaseBucketPassword": "Senha88!" } } |
Ao executar o Azure Functions localmente, esse arquivo é usado para configuração. Tenho o Couchbase Server em execução localmente com um bucket chamado "azurefunctions". Qualquer coisa em "Values" pode ser acessada por meio de Configuration.AppSettings
.
Implantação no Azure
Antes de implantar o Azure Functions, precisarei criar um cluster do Couchbase no Azure. Isso é muito fácil de fazer, graças ao excelente trabalho de Ben Lackey no Azure Marketplace. Depois de implantado, a implantação do Azure Functions também é fácil, graças ao Visual Studio.
Implantação do Couchbase Server no Azure
Aqui está um vídeo curto que o orienta no processo de criação de um cluster do Couchbase Server no Azure.
[youtube https://www.youtube.com/watch?v=q9mBBu0YqJI&w=560&h=315]
Para o meu exemplo, segui esse vídeo à risca. Aqui está a etapa 1, em que configuro o nome de usuário, a senha e o grupo de recursos.
Para a segunda etapa, criei apenas um cluster de nó único na VM menor e mais barata (DS1 v2). Criei 0 nós do Sync Gateway, pois não estou usando o Sync Gateway neste exemplo.
A etapa 3 é apenas um resumo, e a etapa 4 é uma confirmação. Levará de 3 a 5 minutos para que o cluster do Couchbase seja iniciado no Azure.
Depois que o cluster for criado, encontre o URL do primeiro nó do cluster (como demonstrado no vídeo acima). Meu URL era mais ou menos assim: http://vm0.server-hsmkrefstzg2t.northcentralus.cloudapp.azure.com:8091
. Acesse este URL, faça login e crie um bucket (chamei o meu de "azurefunctions", assim como fiz localmente).
Implantação do Azure Functions no Azure
Agora, o Couchbase Server está em execução. Então, vamos implantar o Azure Functions que irá interagir com ele.
Para começar, clique com o botão direito do mouse no projeto no Visual Studio e selecione "publicar". Você precisará criar um novo perfil de publicação na primeira vez que fizer isso, mas isso é fácil.
Dê às suas funções um nome de aplicativo, selecione uma assinatura, selecione um grupo de recursos (você pode criar um novo ou usar o mesmo grupo que criou acima para o Couchbase), selecione um plano de serviço e, por fim, uma conta de armazenamento. Você pode criar novas contas quando necessário.
Clique em "create" (criar) e esses itens começarão a ser criados no Azure (pode levar um ou dois minutos).
Experimentando o Azure Functions
Por fim, lembre-se de que o Azure Functions precisa saber o URI, o nome do bucket e a senha para se conectar ao Couchbase Server. Essas informações estão em local.settings.json, mas esse arquivo não é usado para implantações reais do Azure.
No portal do Azure, navegue até a função do Azure (chamei a minha de cbazurefunctions) e selecione "Configurações do aplicativo". Em "Configurações do aplicativo", insira essas três configurações: couchbaseUri, couchbaseBucketName e couchbaseBucketPassword.
Agora, repita o processo do Postman mencionado acima para testar as funções do Azure e verificar se elas funcionam. Seu URL pode variar, mas o meu foi http://cbazurefunctions.azurewebsites.net/.
Resumo
Esta é minha primeira vez experimentando o Azure Functions. Esta postagem do blog mostra uma demonstração simples, mas há outros fatores a serem considerados antes de você começar a usar isso na produção:
- Autenticação - Usei o Azure Functions anônimo para manter a simplicidade. O Azure Functions também pode fornecer tokens de autenticação para uso que impedem o acesso, exceto para usuários autorizados.
- Configurações do aplicativo - defini-las manualmente no portal pode não ser a melhor solução. Provavelmente há uma maneira de automatizar essa parte.
- HTTPS/TLS - Você provavelmente desejará ter algum nível de criptografia ao obter e publicar dados no Azure Functions. O exemplo acima transmite tudo em texto claro.
Alguma coisa que eu tenha perdido? Tem mais dicas ou sugestões para compartilhar e tornar esse processo mais fácil ou melhor? Deixe um comentário abaixo ou entre em contato comigo pelo Twitter @mgroves.