Configurar CI/CD para almacenar la configuración como código de Terraform

En este tutorial se explica cómo gestionar la infraestructura como código con Terraform y Cloud Build mediante la conocida metodología GitOps. El término GitOps fue acuñado por Weaveworks y su concepto clave es usar un repositorio de Git para almacenar el estado del entorno que quieras. Terraform es una herramienta de código abierto de HashiCorp que te permite crear, cambiar y mejorar tu infraestructura en la nube de forma predecible mediante código. En este tutorial, usarás Cloud Build, un servicio de integración continua, para aplicar automáticamente manifiestos de Terraform a tu entorno. Google Cloud

Este tutorial está dirigido a desarrolladores y operadores que buscan una estrategia elegante para hacer cambios en la infraestructura de forma predecible. En este artículo se presupone que estás familiarizado con Google Cloudy Linux.

En los informes State of DevOps se identificaron las funciones que mejoran el rendimiento del envío de software. Este tutorial te ayudará a usar las siguientes funciones:

Arquitectura

En este tutorial se aplican prácticas de GitOps para gestionar las ejecuciones de Terraform. Ten en cuenta que usa las ramas dev y prod de Secure Source Manager para representar los entornos reales. Estos entornos se definen mediante las redes de nube privada virtual (VPC) dev y prod, respectivamente, en unGoogle Cloud proyecto.

El proceso comienza cuando insertas código de Terraform en la rama dev o prod. En este caso, Cloud Build activa y, a continuación, aplica manifiestos de Terraform para conseguir el estado que quieras en el entorno correspondiente. Por otro lado, cuando insertas código de Terraform en cualquier otra rama (por ejemplo, en una rama de función), Cloud Build se ejecuta para ejecutar terraform plan, pero no se aplica nada a ningún entorno.

Lo ideal es que los desarrolladores o los operadores hagan propuestas de infraestructura a las ramas de desarrollo o de funciones y, a continuación, las envíen mediante solicitudes de extracción. De esta forma, puedes hablar y revisar los posibles cambios con los colaboradores y añadir confirmaciones de seguimiento antes de que los cambios se combinen en la rama base.

Si no hay ningún problema, primero debes combinar los cambios en la rama dev. Esta combinación activa un despliegue de infraestructura en el entorno dev, lo que te permite probarlo. Una vez que hayas probado lo que se ha implementado y estés seguro de que funciona correctamente, debes combinar la rama dev con la rama prod para activar la instalación de la infraestructura en el entorno de producción.

Objetivos

  • Configura tu instancia y tu repositorio de Secure Source Manager.
  • Configura Terraform para almacenar el estado en un segmento de Cloud Storage.
  • Concede permisos a tu cuenta de servicio de Cloud Build.
  • Conecta Cloud Build a tu repositorio de Secure Source Manager.
  • Cambia la configuración del entorno en una rama de función.
  • Promocionar los cambios al entorno de desarrollo.
  • Promociona los cambios al entorno de producción.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  7. En Cloud Shell, obtén el ID del proyecto que acabas de seleccionar:
    gcloud config get-value project
    Si este comando no devuelve el ID del proyecto, configura Cloud Shell para que use tu proyecto. Sustituye PROJECT_ID por el ID de tu proyecto.
    gcloud config set project PROJECT_ID
  8. Habilita las APIs necesarias:
    gcloud services enable cloudbuild.googleapis.com compute.googleapis.com securesourcemanager.googleapis.com
    Este paso puede tardar unos minutos en completarse.
  9. Si nunca has usado Git en Cloud Shell, configúralo con tu nombre y tu dirección de correo electrónico:
    git config --global user.email "YOUR_EMAIL_ADDRESS"
    git config --global user.name "YOUR_NAME"
    
    Git usa esta información para identificarte como el autor de las confirmaciones que creas en Cloud Shell.
  10. Configurar un repositorio de Secure Source Manager

    En este tutorial, usarás un único repositorio de Secure Source Manager para definir tu infraestructura en la nube. Para orquestar esta infraestructura, puedes tener diferentes ramas que correspondan a diferentes entornos:

    • La rama dev contiene los últimos cambios que se aplican al entorno de desarrollo.
    • La rama prod contiene los últimos cambios que se aplican al entorno de producción.
    • Las ramas de funciones similares a feature_x se usan para hacer cambios antes de enviar a las ramas dev o prod.

    Con esta infraestructura, siempre puedes consultar el repositorio para saber qué configuración se espera en cada entorno y proponer nuevos cambios fusionándolos primero en el entorno dev. A continuación, puedes promover los cambios combinando la rama dev con la rama prod.

    1. Crea un repositorio vacío de Secure Source Manager. No inicialices el repositorio.
    2. Añade el asistente de autenticación de Secure Source Manager a tu git config global ejecutando el siguiente comando:

      git config --global credential.'https://*.*.sourcemanager.dev'.helper gcloud.sh
      

      La herramienta auxiliar de autenticación usa la CLI de gcloud para obtener tusGoogle Cloud credenciales cuando usas comandos de Git con Secure Source Manager.

    3. Para volver a autenticarte después de la configuración inicial de las credenciales, ejecuta el siguiente comando de la CLI de gcloud:

      gcloud auth login
      
    4. Clona el repositorio solutions-terraform-cloudbuild-gitops en tu shell local o entorno de trabajo:

      git clone https://github.com/GoogleCloudPlatform/solutions-terraform-cloudbuild-gitops.git
      
    5. Añade tu repositorio de Secure Source Manager como upstream.

      git remote add google HTTPS_REPO_URL
      

      Donde HTTPS_REP_URL es la URL de HTTPS de tu repositorio de Secure Source Manager. Puede encontrar la URL en la parte superior de la página del repositorio en la interfaz web de Secure Source Manager.

    6. Crea tu rama dev y cambia a ella.

      git checkout dev
      
    7. Envía el repositorio clonado a tu repositorio con el siguiente comando:

      git push -u google --all
      
    8. Repite los dos pasos anteriores para tu rama prod.

    El código de este repositorio se estructura de la siguiente manera:

    • La carpeta environments/ contiene subcarpetas que representan entornos, como dev y prod, que proporcionan una separación lógica entre las cargas de trabajo en diferentes fases de madurez, desarrollo y producción, respectivamente. Aunque es recomendable que estos entornos sean lo más parecidos posible, cada subcarpeta tiene su propia configuración de Terraform para asegurarse de que puedan tener ajustes únicos según sea necesario.

    • La carpeta modules/ contiene módulos de Terraform insertados. Estos módulos representan agrupaciones lógicas de recursos relacionados y se usan para compartir código en diferentes entornos.

    • El archivo cloudbuild.yaml es un archivo de configuración de compilación que contiene instrucciones para Cloud Build, como la forma de realizar tareas basadas en un conjunto de pasos. Este archivo especifica una ejecución condicional en función de la rama de la que Cloud Build obtiene el código. Por ejemplo:

      • En las ramas dev y prod, se siguen estos pasos:

        1. terraform init
        2. terraform plan
        3. terraform apply
      • En cualquier otra rama, se ejecutan los siguientes pasos:

        1. terraform init para todas las environments subcarpetas
        2. terraform plan para todas las environments subcarpetas

    Para asegurarnos de que los cambios propuestos son adecuados para todos los entornos, se ejecutan terraform init y terraform plan en todas las subcarpetas de environments. Antes de combinar la solicitud de extracción, puedes revisar los planes para asegurarte de que no se concede acceso a una entidad no autorizada, por ejemplo.

    Modificar el archivo de configuración de compilación

    Para que el archivo de configuración de compilación de ejemplo funcione con Secure Source Manager, debes hacer los siguientes cambios:

    • Añade un paso para clonar tu repositorio.
    • Añade un paso para obtener el nombre de la rama y asignarlo a una variable.

    Edita el archivo de configuración de compilación en la rama dev:

    1. Cambia a la rama dev:

      git checkout dev
      
    2. Abre el archivo cloudbuild.yaml y sustituye el contenido por lo siguiente:

      # Copyright 2019 Google LLC
      #
      # Licensed under the Apache License, Version 2.0 (the "License");
      # you may not use this file except in compliance with the License.
      # You may obtain a copy of the License at
      #
      #     https://www.apache.org/licenses/LICENSE-2.0
      #
      # Unless required by applicable law or agreed to in writing, software
      # distributed under the License is distributed on an "AS IS" BASIS,
      # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      # See the License for the specific language governing permissions and
      # limitations under the License.
      
      
      steps:
      - id: 'clone repository'
        name: 'gcr.io/cloud-builders/git'
        args:
        - clone
        - '${_REPO_URL}'
        - .
      - id: 'branch name'
        name: gcr.io/cloud-builders/git
        entrypoint: 'sh'
        args:
        - '-c'
        - |
            branch=$(basename "$_REF")
            git checkout ${branch}
            echo "***********************"
            git branch --show-current
            echo "***********************"
      
      - id: 'tf init'
        name: 'hashicorp/terraform:1.0.0'
        entrypoint: 'sh'
        args:
        - '-c'
        - |
         branch=$(basename "$_REF")
            if [ -d "environments/${branch}/" ]; then
              cd environments/${branch}
              terraform init
            else
              for dir in environments/*/
              do
                cd ${dir}
                env=${dir%*/}
                env=${env#*/}
                echo ""
                echo "*************** TERRAFORM INIT ******************"
                echo "******* At environment: ${env} ********"
                echo "*************************************************"
                terraform init || exit 1
                cd ../../
              done
            fi
      
      - id: 'tf plan'
        name: 'hashicorp/terraform:1.0.0'
        entrypoint: 'sh'
        args:
        - '-c'
        - |
            branch=$(basename "$_REF")
            if [ -d "environments/${branch}/" ]; then
              cd environments/${branch}
              terraform plan
            else
              for dir in environments/*/
              do
                cd ${dir}
                env=${dir%*/}
                env=${env#*/}
                echo ""
                echo "*************** TERRAFOM PLAN ******************"
                echo "******* At environment: ${env} ********"
                echo "*************************************************"
                terraform plan || exit 1
                cd ../../
              done
            fi
      
      - id: 'tf apply'
        name: 'hashicorp/terraform:1.0.0'
        entrypoint: 'sh'
        args:
        - '-c'
        - |
            branch=$(basename "$_REF")
            if [ -d "environments/${branch}/" ]; then
              cd environments/${branch}
              terraform apply -auto-approve
            else
              echo "***************************** SKIPPING APPLYING *******************************"
              echo "Branch '${branch}' does not represent an official environment."
              echo "*******************************************************************************"
            fi
    3. Comprueba que el archivo se haya modificado.

      git status
      
    4. Confirma y envía los cambios:

      git add --all
      git commit -m "Modify build config file."
      git push google dev
      
    5. Abre una solicitud de extracción para promover rápidamente tus cambios a la rama prod.

      1. En la interfaz web de Secure Source Manager, ve a tu repositorio.
      2. Haz clic en la pestaña Solicitudes de extracción.
      3. Haz clic en Nueva solicitud de extracción.
      4. En el campo Combinar con:, selecciona la rama prod.
      5. En el campo pull from: (Extraer de), selecciona la rama dev.
      6. Revisa los cambios y haz clic en Nueva solicitud de extracción.
      7. Haz clic en Crear solicitud de extracción.
      8. Haz clic en Combinar solicitud de extracción.
      9. Vuelve a hacer clic en Combinar solicitud de extracción.

        Los cambios se combinan en tu rama prod.

    Configurar Terraform para almacenar el estado en un segmento de Cloud Storage

    De forma predeterminada, Terraform almacena el estado de forma local en un archivo llamado terraform.tfstate. Esta configuración predeterminada puede dificultar el uso de Terraform a los equipos, sobre todo cuando muchos usuarios ejecutan Terraform al mismo tiempo y cada máquina tiene su propia interpretación de la infraestructura actual.

    Para ayudarte a evitar estos problemas, en esta sección se configura un estado remoto que apunta a un segmento de Cloud Storage. El estado remoto es una función de los backends y, en este tutorial, se configura en los archivos backend.tf. Por ejemplo:

    # Copyright 2019 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    
    terraform {
      backend "gcs" {
        bucket = "PROJECT_ID-tfstate"
        prefix = "env/dev"
      }
    }
    

    En los siguientes pasos, creará un segmento de Cloud Storage y cambiará algunos archivos para que apunten a su nuevo segmento y a su proyecto Google Cloud .

    1. En Cloud Shell, crea el segmento de Cloud Storage:

      PROJECT_ID=$(gcloud config get-value project)
      gcloud storage buckets create gs://${PROJECT_ID}-tfstate
      
    2. Habilita la gestión de versiones de objetos para conservar el historial de tus implementaciones:

      gcloud storage buckets update gs://${PROJECT_ID}-tfstate --versioning
      

      Si habilitas la gestión de versiones de objetos, aumentarán los costes de almacenamiento, que puedes reducir configurando la gestión del ciclo de vida de los objetos para eliminar las versiones anteriores.

    3. Crea una rama cloud-storage-bucket para hacer los cambios:

      cd ~/solutions-terraform-cloudbuild-gitops
      git checkout -b cloud-storage-bucket
      
    4. Sustituye el marcador de posición PROJECT_ID por el ID del proyecto en los archivos terraform.tfvars y backend.tf:

      sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars
      sed -i s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
      

      En OS X o macOS, es posible que tengas que añadir dos comillas ("") después de sed -i, como se indica a continuación:

      sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/terraform.tfvars
      sed -i "" s/PROJECT_ID/$PROJECT_ID/g environments/*/backend.tf
      
    5. Comprueba si se han actualizado todos los archivos:

      git status
      

      La salida tiene este aspecto:

      On branch cloud-storage-bucket
      Changes not staged for commit:
      (use "git add ..." to update what will be committed)
      (use "git restore ..." to discard changes in working directory)
             modified:   environments/dev/backend.tf
             modified:   environments/dev/terraform.tfvars
             modified:   environments/prod/backend.tf
             modified:   environments/prod/terraform.tfvars
      no changes added to commit (use "git add" and/or "git commit -a")
      
    6. Confirma y envía los cambios:

      git add --all
      git commit -m "Update project IDs and buckets"
      git push google -u cloud-storage-bucket
      

      Tu nueva rama cloud-storage-bucket se envía a tu repositorio.

    7. Combina los cambios de cloud-storage-bucket en tus ramas dev y prod abriendo y enviando solicitudes de combinación para cada rama.

    Conceder permisos a tu cuenta de servicio de Cloud Build

    Para permitir que la cuenta de servicio de Cloud Build ejecute secuencias de comandos de Terraform con el objetivo de gestionar recursos de Google Cloud , debes concederle el acceso adecuado a tu proyecto. Para simplificar las cosas, en este tutorial se concede acceso de editor de proyectos. En los entornos de producción, sigue las prácticas recomendadas de seguridad de TI de tu empresa, que suelen consistir en proporcionar acceso con los mínimos privilegios.

    1. Para encontrar el correo de la cuenta de servicio de Cloud Build, ve a la página de Cloud Build y, a continuación, a Configuración.

      Ir a la configuración de Cloud Build

    2. Copia el valor de Correo de la cuenta de servicio.

    3. Concede el acceso necesario a tu cuenta de servicio de Cloud Build:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member serviceAccount:CLOUDBUILD_SA --role roles/editor
      

      Haz los cambios siguientes:

      • PROJECT_ID por el ID del proyecto.
      • CLOUDBUILD_SA con el correo de la cuenta de servicio de Cloud Build.

    Conectarse a Cloud Build

    Para activar Cloud Build cuando se envíe contenido a cualquier rama, configura un webhook de Secure Source Manager. El archivo de configuración de compilación comprobará el nombre de la rama para determinar si es necesario hacer cambios en los entornos dev o prod.

    1. Habilita y configura Cloud Build en tu proyecto.

    2. Abre la página Triggers (Activadores) en la consola de Google Cloud .

      Abre la página Activadores.

    3. Selecciona tu proyecto en el menú desplegable del selector de proyectos situado en la parte superior de la página.

    4. Haz clic en Abrir.

    5. Haz clic en Crear activador.

    6. Introduce los siguientes ajustes del activador:

      • Nombre: trigger-on-push

      • Región: selecciona la región del activador. Si el archivo de configuración de compilación asociado a tu activador especifica un grupo privado, la región que selecciones para el activador debe coincidir con la región del grupo privado.

        .

        Si seleccionas global como región, Cloud Build usará la región especificada en el archivo de configuración de compilación para ejecutar la compilación. Puede ser la región del grupo privado, si especificas un grupo privado en el archivo de configuración de la compilación, o el grupo predeterminado global si no especificas ningún grupo privado.

      • Descripción (opcional): escribe una descripción del activador.

      • Evento: selecciona Evento de webhook como evento de repositorio para invocar el activador.

        Si Secret Manager no está instalado, se te pedirá que lo habilites.

      • URL del webhook: seleccione una de las siguientes opciones:

        • Usar un secreto nuevo: si quieres generar un secreto nuevo con Cloud Build. Haz clic en Crear secreto para crear el secreto.
        • Usa un secreto que ya tengas o crea uno si quieres usar un secreto que ya tengas. Introduce el secreto y la versión en los cuadros de selección desplegables.

        Si usas un secreto, es posible que tengas que conceder manualmente el rol Permiso para acceder a los recursos de Secret Manager al agente de servicio de Cloud Build service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com.

        Para obtener más información, consulta el artículo sobre cómo asignar un rol al agente de servicio de Cloud Build.

    7. Haz clic en Mostrar vista previa de la URL y anota la URL. Necesitas esta URL para configurar el webhook en Secure Source Manager.

      • Configuración: en Tipo, selecciona Archivo de configuración de Cloud Build (YAML o JSON) y, en Ubicación, selecciona En línea.
    8. Haz clic en el botón Abrir editor para editar el archivo de configuración de la compilación.

    9. Copia el contenido del archivo cloudbuild.yaml en el editor.

      Como hemos comentado anteriormente, esta canalización tiene comportamientos diferentes en función de la rama que se esté obteniendo. La compilación comprueba si la variable ${branch} coincide con alguna carpeta de entorno. Si es así, Cloud Build ejecuta terraform plan para ese entorno. De lo contrario, Cloud Build ejecuta terraform plan en todos los entornos para asegurarse de que el cambio propuesto sea adecuado para todos ellos. Si no se puede ejecutar alguno de estos planes, la compilación fallará.

      - id: 'tf plan'
        name: 'hashicorp/terraform:1.0.0'
        entrypoint: 'sh'
        args:
        - '-c'
        - |
            branch=$(basename "$_REF")
            if [ -d "environments/${branch}/" ]; then
              cd environments/${branch}
              terraform plan
            else
              for dir in environments/*/
              do
                cd ${dir}
                env=${dir%*/}
                env=${env#*/}
                echo ""
                echo "*************** TERRAFOM PLAN ******************"
                echo "******* At environment: ${env} ********"
                echo "*************************************************"
                terraform plan || exit 1
                cd ../../
              done
            fi

      El comando terraform apply se ejecuta en las ramas del entorno, pero se ignora por completo en cualquier otro caso.

    10. Haga clic en + Añadir variable y añada las dos variables de sustitución siguientes:

      • Variable: _REPO_URL, Valor: $(body.repository.clone_url)
      • Variable: _REF, Valor: $(body.ref)
    11. Haz clic en Crear.

    Configurar un webhook en Secure Source Manager

    Crea un webhook para activar compilaciones cuando se envíen cambios a tus ramas dev o prod.

    1. En la interfaz web de Gestor de fuentes seguras, vaya al repositorio para el que quiera crear un webhook.
    2. Haz clic en Settings (Configuración).
    3. Haz clic en Webhooks y, a continuación, en Add webhook (Añadir webhook).
    4. En el campo ID de gancho, introduce un ID para el webhook.

    5. En el campo URL de destino, introduce la URL del webhook que has copiado al configurar un activador de webhook en Cloud Build.

      Para encontrar la URL del webhook, sigue estos pasos:

      1. Abre la página Triggers (Activadores) en la consola de Google Cloud .

        Abre la página Activadores.

      2. Haz clic en el activador.

      3. En la sección URL del webhook, haga clic en Mostrar vista previa de la URL y copie la URL.

    6. La URL de webhook contiene los valores de clave y secreto que introdujiste al crear el activador de Cloud Build. Para evitar que se filtren estos valores, quítelos del final de la URL de destino y cópielos en el campo Cadena de consulta sensible.

      Para encontrar la clave y el secreto en la URL del webhook, busca el texto que empieza por key=.

      Por ejemplo, dada la siguiente URL: https://cloudbuild.googleapis.com/v1/projects/my-project/triggers/test-trigger:webhook?key=eitIfKhYnv0LrkdsyHqIros8fbsheKRIslfsdngf&secret=Hello%20Secret%20Manager

      Copia y elimina la parte que empieza por el signo de interrogación ?key=... del campo URL de destino. A continuación, quite el signo de interrogación inicial y mueva la parte restante key=... al campo Cadena de consulta sensible.

    7. Haz clic en Añadir webhook.

    8. El webhook se muestra en la página Webhooks (Webhooks).

    Cambiar la configuración del entorno en una nueva rama de funciones

    1. Asegúrate de que estás en la rama dev:

      cd ~/solutions-terraform-cloudbuild-gitops
      git checkout dev
      
    2. Extrae los últimos cambios:

      git pull
      
    3. Crea una rama bug-fix para cambiar la configuración del entorno.

      git checkout -b bug-fix
      
    4. Abre modules/firewall/main.tf para editarlo.

    5. En la línea 30, corrige el error tipográfico "http-server2" en el campo target_tags.

      El valor debe ser "http-server".

    6. Confirma y envía los cambios:

      git add --all
      git commit -m "Fix typo."
      git push google -u bug-fix
      
    7. Abre la página Historial de Cloud Build en la Google Cloud consola:

      Abrir la página Historial

    8. Haga clic en Compilación para ver más información, incluida la salida de terraform plan.

    Ten en cuenta que el trabajo de Cloud Build ha ejecutado la canalización definida en el archivo cloudbuild.yaml. Como hemos comentado anteriormente, esta canalización tiene comportamientos diferentes en función de la rama que se esté obteniendo. La compilación comprueba si la variable ${branch} coincide con alguna carpeta de entorno. Si es así, Cloud Build ejecuta terraform plan para ese entorno. De lo contrario, Cloud Build ejecuta terraform plan en todos los entornos para asegurarse de que el cambio propuesto sea adecuado para todos ellos. Si no se puede ejecutar alguno de estos planes, la compilación fallará.

    - id: 'tf plan'
      name: 'hashicorp/terraform:1.0.0'
      entrypoint: 'sh'
      args:
      - '-c'
      - |
          branch=$(basename "$_REF")
          if [ -d "environments/${branch}/" ]; then
            cd environments/${branch}
            terraform plan
          else
            for dir in environments/*/
            do
              cd ${dir}
              env=${dir%*/}
              env=${env#*/}
              echo ""
              echo "*************** TERRAFOM PLAN ******************"
              echo "******* At environment: ${env} ********"
              echo "*************************************************"
              terraform plan || exit 1
              cd ../../
            done
          fi

    Del mismo modo, el comando terraform apply se ejecuta en las ramas del entorno, pero se ignora por completo en cualquier otro caso. En esta sección, has enviado un cambio de código a una rama nueva, por lo que no se han aplicado despliegues de infraestructura a tu proyecto Google Cloud .

    - id: 'tf apply' name: 'hashicorp/terraform:1.0.0' entrypoint: 'sh' args: - '-c' - | branch=$(basename "$_REF") if [ -d "environments/${branch}/" ]; then cd environments/${branch} terraform apply -auto-approve else echo "***************************** SKIPPING APPLYING *******************************" echo "Branch '${branch}' does not represent an official environment." echo "*******************************************************************************" fi

    Promocionar cambios en el entorno de desarrollo

    Es el momento de aplicar el estado que quieras a tu entorno de dev.

    1. En la interfaz web de Secure Source Manager, ve a tu repositorio.
    2. Haz clic en Nueva solicitud de extracción.
    3. En el campo Combinar con:, selecciona tu rama dev.
    4. En el campo pull from: (Extraer de), selecciona tu rama bug-fix.
    5. Haz clic en Nueva solicitud de extracción.
    6. Haz clic en Crear solicitud de extracción.
    7. Haz clic en Combinar solicitud de extracción y, a continuación, vuelve a hacer clic en Combinar solicitud de extracción.
    8. Comprueba que se haya activado una nueva compilación de Cloud Build:

      Ir a la página Cloud Build

    9. Abre la compilación y consulta los registros.

      Cuando finalice la compilación, verá algo parecido a lo siguiente:

      Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE
      Step #3 - "tf apply": firewall_rule = dev-allow-http
      Step #3 - "tf apply": instance_name = dev-apache2-instance
      Step #3 - "tf apply": network = dev
      Step #3 - "tf apply": subnet = dev-subnet-01
      
    10. Copia EXTERNAL_IP_VALUE y abre la dirección en un navegador web.

      http://EXTERNAL_IP_VALUE
      

      El aprovisionamiento puede tardar unos segundos en arrancar la VM y en propagar la regla de firewall. Al final, verás Environment: dev en el navegador web.

    11. Ve a Cloud Storage:

      Ir a la página de Cloud Storage

    12. Selecciona el proyecto.

    13. Haga clic en su segmento de almacenamiento de estado de Terraform. El nombre del segmento tiene un aspecto similar al siguiente:

      PROJECT_ID-tfstate
      
    14. Haz clic en env y, a continuación, en dev para ver tu archivo de estado de Terraform.

    Promocionar cambios en el entorno de producción

    Ahora que has probado completamente tu entorno de desarrollo, puedes promover tu código de infraestructura a producción.

    1. En la interfaz web de Secure Source Manager, ve a tu repositorio.
    2. Haz clic en la pestaña Solicitudes de extracción.
    3. Haz clic en Nueva solicitud de extracción.
    4. En Combinar con:, selecciona la rama prod de tu repositorio.
    5. En Pull from: (Extraer de), selecciona la rama dev de tu repositorio.
    6. Haz clic en Nueva solicitud de extracción.
    7. En Título, escribe un título como "Promoting networking changes" (Promocionar cambios en la red) y, a continuación, haz clic en Crear solicitud de extracción.
    8. Revisa los cambios propuestos y haz clic en Combinar solicitud de extracción.

      La fecha y la URL del repositorio se añaden al campo de comentarios.

    9. Vuelve a hacer clic en Combinar solicitud de extracción para confirmar la acción.

    10. En la Google Cloud consola, abre la página Historial de compilaciones para ver cómo se aplican los cambios al entorno de producción:

      Ir a la página Cloud Build

    11. Espera a que finalice la compilación y, a continuación, consulta los registros.

      Al final de los registros, verás algo parecido a esto:

      Step #3 - "tf apply": external_ip = EXTERNAL_IP_VALUE
      Step #3 - "tf apply": firewall_rule = prod-allow-http
      Step #3 - "tf apply": instance_name = prod-apache2-instance
      Step #3 - "tf apply": network = prod
      Step #3 - "tf apply": subnet = prod-subnet-01
      
    12. Copia EXTERNAL_IP_VALUE y abre la dirección en un navegador web.

      http://EXTERNAL_IP_VALUE
      

      El aprovisionamiento puede tardar unos segundos en arrancar la VM y en propagar la regla de firewall. Finalmente, verás Environment: prod en el navegador web.

    13. Ve a Cloud Storage:

      Ir a la página de Cloud Storage

    14. Selecciona el proyecto.

    15. Haga clic en su segmento de almacenamiento de estado de Terraform. El nombre del segmento tiene un aspecto similar al siguiente:

      PROJECT_ID-tfstate
      
    16. Haga clic en env y, a continuación, en prod para ver su archivo de estado de Terraform.

    Has configurado correctamente una canalización de infraestructura como código sin servidor en Cloud Build. En el futuro, puedes probar lo siguiente:

    • Añade implementaciones para casos prácticos independientes.
    • Crea entornos adicionales para reflejar tus necesidades.
    • Usa un proyecto por entorno en lugar de una VPC por entorno.

    Limpieza

    Cuando hayas terminado el tutorial, elimina los recursos que has creado enGoogle Cloud para que no se te facturen en el futuro.

    Eliminar el proyecto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Siguientes pasos