Compilar e implementar un servicio de Go

Aprende a crear una aplicación simple de Hello World, empaquetarla en una imagen de contenedor, subirla a Container Registry y, luego, implementarla en Cloud Run. Puedes usar otros lenguajes además de los que se muestran.


Para obtener orientación paso a paso directamente sobre esta tarea directamente en el editor de Cloud Shell, haz clic en Guiarme:

GUIARME


En las siguientes secciones, se explican los mismos pasos que cuando se hace clic en Guiarme.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyecto

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

  4. Instala e inicializa el SDK de Cloud.

Escribe la aplicación de muestra

Para escribir una aplicación en Go, sigue estos pasos:

  1. Crea un directorio nuevo llamado helloworld y usa el comando de cambio de directorio en él:

    mkdir helloworld
    cd helloworld
    
  2. Inicializa un archivo go.mod para declarar el módulo de go:

    module github.com/GoogleCloudPlatform/golang-samples/run/helloworld
    
    go 1.13
    

    Puedes crear el archivo go.mod directamente en el formato como se muestra arriba, o puedes inicializarlo desde el directorio del proyecto con lo siguiente:

    go mod init
    
  3. Crea un archivo nuevo llamado main.go y pega el siguiente código en él:

    
    // Sample run-helloworld is a minimal Cloud Run service.
    package main
    
    import (
    	"fmt"
    	"log"
    	"net/http"
    	"os"
    )
    
    func main() {
    	log.Print("starting server...")
    	http.HandleFunc("/", handler)
    
    	// Determine port for HTTP service.
    	port := os.Getenv("PORT")
    	if port == "" {
    		port = "8080"
    		log.Printf("defaulting to port %s", port)
    	}
    
    	// Start HTTP server.
    	log.Printf("listening on port %s", port)
    	if err := http.ListenAndServe(":"+port, nil); err != nil {
    		log.Fatal(err)
    	}
    }
    
    func handler(w http.ResponseWriter, r *http.Request) {
    	name := os.Getenv("NAME")
    	if name == "" {
    		name = "World"
    	}
    	fmt.Fprintf(w, "Hello %s!\n", name)
    }
    

    Con este código, se crea un servidor web básico que escucha en el puerto definido por la variable de entorno PORT.

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

Organiza una app en contenedores y súbela a Container Registry

Si quieres organizar una app de muestra en contenedores, crea un archivo nuevo llamado Dockerfile en el mismo directorio que los archivos fuente y copia el siguiente contenido:


# Use the offical golang image to create a binary.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.16-buster as builder

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY . ./

# Build the binary.
RUN go build -v -o server

# Use the official Debian slim image for a lean production container.
# https://hub.docker.com/_/debian
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM debian:buster-slim
RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    ca-certificates && \
    rm -rf /var/lib/apt/lists/*

# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server

# Run the web service on container startup.
CMD ["/app/server"]

Agrega un archivo .dockerignore para excluir archivos de tu imagen de contenedor.

# The .dockerignore file excludes files from the container build process.
#
# https://docs.docker.com/engine/reference/builder/#dockerignore-file

# Exclude locally vendored dependencies.
vendor/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

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/PROJECT-ID/helloworld

En el ejemplo anterior, PROJECT-ID es el ID de tu proyecto de GCP. Puedes obtenerlo si ejecutas gcloud config get-value project.

Si se ejecuta de forma correcta, verás un mensaje de ÉXITO que contiene el nombre de la imagen (gcr.io/PROJECT-ID/helloworld). La imagen se almacena en Container Registry y se puede volver a usar si lo deseas.

Implementa en Cloud Run

Para implementar la imagen de contenedor, haz lo siguiente:

  1. Realiza la implementación con el siguiente comando:

    gcloud run deploy --image gcr.io/PROJECT-ID/helloworld

    Si se te solicita que habilites la API, presiona y para habilitarla.

    Reemplaza PROJECT-ID por el ID del proyecto de GCP. Para ver el ID del proyecto, ejecuta el comando gcloud config get-value project.

    1. Se te solicitará el nombre del servicio; presiona Intro para aceptar el nombre predeterminado, helloworld.
    2. Se te solicitará la región; selecciona la región que prefieras, por ejemplo, us-central1.
    3. Se te solicitará permitir invocaciones no autenticadas; responde y.

    Luego, espera un momento a que finalice la implementación. Si la operación se completa de forma correcta, la línea de comandos mostrará la URL de servicio.

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

Ubicaciones de Cloud Run

Cloud Run es regional, lo que significa que la infraestructura que ejecuta los servicios se ubica en una región específica, y Google la administra para que esté disponible de manera redundante en todas las zonas de esa región.

El cumplimiento de los requisitos de latencia, disponibilidad o durabilidad es el factor principal para seleccionar la región en la que se ejecutan los servicios de Cloud Run. Por lo general, puedes seleccionar la región más cercana a los usuarios, pero debes considerar la ubicación de los otros productos de Google Cloud que usa el servicio de Cloud Run. Si usas productos de Google Cloud en varias ubicaciones, la latencia y el costo del servicio pueden verse afectados.

Cloud Run está disponible en las siguientes regiones:

Sujetas a los Precios del nivel 1

  • asia-east1 (Taiwán)
  • asia-northeast1 (Tokio)
  • asia-northeast2 (Osaka)
  • europe-north1 (Finlandia) Ícono de la hoja CO más bajo2
  • europe-west1 (Bélgica)
  • europe-west4 (Países Bajos)
  • us-central1 (Iowa) Ícono de la hoja CO más bajo2
  • us-east1 (Carolina del Sur)
  • us-east4 (Virginia del Norte)
  • us-west1 (Oregón) Ícono de la hoja CO más bajo2

Sujetas a los Precios del nivel 2

  • asia-east2 (Hong Kong)
  • asia-northeast3 (Seúl, Corea del Sur)
  • asia-southeast1 (Singapur)
  • asia-southeast2 (Yakarta)
  • asia-south1 (Bombay, India)
  • asia-south2 Delhi (India)
  • australia-southeast1 (Sídney)
  • australia-southeast2 (Melbourne)
  • europe-central2 (Varsovia, Polonia)
  • europe-west2 (Londres, Reino Unido)
  • europe-west3 (Fráncfort, Alemania)
  • europe-west6 (Zúrich, Suiza) Ícono de la hoja CO más bajo2
  • northamerica-northeast1 (Montreal) Ícono de la hoja CO más bajo2
  • southamerica-east1 (Sao Paulo, Brasil) Ícono de la hoja CO más bajo2
  • us-west2 (Los Ángeles)
  • us-west3 (Las Vegas)
  • us-west4 (Salt Lake City)

Si ya creaste un servicio de Cloud Run, puedes ver la región en el panel de Cloud Run en Cloud Console.

Felicitaciones. Acabas de implementar una aplicación empaquetada en una imagen de contenedor en Cloud Run. Cloud Run reduce la escala de la imagen de contenedor de forma automática y horizontal para controlar las solicitudes que se reciben y, luego, escala horizontalmente cuando disminuye la demanda. Solo debes pagar por la CPU, la memoria y las herramientas de redes que se usen durante el control de las solicitudes.

Realiza una limpieza

Quita el proyecto de prueba

Si bien Cloud Run no cobra cuando el servicio no se usa, es posible que se te cobre por el almacenamiento de la imagen de contenedor en Container Registry. Puedes borrar la imagen o borrar el proyecto de Cloud para evitar que se apliquen cargos. Si borras el proyecto de Cloud, se dejan de facturar todos los recursos que usaste en ese proyecto.

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Próximos pasos

Para obtener más información sobre cómo compilar un contenedor a partir de código fuente y enviarlo a Container Registry, consulta las páginas siguientes: