Nic Raboy es un defensor de las tecnologías modernas de desarrollo web y móvil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con facilitar la comprensión del desarrollo web y móvil.
Hace más o menos un año, cuando las funciones como servicio (FaaS) acababan de empezar a popularizarse, escribí algunos tutoriales sobre el desarrollo de funciones que hacían uso de Couchbase como la base de datos NoSQL. Por ejemplo, Utilizar AWS Lambda y API Gateway con Node.js y Couchbase NoSQL se centró en Node.js, que es una de mis tecnologías de programación favoritas. Sin embargo, en ese momento, mi otra tecnología de programación favorita, Golang, aún no era compatible con Amazon Web Services (AWS) Lambda. Un poco más adelante, Golang ahora es compatible con Lambda y es increíblemente fácil de usar en combinación con Couchbase debido a la bien hecha Go SDK para Couchbase.
En este tutorial, vamos a echar un vistazo a cómo construir una función en AWS Lambda que se comunica con Couchbase utilizando el lenguaje de programación Go.
Creación de una función Go Lambda para crear y consultar datos NoSQL
Dado que Go es ahora soportado oficialmente por AWS, podemos hacer uso del SDK oficial en lugar de tratar de construir algo propio. Dentro de tu **$GOPATH**, crea un nuevo proyecto y ejecuta los siguientes comandos:
1 2 3 4 |
bash ir consiga github.com/aws/aws-lambda-ir/lambda ir consiga gopkg.en/couchbase/gocb.v1 ir consiga github.com/satori/ir.uuid |
Los comandos anteriores descargarán el SDK de Lambda así como el SDK de Couchbase para Golang. También estamos descargando un paquete UUID que nos permitirá crear valores únicos que representarán nuestras claves de documentos NoSQL.
Con las dependencias disponibles, crea un archivo **main.go** e incluye el siguiente código boilerplate:
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 |
paquete principal importar ( "contexto" "encoding/json" "github.com/aws/aws-lambda-go/lambda" uuid "github.com/satori/go.uuid" gocb "gopkg.in/couchbase/gocb.v1" ) var cubo *gocb.Cubo tipo Todo struct { ID cadena `json:"id,omitempty"` Texto cadena `json:"text,omitempty"` Tipo cadena `json:"tipo,omitempty"` } tipo LambdaRequest struct { Todo cadena `json:"todo"` } func Manipulador(ctx contexto.Contexto, solicitar LambdaRequest) (cadena, error) { } func principal() { grupo, _ := gocb.Conectar("couchbase://COUCHBASE_HOST_HERE") grupo.Autentificar(gocb.PasswordAuthenticator{Nombre de usuario: "todos", Contraseña: "123456"}) cubo, _ = grupo.OpenBucket("todos", "") lambda.Inicio(Manipulador) } |
Antes de entrar en el diseño de la función, vamos a desglosar el código anterior.
Además de importar nuestras dependencias, estamos creando dos estructuras de datos nativas. La primera Todo
representará los datos con los que vamos a trabajar dentro de la aplicación. Para mayor claridad, vamos a crear una sencilla aplicación del tipo lista de tareas pendientes que nos permitirá guardar elementos de tareas pendientes y consultarlos. La segunda estructura de datos representará nuestras peticiones entrantes a la función. En nuestro ejemplo, las peticiones entrantes deben contener JSON con un carácter todo
propiedad o nada en absoluto.
También estamos creando un cubo
que será accesible desde cualquier otra parte de nuestro código. Dentro de la principal
podemos conectarnos a nuestra instancia de Couchbase y abrir ese bucket. Es importante que tu instancia de Couchbase no se esté ejecutando en localhost
porque Lambda, un servicio remoto, necesita poder alcanzarlo.
Después de configurar la base de datos, podemos iniciar Lambda y apuntarlo a nuestra Manipulador
función. En general, cada función debe realizar una tarea específica, pero nuestra función se encargará tanto de la consulta como de la creación de datos.
Eche un vistazo al Manipulador
código de función a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
func Manipulador(ctx contexto.Contexto, solicitar LambdaRequest) (cadena, error) { si solicitar == (LambdaRequest{}) { var todos []Todo consulta := gocb.NuevoN1qlQuery("SELECT text FROM `todos` AS todos") filas, _ := cubo.EjecutarN1qlQuery(consulta, nil) var fila Todo para filas.Siguiente(&fila) { todos = añadir(todos, fila) } todosJson, _ := json.Mariscal(todos) devolver cadena(todosJson), nil } todo := Todo{Texto: solicitar.Todo} cubo.Inserte(uuid.Debe(uuid.NuevoV4()).Cadena(), todo, 0) todoJson, _ := json.Mariscal(todo) devolver cadena(todoJson), nil } |
Cuando se ejecuta la función Lambda, queremos ver el valor solicitar
que entra. Si está vacío o sólo contiene propiedades que no nos interesan, vamos a consultar nuestros elementos de tareas pendientes. Utilizando N1QL podemos consultar nuestro bucket y devolver todos los elementos como una respuesta JSON stringificada.
Si la entrada solicitar
no está vacía, significa que queremos crear algunos datos en nuestra base de datos. Usando un UUID, podemos tomar la petición y crear un nuevo documento sin caducidad. A continuación, se devuelven los datos en sí.
Nuestra función en general podría ser más elegantemente diseñada, pero el punto de lo que estamos haciendo debe ser claro. La configuración y el uso de Couchbase no es realmente diferente de cómo lo usamos en una aplicación RESTful o GraphQL, pero esta vez hemos diseñado nuestro código como una función Lambda.
Con la función lista, podemos trabajar para desplegarla.
Implementación y prueba de la función AWS Lambda
Cuando se trata de AWS Lambda hay ciertos requisitos que difieren de cómo podríamos ejecutar nuestra aplicación localmente. Por un lado, Lambda utiliza un sistema operativo concreto y una arquitectura potencialmente diferente de la que utilizamos localmente. Por este motivo, tenemos que compilar de forma cruzada nuestra aplicación y luego empaquetarla.
Desde la línea de comandos, ejecute lo siguiente:
1 2 3 |
bash GOOS=linux ir construya zip manipulador.zip ./binario-nombre |
Los comandos anteriores compilarán para Linux y crearán un archivo con el binario. Sólo asegúrese de cambiar nombre binario
con el de su nombre binario real. Si el zip
no funciona en tu sistema operativo, archívalo manualmente.
Para obtener más información sobre la compilación cruzada de aplicaciones Go, consulte mi tutorial anterior sobre el tema: Compilación cruzada de aplicaciones Golang para su uso en una Raspberry Pi.
Con el archivo **handler.zip** disponible, vaya a la carpeta Consola de AWS Lambda donde podemos crear una nueva función.
Cuando crees la función, elige los valores predeterminados, pero asegúrate de elegir una aplicación Go 1.x porque eso es lo que vamos a desplegar. Cuando estés en el dashboard de tu función, no te preocupes de añadir un trigger para este ejemplo. En su lugar, elige subir el código de tu función que es el archivo **handler.zip**. Para el **Handler** asegúrate de usar el nombre del binario de tu aplicación.
Para probar nuestro despliegue, podemos crear una prueba directamente en el panel de control. En la parte superior de la pantalla, elija configurar un nuevo evento de prueba. Puedes nombrar el evento de prueba como quieras, pero añade lo siguiente como contenido de la solicitud:
1 2 3 |
{ "todo": "Impuestos completos" } |
Después de guardar el evento de prueba, ejecútalo desde el dashboard y mira los resultados. Debería haberse ejecutado correctamente y deberías tener un nuevo documento en tu base de datos Couchbase.
Conclusión
Acabas de ver cómo crear una nueva función AWS Lambda con el lenguaje de programación Go que se comunica con Servidor Couchbase. El proceso es bastante sencillo, y puede ampliarse con disparadores como AWS Gateway para hacerlo un poco más útil desde el punto de vista del uso.
En el próximo tutorial, vamos a echar un vistazo a la ampliación de este tutorial para apoyar a los dispositivos de Amazon Alexa-powered. De esta forma, podremos utilizar Alexa como disparador y crear o consultar documentos con nuestra voz.
Este post forma parte del Programa de Escritura de la Comunidad Couchbase