Skip to content

Despliegue de una API REST con Kotlin en Google Cloud con PostgreSQL

Introducción

El desarrollo y despliegue de aplicaciones modernas en la nube permite a los desarrolladores crear APIs robustas, escalables y seguras. En esta guía aprenderás a desplegar una API REST construida con Kotlin y Spring Boot en Google Cloud App Engine, con PostgreSQL como base de datos.

Este proceso incluye la configuración de un proyecto en Google Cloud, la creación de una instancia de base de datos en Cloud SQL, y el despliegue de la aplicación en un entorno gestionado con soporte de escalabilidad automática. También integraremos herramientas como Google Cloud SDK para facilitar la gestión y despliegue de recursos.

Paso 1: Configuración del Proyecto en Google Cloud

  1. Creación de un Proyecto en Google Cloud

Antes de iniciar, asegúrate de haber iniciado sesión en tu cuenta de Google Cloud.

  • En el panel principal de Google Cloud, selecciona la opción "Nuevo Proyecto" como se muestra en la Figura #1: GeoLabs Kotlin GCP

Figura # 1: Nuevo Proyecto

  • En la pantalla emergente, asigna un nombre al proyecto, por ejemplo, demo-kotlin-gcp, y presiona el botón Crear (ver Figura #2): GeoLabs Kotlin GCP

Figura # 2: Nombre al proyecto

  • Una vez creado el proyecto, selecciona el proyecto desde las notificaciones o el menú desplegable (ver Figura #3): GeoLabs Kotlin GCP

Figura # 3: Notificación del proyecto

Paso 2: Creación de una Base de Datos en Cloud SQL

  1. Configuración de la Instancia

Desde el menú lateral de Google Cloud, selecciona la opción SQL para acceder a la sección de bases de datos (ver Figura #4): GeoLabs Kotlin GCP

Figura # 4: Bases de Datos

  • Haz clic en Crear Instancia con Créditos Gratuitos para iniciar el proceso de creación (ver Figura #5): GeoLabs Kotlin GCP

Figura # 5: Crear Instancia

  • Selecciona PostgreSQL como el motor de base de datos para la instancia (ver Figura #6): GeoLabs Kotlin GCP

Figura # 6: Seleccionar PostgreSQL

  • Configura los parámetros iniciales de la instancia:
    • Ajuste predeterminado de edición: Zona de pruebas.
    • Versión de la base de datos: PostgreSQL 16.
    • ID de la instancia: kotlinbase.
    • Contraseña: kotlinroot.
    • Región: Selecciona una cercana como us-central1.
    • Disponibilidad zonal: Zona única (ver Figura #7): GeoLabs Kotlin GCP

Figura # 7: Parámetros de la instancia

  • Personaliza los recursos de la máquina para optimizar costos. Selecciona la opción Con núcleo compartido con 1 CPU virtual (ver Figura #8): GeoLabs Kotlin GCP

Figura # 8: Personaliza Instancia

  • Haz clic en Crear para finalizar la configuración (ver Figura #9):. GeoLabs Kotlin GCP

Figura # 9: Crear Instancia

  • Crear una Base de Datos:
  • Una vez creada la instancia, accede a la pestaña Bases de Datos y haz clic en Crear Base de Datos. (Figura #10). GeoLabs Kotlin GCP

Figura # 10: Base de Datos

  • Asigna un nombre, como kotlindb. y presionar el boton Crear (Figura #11). GeoLabs Kotlin GCP

Figura # 11: Crear Base de Datos

Paso 3: Configuración de Conexión Pública

En este paso, configuraremos el acceso público para la base de datos PostgreSQL en Google Cloud SQL. Esto permitirá conectar herramientas locales como DBeaver para verificar y gestionar los datos.

  • Habilitar la Conexión Pública
  • Accede a la instancia de la base de datos PostgreSQL en la consola de Google Cloud.
  • Navega a la sección Conexiones en el menú lateral (Ver Figura #12). GeoLabs Kotlin GCP

Figura # 12: Conexión

  • En la pestaña Redes, marca la opción IP Pública para habilitar conexiones externas.
  • Haz clic en Agregar una Red para configurar redes autorizadas.

  • Configurar la Red Permitida

    • En la ventana emergente, completa los siguientes campos (Ver Figura #13):
      • Nombre: Ingresa un nombre descriptivo, como abierta.
      • Red: Introduce 0.0.0.0/0 para permitir conexiones desde cualquier dirección IP. GeoLabs Kotlin GCP

Figura # 12: Agregar Red

  • Haz clic en Guardar para aplicar los cambios.

⚠️ Advertencia: Esta configuración permite conexiones desde cualquier lugar y puede ser un riesgo de seguridad. Se recomienda usar esta configuración solo en entornos de desarrollo.

  • Probar la Conexión con DBeaver
    • Abre DBeaver (o cualquier cliente de base de datos).
    • Crea una nueva conexión seleccionando PostgreSQL como tipo de base de datos.
    • Completa los campos con los detalles obtenidos de la instancia:
      • Host: IP pública de la instancia (disponible en la consola de Google Cloud).
      • Puerto: 5432.
      • Usuario: postgres.
      • Contraseña: La configurada previamente (kotlinroot en este ejemplo).
    • Haz clic en Probar conexión para confirmar que todo funciona correctamente (Ver Figura #14). GeoLabs Kotlin GCP

      Figura # 14: Probar Conexión

Paso 4: Instalación y Configuración del SDK de Google Cloud

Google Cloud SDK nos permitirá desplegar la aplicación desde la línea de comandos.

  • Descargar e Instalar el SDK

    • Ve a la página oficial del SDK de Google Cloud.
    • Descarga la versión para tu sistema operativo y sigue las instrucciones de instalación.
    • Ejecuta el comando ./google-cloud-sdk/bin/gcloud init en tu terminal para configurar el SDK.
      • Acepta las configuraciones predeterminadas y selecciona el proyecto en el que trabajas (Ver Figura #15). GeoLabs Kotlin GCP

        Figura # 15: Condiguración del SDK Google Cloud

  • Seleccionar el Proyecto

    • Durante la configuración del SDK, selecciona el proyecto en el que se creó la base de datos.
    • Confirma el proyecto elegido con el identificador correspondiente (Ver Figura #16). GeoLabs Kotlin GCP

      Figura # 16: Selección del Proyecto

    • Sigue los pasos interactivos para autenticarte y vincular el proyecto kotlingcp.

    • Puedes listar la configuración actual del proyecto con:
          ./google-cloud-sdk/bin/gcloud config list
      

Configuración del archivo application.properties para conectarse a la base de datos

Antes de continuar, necesitamos ajustar las configuraciones para que nuestra aplicación pueda comunicarse correctamente con la base de datos que creamos en Google Cloud. Esto implica agregar la IP pública, el usuario y la contraseña asignados a la base.

Modificación del archivo application.properties

Abrimos el archivo application.properties y configuramos las siguientes propiedades:

spring.datasource.url=jdbc:postgresql://34.171.125.70:5432/kotlindb
spring.datasource.username=postgres
spring.datasource.password=kotlingcp
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
  • spring.datasource.url: Especifica la URL de conexión, que incluye la IP pública de la instancia, el puerto (5432), y el nombre de la base de datos (kotlindb).
  • spring.datasource.username: Usuario para conectarse a la base (postgres).
  • spring.datasource.password: Contraseña para el usuario (kotlingcp).

Si no recuerdas la IP pública o la contraseña, puedes consultar esta información desde el panel de Google Cloud SQL.

Probando la conexión

Para verificar que todo está funcionando correctamente, ejecutamos el proyecto con el siguiente comando:

./gradlew bootRun

Esperamos a que compile y luego ingresamos en el navegador la URL correspondiente, por ejemplo: http://localhost:8080/api/speakers.

Si la conexión a la base es exitosa, el resultado será un JSON vacío, indicando que no hay usuarios registrados todavía. Esto confirma que la aplicación está conectada a la base de datos, pero aún no hay registros.

Preparando la aplicación para el despliegue en Google Cloud

Antes de desplegar nuestra aplicación, necesitamos realizar algunas configuraciones para garantizar que los archivos correctos sean enviados a Google Cloud. Esto es importante porque Google App Engine compila y ejecuta la aplicación directamente en la nube, por lo que ciertos archivos locales no deben incluirse en el proceso de despliegue.

Creando el archivo .gcloudignore

Crea el archivo .gcloudignore para excluir carpetas y archivos innecesarios en el despliegue:

.gradle/
build/
out/
gradlew
gradlew.bat

target/
.git/
.idea/
*.iml
.mvn/
mvnw
mvnw.cmd

Creando el descriptor app.yaml

Para que Google App Engine pueda desplegar correctamente nuestra aplicación, es necesario crear un archivo de configuración llamado app.yaml. Este archivo especifica las configuraciones básicas necesarias para el entorno de ejecución.

  • Ubicación del archivo: Crea el archivo app.yaml en la raíz del proyecto.

  • Contenido del archivo: Dentro de este archivo, agrega las siguientes líneas:

runtime: java21
instance_class: F2
  • runtime: Especifica el entorno para aplicaciones Java.
  • instance_class: Define el tipo de instancia. Google clasifica las instancias según su capacidad:

    • F1: Instancia básica (por defecto).
    • F2: Instancia con más recursos, recomendada para aplicaciones como Kotlin, que requieren mayor capacidad de procesamiento.
  • Ejecutar el Despliegue:

    • Para desplegar la aplicación en App Engine, usa el siguiente comando:
          gcloud app deploy
      
    • Selecciona la región más cercana a tu ubicación (como us-central1 para América Central) si es tu primer despliegue. Una vez completado, obtendrás una URL similar a:
          https://famous-cursor-442219-q6.rj.r.appspot.com
      
    • Verificación: Accede a la URL y asegúrate de que la aplicación esté funcionando correctamente. Por ejemplo, verifica los endpoints api/speakers.

Paso 5: Habilitar la API de Cloud SQL Admin

  • Mejorar la Seguridad de la Aplicación Después del despliegue inicial, es importante fortalecer la seguridad.

  • Eliminar la IP Pública

    • Ve a la consola de Google Cloud SQL.
    • En la sección Conexiones > Redes, elimina la red pública 0.0.0.0/0.
    • Esto impedirá el acceso desde cualquier IP pública. (Ver Figura #17) GeoLabs Kotlin GCP

      Figura # 17: Eliminar IP Publica

Para realizar una conexión segura con la base de datos, habilitaremos la API Cloud SQL Admin, que permite gestionar instancias de bases de datos desde aplicaciones desplegadas en Google Cloud.

  • Activar la API
    • En la consola de Google Cloud, busca Cloud SQL Admin API en el buscador de la parte superior.
    • Haz clic en Habilitar para activar la API (Ver Figura #17).

GeoLabs Kotlin GCP

Figura # 17: Activar API

Esto permitirá a las cuentas de servicio de Google gestionar conexiones a la base de datos de manera segura.

Paso 6: Configuración de Dependencias en el Proyecto Kotlin

En este paso, ajustaremos las dependencias necesarias para conectar nuestra aplicación a Cloud SQL. En lugar de usar la IP pública, configura la conexión usando cadenas seguras proporcionadas por Google.

  • Agregar la Dependencia de PostgreSQL
    • Abre el archivo pom.xml de tu proyecto.
    • Agrega la dependencia correspondiente para usar PostgreSQL con Google Cloud:
<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-sql-postgresql</artifactId>
</dependency>

Si usas Gradle, agrega lo siguiente en tu archivo build.gradle:

implementation("com.google.cloud:spring-cloud-gcp-starter-sql-postgresql")

(Ver Figura #18) GeoLabs Kotlin GCP

Figura # 18: Adicionar Dependencia

  • Configurar la Cadena de Conexión Modifica las propiedades de conexión de la base de datos. En lugar de una URL con IP, usa la configuración proporcionada por Google:
    • Accede a las propiedades de tu aplicación (application.properties o application.yml).
    • Configura los valores de conexión utilizando el nombre de la conexión (disponible en la consola de Google Cloud en la instancia de PostgreSQL) (Ver Figura #19):
# Configuración de conexión segura
spring.cloud.gcp.sql.database-name=kotlindb
spring.cloud.gcp.sql.instance-connection-name=famous-cursor-442219-q6:us-central1:kotlinbase
spring.datasource.username=postgres
spring.datasource.password=kotlinroot

Nota: Comenta cualquier configuración previa de URL para evitar conflictos:

# spring.datasource.url=jdbc:postgresql://<IP_PUBLICA>:5432/kotlindb

GeoLabs Kotlin GCP

Figura # 19: Conexión Cloud SQL

Desplegar y verificar la conexión

Ahora podemos proceder con el despliegue y probar que la aplicación tiene conexión con la base de datos.

  • Despliegue: Ejecuta el siguiente comando en tu terminal:
gcloud app deploy
  • Esperar el proceso: Deja que Google App Engine complete el despliegue. Este proceso puede tardar unos minutos.

  • Obtener la URL: Una vez finalizado, Google proporcionará una URL pública para tu aplicación.

  • Verificación: Accede a la URL proporcionada y dirígete al endpoint /speakers. Por ejemplo:

https://<tu-app-id>.appspot.com/speakers

Si todo está configurado correctamente, la aplicación debería mostrar datos o confirmar la conexión con la base de datos.

Paso 7: Configuración IAM y Despliegue

Asegúrate de que la cuenta de servicio predeterminada de App Engine tenga los roles necesarios para gestionar Cloud SQL:

  • Configurar Credenciales Locales

    • Una vez que la aplicación está funcionando, podemos verificar su estado en la consola de administración de Google Cloud. Ahí veremos que existen varias cuentas creadas automáticamente. Una de estas cuentas es la predeterminada de App Engine, la cual tiene permisos necesarios para realizar diversas operaciones dentro de Google Cloud, siempre que se le hayan asignado los privilegios adecuados.

    • Sin embargo, en el entorno local, no contamos con esa cuenta predeterminada o "aplicativa". Aunque tu cuenta personal puede haber creado el proyecto, esto no implica que automáticamente tenga los permisos necesarios para realizar ciertas operaciones desde tu entorno local.

    • Para solucionar esto, es necesario configurar las credenciales en tu entorno local. Esto se hace mediante el siguiente comando:

    • Usa el siguiente comando para autenticar tu máquina local con las credenciales de Google Cloud:

      gcloud auth application-default login
      

    • Esto abrirá el navegador para seleccionar tu cuenta de Google Cloud.

  • Revisar Cuentas de Servicio

    • Verifica que la cuenta de servicio predeterminada de App Engine tenga permisos de acceso a Cloud SQL (Ver Figura #20).

GeoLabs Kotlin GCP

Figura # 20: IAM

  • Probar la Aplicación Localmente Corre la aplicación localmente y verifica que se conecte correctamente a la base de datos:
./gradlew bootRun

Asegúrate de que el endpoint /spearkes funcione como se espera.

Proyecto Final

El proyecto completo desarrollado durante este workshop está disponible en el siguiente repositorio de GitHub:

🔗 Proyecto Final: kotlin-gcp

En este repositorio encontrarás todo el código fuente, configuraciones, y las instrucciones necesarias para ejecutar el proyecto tanto localmente como en Google Cloud.

Sígueme en Redes Sociales

Si disfrutaste este workshop, ¡asegúrate de seguirme para más contenido sobre Kotlin, Spring Boot y desarrollo en la nube!

Resumen del Workshop

En este workshop aprendimos a desplegar una API REST desarrollada en Kotlin y Spring Boot en Google Cloud. Estos son los pasos principales que seguimos:

  • Fase 1: Configuración Inicial

    • Uso de Spring Initializr para generar un proyecto base.
    • Configuración de dependencias clave como Spring Web y JPA.
    • Creación de la estructura del proyecto.
  • Fase 2: Construcción de la API REST

    • Implementación de entidades, repositorios, servicios y controladores.
    • Uso de Flyway para la gestión de migraciones en la base de datos.
  • Fase 3: Configuración de PostgreSQL en Cloud SQL

    • Creación de una instancia PostgreSQL en Google Cloud.
    • Configuración de conexiones seguras y prueba local con DBeaver.
  • Fase 4: Ejecución Local

    • Validación de endpoints usando Postman.
    • Inserción y recuperación de datos en la base de datos.
  • Fase 5: Preparación del Despliegue

    • Creación de los archivos .gcloudignore y app.yaml para App Engine.
    • Configuración de Maven/Gradle para empaquetado de la aplicación.
  • Fase 6: Despliegue en App Engine

    • Uso del comando gcloud app deploy para subir la aplicación.
    • Verificación de que la API REST funciona en la URL proporcionada por Google Cloud.
  • Fase 7: Seguridad y Mejores Prácticas

    • Eliminación de la IP pública para proteger la base de datos.
    • Habilitación de Cloud SQL Admin API y configuración de cadenas seguras.
    • Uso de Spring Cloud GCP para integraciones nativas con Google Cloud.
  • Fase 8: Validación y Optimización

    • Configuración de credenciales locales para desarrollo seguro.
    • Validación del funcionamiento de la API en producción y local.

Resultado Final

Tras completar este workshop, tendrás una aplicación Kotlin desplegada en la nube, conectada a una base de datos segura, con las mejores prácticas implementadas para garantizar rendimiento y escalabilidad.

¡Gracias por participar en este workshop! Si tienes dudas o necesitas más ayuda, no dudes en contactarme o dejar tus comentarios en mis redes sociales. 🎉