
Nic Raboy é um defensor das modernas tecnologias de desenvolvimento móvel e da Web. Ele tem experiência em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experiências de desenvolvimento relacionadas a tornar o desenvolvimento móvel e da Web mais fácil de entender.
Há mais ou menos um ano, quando as funções como serviço (FaaS) começaram a se tornar populares, escrevi alguns tutoriais sobre o desenvolvimento de funções que usavam Couchbase como o banco de dados NoSQL. Por exemplo, Use o AWS Lambda e o API Gateway com Node.js e Couchbase NoSQL focado no Node.js, que é uma das minhas tecnologias de programação favoritas. No entanto, na época, minha outra tecnologia de programação favorita, a Golang, ainda não era compatível com o Amazon Web Services (AWS) Lambda. Avançando um pouco, a Golang agora é compatível com o Lambda e é incrivelmente fácil de usar em combinação com o Couchbase por causa da tecnologia bem elaborada Go SDK para o Couchbase.
Neste tutorial, vamos dar uma olhada em como criar uma função no AWS Lambda que se comunica com o Couchbase usando a linguagem de programação Go.
Criação de uma função Go Lambda para criar e consultar dados NoSQL
Como o Go agora é oficialmente compatível com o AWS, podemos usar o SDK oficial em vez de tentar criar algo próprio. Em seu **$GOPATH**, crie um novo projeto e execute os seguintes comandos:
|
1 2 3 4 |
bash go get github.com/aws/aws-lambda-go/lambda go get gopkg.in/couchbase/gocb.v1 go get github.com/satori/go.uuid |
Os comandos acima farão o download do Lambda SDK, bem como do Couchbase SDK para Golang. Também estamos baixando um pacote UUID que nos permitirá criar valores exclusivos que representarão nossas chaves de documento NoSQL.
Com as dependências disponíveis, crie um arquivo **main.go** e inclua o seguinte código padrão:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package main import ( "context" "encoding/json" "github.com/aws/aws-lambda-go/lambda" uuid "github.com/satori/go.uuid" gocb "gopkg.in/couchbase/gocb.v1" ) var bucket *gocb.Bucket type Todo struct { ID string `json:"id,omitempty"` Text string `json:"text,omitempty"` Type string `json:"type,omitempty"` } type LambdaRequest struct { Todo string `json:"todo"` } func Handler(ctx context.Context, request LambdaRequest) (string, error) { } func main() { cluster, _ := gocb.Connect("couchbase://COUCHBASE_HOST_HERE") cluster.Authenticate(gocb.PasswordAuthenticator{Username: "todos", Password: "123456"}) bucket, _ = cluster.OpenBucket("todos", "") lambda.Start(Handler) } |
Antes de entrarmos no design da função, vamos decompor o código acima.
Além de importar nossas dependências, estamos criando duas estruturas de dados nativas. A primeira Todo representará os dados com os quais planejamos trabalhar no aplicativo. Para maior clareza, vamos criar um aplicativo simples do tipo lista de tarefas que nos permitirá salvar itens de tarefas e consultá-los. A segunda estrutura de dados representará nossas solicitações de entrada para a função. As solicitações de entrada em nosso exemplo devem conter JSON com um todo propriedade ou nada.
Também estamos criando um balde que poderá ser acessada de qualquer outro lugar em nosso código. Dentro da variável principal podemos nos conectar à nossa instância do Couchbase e abrir esse bucket. É importante que sua instância do Couchbase não esteja sendo executada em localhost porque o Lambda, um serviço remoto, precisa ser capaz de acessá-lo.
Depois de configurar o banco de dados, podemos iniciar o Lambda e apontá-lo para o nosso Manipulador função. Em geral, cada função deve realizar uma tarefa específica, mas a nossa função tratará da consulta e da criação de dados.
Dê uma olhada no Manipulador código de função abaixo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
func Handler(ctx context.Context, request LambdaRequest) (string, error) { if request == (LambdaRequest{}) { var todos []Todo query := gocb.NewN1qlQuery("SELECT text FROM `todos` AS todos") rows, _ := bucket.ExecuteN1qlQuery(query, nil) var row Todo for rows.Next(&row) { todos = append(todos, row) } todosJson, _ := json.Marshal(todos) return string(todosJson), nil } todo := Todo{Text: request.Todo} bucket.Insert(uuid.Must(uuid.NewV4()).String(), todo, 0) todoJson, _ := json.Marshal(todo) return string(todoJson), nil } |
Quando a função Lambda é executada, queremos dar uma olhada no solicitação que chega. Se ela estiver vazia ou contiver apenas propriedades que não nos interessam, consultaremos nossos itens de todo. Usando N1QL podemos consultar o nosso bucket e retornar todos os itens como uma resposta JSON com string.
Se a entrada solicitação não estiver vazia, isso significa que queremos criar alguns dados em nosso banco de dados. Usando um UUID, podemos receber a solicitação e criar um novo documento sem expiração. Em seguida, os próprios dados são retornados.
Nossa função geral poderia ser projetada de forma mais elegante, mas o objetivo do que estamos fazendo deve estar claro. A configuração e o uso do Couchbase não são realmente diferentes de como o usamos em um aplicativo RESTful ou GraphQL, mas, desta vez, projetamos nosso código como uma função Lambda.
Com a função pronta para funcionar, podemos trabalhar em nossa implantação.
Implantação e teste da função AWS Lambda
Quando se trata do AWS Lambda, há certos requisitos que diferem de como podemos executar nosso aplicativo localmente. Por exemplo, o Lambda usa um sistema operacional específico e uma arquitetura potencialmente diferente da que estamos usando localmente. Por esse motivo, precisamos compilar nosso aplicativo de forma cruzada e, em seguida, empacotá-lo.
Na linha de comando, execute o seguinte:
|
1 2 3 |
bash GOOS=linux go build zip handler.zip ./binary-name |
Os comandos acima serão compilados para o Linux e criarão um arquivo do binário. Apenas certifique-se de alterar nome binário com o de seu nome binário real. Se o zíper não funcionar em seu sistema operacional, arquive-o manualmente.
Para obter mais informações sobre a compilação cruzada de aplicativos Go, consulte meu tutorial anterior sobre o assunto: Compilação cruzada de aplicativos Golang para uso em um Raspberry Pi.
Com o arquivo **handler.zip** disponível, vá para o diretório Console do AWS Lambda onde podemos criar uma nova função.
Ao criar a função, escolha os padrões, mas certifique-se de escolher um aplicativo Go 1.x, pois é isso que vamos implantar. Quando estiver no painel da função, não se preocupe em adicionar um acionador para este exemplo. Em vez disso, escolha carregar o código da função, que é o arquivo **handler.zip**. Para o **Handler**, certifique-se de usar o nome do binário do seu aplicativo.
Para testar nossa implementação, podemos criar um teste diretamente no painel. Na parte superior da tela, escolha configurar um novo evento de teste. Você pode nomear o evento de teste como quiser, mas adicione o seguinte como conteúdo da solicitação:
|
1 2 3 |
{ "todo": "Complete Taxes" } |
Depois de salvar o evento de teste, execute-o no painel e veja os resultados. Ele deve ter sido executado com êxito e você deve ter um novo documento no banco de dados do Couchbase.
Conclusão
Você acabou de ver como criar uma nova função AWS Lambda com a linguagem de programação Go que se comunica com Servidor Couchbase. O processo é bastante simples e pode ser ampliado com acionadores como o AWS Gateway para torná-lo um pouco mais útil do ponto de vista do uso.
No próximo tutorial, vamos dar uma olhada na expansão deste tutorial para oferecer suporte a dispositivos com o Amazon Alexa. Dessa forma, poderemos usar a Alexa como nosso acionador e criar ou consultar documentos com nossa voz.
Esta postagem faz parte do Programa de Redação da Comunidade Couchbase