Google Cloud functions -> Node.js
Tags: espanol, google, serverless
Published: 2019-09-10 18:47:53

Google Cloud Functions es un entorno de ejecución sin servidor para crear y conectar servicios en la nube. Con Cloud Functions, usted escribe funciones simples y de un solo propósito que se adjuntan a eventos emitidos desde su infraestructura y servicios en la nube. Su función en la nube se activa cuando se dispara un evento que se está viendo. Su código se ejecuta en un entorno totalmente administrado. No es necesario aprovisionar infraestructura ni preocuparse por administrar servidores, en otras palabras usted solo se preocupa por "tirar código como loco". 

![](https://media.giphy.com/media/QHE5gWI0QjqF2/giphy.gif)

Google Cloud Functions se pueden escribir en Node.js, Python y Go, y se ejecuta en tiempos de ejecución específicos del idioma. El entorno de ejecución de Cloud Functions varía según el tiempo de ejecución elegido. 

<h2>Tipos de Cloud functions</h2>

Hay 2 distintos tipos de Cloud functions: HTTP y Background functions. 

<h3>Funciones HTTP</h3>

Invoca funciones HTTP a partir de solicitudes HTTP estándar. Estas solicitudes HTTP esperan la respuesta y el manejo de soporte de métodos comunes de solicitud HTTP como GET, PUT, POST, DELETE y OPTIONS. Cuando utiliza Cloud Functions, se le proporciona automáticamente un certificado TLS, por lo que todas las funciones HTTP se pueden invocar a través de una conexión segura.

<h3>Funciones Background</h3>

Las funciones en background manejan eventos de su infraestructura en la nube, como mensajes en un tema de Cloud Pub / Sub, o cambios en un depósito de Cloud Storage.

Para este post, hablaré sobre funciones HTTP, en otros posts hablaré sobre las de background, así que, manos a la obra.

<h2>Requisitos</h2>

Antes de comenzar, usted debería asegurarse de haber instalado Node en su máquina, haber creado un Proyecto de Google Cloud y de haber instalado el SDK de Google Cloud.

Para verificar que Node ha sido instalado, usted debería ejecutar los siguientes comandos.

```npm -v
  node -v ```

Además, usted podría verificar que Google Cloud SDK ha sido instalado con un comando similar:

`gcloud --version`

<h2>Setting up Google Cloud</h2>
Una vez que haya creado su proyecto Google Cloud, podemos habilitar la API de Cloud function en la nube. En la consola de Google Cloud, navegue a APIs & Services y luego en la biblioteca busque la API de Cloud Function. Debería encontrarse en una pantalla similar a la siguiente. Continúa y habilita la API.

![](https://miro.medium.com/max/3682/1*C0ktoHf6yMD999CTc7JQPg.png)

O si usted es un fan de la consola como mi persona, podría correr este comando el cual tiene el mismo efecto:

`gcloud services enable cloudfunctions.googleapis.com` 

Si la instalación fue satisfactoria, usted debería ver este API activo usando el siguiente comando:

`gcloud services list --available`

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/gxu83qklfsingum3jzdm.png)


<h2>Creando un Express App</h2>

Para inicializar la aplicación, usaremos la herramienta `npm` para crear el `package.json` y luego crearemos el archivo en el que vamos a escribir nuestro código.

En algún directorio de su preferencia, vamos a crear un folder llamado `cloud-functions-nodejs`, dentro de este folder corramos el siguiente comando `npm init`, este comando nos crea el `package.json`.

El siguiente paso es instalar Express a nuestro proyecto, lo haremos ejecutando el siguiente comando:

```npm install express --save```

Finalmente, crear un archivo llamado `index.js`, donde escribiremos nuestro código. Ok, ya estamos con lo necesario para comenzar a desarrollar, abrir el archivo anteriormente creado con tu editor favorito y codear lo siguiente:

```const express = require('express');
const app = express();

const PORT = 5555;

app.listen(PORT, () => {
  console.log(`Server ejecutándose en el puerto ${PORT}`);
});```

Ejecutar su app por medio del comando: ```node index.js```.

Usted debería ser capaz de ver el siguiente mensaje en su consola: 

```Server ejecutándose en el puerto 5555```. 

¡Felicidades! ¡Has creado tu primera aplicación Express! El único problema es que si deseas ejecutar alguna acción en `http: // localhost: 5555` no veras nada porque no hemos configurado la aplicación para escuchar las solicitudes.

Modifiquemos nuestro index.js con el siguiente código para crear algunos endpoints:

```
const express = require('express');
const app = express();

const PORT = 5555;
const USERS = [
    {
        id: 1,
        firstName: 'Gerardo',
        lastName: 'Lopez'
    },
    {
        id: 2,
        firstName: 'Yirian',
        lastName: 'Acuña'
    }
];

app.listen(PORT, () => {
    console.log(`Server ejecutándose en el puerto ${PORT}`);
});

app.get('/users', (req, res, next) => {
    res.json(USERS);
});

app.get('/users/:userId', (req, res, next) => {
    res.json(USERS.find(user => user.id === parseInt(req.params.userId)));
});

module.exports = {
    app
};
```


Vuelva a ejecutar la aplicación y debería poder ir a 
`http://localhost:5555/users` y ver nuestra lista de usuarios.

Nuestro segundo endpoint muestra cómo puede usar los parámetros de ruta en Express, por lo que si va a `http://localhost:5555/users/2` verá a nuestro usuario "Yirian Acuña".

<h2>Deployeando en Cloud Functions</h2>

Ahora implementemos nuestra aplicación en Cloud Functions. Para implementar nuestra aplicación solo necesitamos un comando. En el directorio de nivel raíz de nuestra aplicación (el que contiene index.js), ejecute el comando:

```gcloud functions deploy mi-primer-funcion --runtime nodejs8 --trigger-http --entry-point app```

Esto tardará unos minutos en ejecutarse, pero una vez que haya terminado, debería ver lo siguiente impreso en la consola.

```
Deploying function (may take a while - up to 2 minutes)...done.
httpsTrigger:
  url: https://us-central1-<GCP-PROJECT-ID>.cloudfunctions.net/mi-primer-funcion
labels:
  deployment-tool: cli-gcloud
name: projects/<GCP-PROJECT-ID>/locations/us-central1/functions/mi-primer-funcion
runtime: nodejs8
```

Analicemos brevemente el comando que ejecutamos. Después de implementar la función gcloud, el siguiente parámetro es el nombre de su función. El indicador `--runtime` le dice a GCP qué tiempo de ejecución necesita su aplicación. El indicador `--entry-point` apunta al método ó objeto en index.js que deseamos exportar como un Cloud function, en otras palabras, es el punto de entrada para la función. 

Después de haber implementado la función, deberías poder verla en la consola de Google Cloud y puedes llamar a tu función usando `https://us-central1-<GCP-PROJECT-ID>.cloudfunctions.net/mi-primer-funcion/users`.


![Alt Text](https://media.giphy.com/media/MGdfeiKtEiEPS/giphy.gif)

Eso fue fácil pero ya al menos tienes la idea suficiente de como crear un Google cloud run (HTTP events). En un futuro no muy lejano escribiré sobre los otros tipos de funciones.

Agradezco compartir con la comunidad. Si quieres seguir aprendiendo junto a mí, te invito a seguir mis redes sociales:

- Twitter https://twitter.com/gelopfalcon
- dev.to https://dev.to/gelopfalcon
- Twitch https://www.twitch.tv/gelopfalcon (Todas las semanas hablo de algún tema. Por lo general a media semana)