Introducción Cloud Run (GCP)
Published: 2020-07-21 23:12:23

Cloud Run es una plataforma de computación totalmente gestionada que te permite escalar automáticamente tus contenedores sin reconocimiento del estado. En lugar de utilizar servidores, Cloud Run abstrae toda la gestión de la infraestructura para que puedas dedicarte a lo que de verdad importa: crear aplicaciones fantásticas. Ejecuta tus contenedores en la plataforma totalmente gestionada de Cloud Run o en Anthos, que es compatible tanto con Google Cloud como con los entornos on-premise. Cloud Run se basa en el estándar abierto de Knative, lo que permite que tu aplicación sea portable.

A mi criterio, Cloud run se enfoca en:

* Developers se enfocan en el código y en el lenguaje de su preferencia: Go, Python, Java, C#, PHP, Ruby, Node.js, Shell y muchos más.
* Abstrae toda la gestión de la infraestructura para disfrutar de una experiencia de desarrollo más sencilla. Usted no tiene que preocuparse por aspectos como auto-scaling, manejo de recursos como memoria, cpu, etc. Todo esto lo hace por tí, entonces usted solo se enfoca en lo divertido: programar.
* Pagas solo cuando tu código se esté ejecutando. Esto está muy de moda y es importante analizar cuándo usar este enfoque (en algún otro post). Yo le veo bastante utilidad, ya que mis aplicaciones están siendo eficientes, debido a que usan los recursos solo cuando los ocupan. 

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

Antes de usar Cloud Run, debes completar algunas tareas iniciales, como configurar una cuenta de facturación, habilitar la API de Cloud Run y, también, instalar la herramienta de línea de comandos de gcloud.

<h2>Habilita la API e instala el SDK</h2>

1- Habilita la API de Cloud Run en la Consola de API de Google:

- Abre la página de la API de Cloud Run en la consola de las API de Google.

- Cuando se te pida, selecciona tu proyecto de Firebase.

- Haz clic en Habilitar en la página de la API de Cloud Run.

2- Instala e inicializa el SDK de Cloud.

<h2>Instala el componente de gcloud</h2>

Ejecuta el siguiente comando para instalar el componente de gcloud:

```gcloud components install```

Actualiza los componentes, como se indica a continuación:

```gcloud components update```

Asegúrate de que la herramienta gcloud esté configurada para el proyecto adecuado:

```gcloud config list```

<h2>Menos teoría, más código</h2>

<h3>Paso 1: Escribe la aplicación de muestra.</h3>

Ten en cuenta que Cloud Run admite muchos otros lenguajes, para este ejemplo usaré Python:

Crea un directorio nuevo llamado helloworld-python y, luego, usa el comando de cambio de directorio en él, de la siguiente manera:

```
mkdir helloworld-python

cd helloworld-python
```

Crea un archivo nuevo llamado app.py y, luego, agrega el siguiente código:
```
import os

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    target = os.environ.get('TARGET', 'World')
    return 'Hello {}!\n'.format(target)

if __name__ == "__main__":
    app.run(debug=True,host='0.0.0.0',port=int(os.environ.get('PORT', 8080)))
```
Con este código se crea un servidor web básico que recibe datos en el puerto definido por la variable de entorno PORT.

La app está lista para organizarla en contenedores y subirla a Container Registry.

<h3>Paso 2: Distribuye una app en contenedores y súbela a Container Registry</h3>

Crea un archivo nuevo llamado Dockerfile en el mismo directorio que los archivos de origen para organizar la app de muestra en contenedores. Copia el siguiente contenido en el archivo.
```
# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.7-slim

# Allow statements and log messages to immediately appear in the Knative logs
ENV PYTHONUNBUFFERED True

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

# Install production dependencies.
RUN pip install Flask gunicorn

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app
```

Usa Cloud Build a fin de compilar la imagen de contenedor. Para ello, ejecuta el siguiente comando desde el directorio que contiene el Dockerfile:

gcloud builds submit --tag gcr.io/projectID/helloworld

Tras la ejecución satisfactoria del comando, verás el mensaje SUCCESS con el nombre de la imagen
(gcr.io/projectID/helloworld).

La imagen del contenedor ahora se almacena en Container Registry y la puedes volver a usar si lo deseas.

Ten en cuenta que, en lugar de Cloud Build, puedes usar una versión de Docker instalada de manera local, para compilar el contenedor a nivel local.

<h3>Paso 3: Implementa la imagen de contenedor en Cloud Run</h3>
Realiza la implementación con el siguiente comando:
```
gcloud run deploy --image gcr.io/projectID/helloworld
```
Realiza las siguientes acciones cuando se te solicite:

- Selecciona una región (por ejemplo, us-central1).
- Confirma el nombre del servicio (por ejemplo, helloworld).
- Responde `Y` para permitir las invocaciones no autenticadas.

Espera unos instantes a que finalice la implementación. Si la operación es exitosa, la línea de comandos mostrará la URL de servicio. Por ejemplo:

https://helloworld-random_hash-us-central1.a.run.app

Abre la URL de servicio en un navegador web para visitar el contenedor implementado.

Listo, ya tienes tu aplicación corriendo en GCP usando Cloud Run, sos un/una crack.