Usar recomendaciones de infraestructura como código

Descripción general

Google Cloud Policy Intelligence ayuda a las empresas a comprender y administrar las políticas para disminuir el riesgo. Los clientes pueden mejorar su seguridad sin aumentar las cargas de trabajo gracias a la visibilidad y la automatización.

Con el recomendador, puedes recuperar recomendaciones de los recursos de Google Cloud, lo que te ayuda a mejorar la seguridad de la nube, ahorrar costos y mucho más. Para obtener una lista de recomendaciones compatibles, consulta la documentación de recomendador. En este instructivo, se describe cómo usar las recomendaciones de tamaño para instancias de VM y las recomendaciones de Identity and Access Management (IAM). El recomendador usa el aprendizaje automático a fin de proporcionar a los administradores recomendaciones para quitar el acceso innecesario a los recursos de Google Cloud y determinar el cambio de tamaño de las instancias de Compute Engine con el objetivo de lograr una utilización más eficiente de los recursos.

Cada recomendación incluye una acción sugerida y su impacto. Después de revisar las recomendaciones de los impactos identificados y las otras consideraciones específicas para tu entorno, puedes seleccionar las que deseas aplicar. Puedes aplicar las recomendaciones de forma manual desde Google Cloud Console o de manera programática si las integras a tu canalización de infraestructura como código.

La infraestructura como código (IaC) te permite automatizar la creación de tus recursos de Google Cloud. Debes mantener actualizado el repositorio de IaC y los cambios de ruta que se realicen en la organización de Google Cloud mediante ella. Por lo general, las estrategias de IaC en las organizaciones demuestran ser beneficiosos cuando se implementan con rigor y sirven como la versión única de la infraestructura de nube. Mantener el repositorio de IaC actualizado es fundamental para evitar desvíos entre la versión de tu infraestructura que refleja el repositorio de IaC y lo que tienes en la organización.

Recomendaciones de IAM

Entre otras prácticas líderes, una común es el principio de privilegio mínimo de seguridad y una consideración detenida de la forma en que los cambios en tu organización se lanzan y sincronizan con tu repositorio de IaC.

Recomendación de tamaño para las VM

Las recomendaciones de tamaño te ayudan a reducir los costos, ya que proporcionan sugerencias para cambiar el tamaño del tipo de máquina de tus instancias a fin de usar de manera más eficiente los recursos de instancias.

En este instructivo, se describe cómo diseñar y compilar una canalización de automatización para aplicar una recomendación de Policy Intelligence de manera programática. Como parte de esta canalización de automatización, aprenderás a mantener actualizado tu repositorio de infraestructura como código (IaC) con los cambios que decidas realizar en tu organización de Google Cloud, en función del tamaño de la VM y las recomendaciones de vinculación de las políticas de IAM que hace el recomendador.

En este instructivo, se usa Hashicorp Terraform como la herramienta de IaC. Sin embargo, los patrones arquitectónicos y los componentes usados en la canalización de automatización descrita pueden aprovecharse incluso si usas otra herramienta de administración de IaC, como Deployment Manager. Deberás modificar la base de código abierto disponible con este instructivo para adaptarse a tu implementación de IaC específica.

Esta guía está orientada a los arquitectos, los propietarios de productos y los desarrolladores que podrían ser responsables de la administración, la seguridad y la planificación de la infraestructura de Google Cloud.

Arquitectura de la canalización de automatización

En el siguiente diagrama, se muestran los componentes que usas en esta canalización de automatización.

componentes en la canalización de automatización

Un trabajo programado de Cloud Scheduler ejecuta el servicio de análisis del recomendador. El servicio llama a la API del recomendador a fin de recuperar las recomendaciones del recomendador para los proyectos que especifiques. Luego, analiza estas recomendaciones de tamaño de VM y recomendaciones de IAM para mapearlas a la configuración que tienes en tus manifiestos de Terraform. El servicio actualiza tus manifiestos de IaC para reflejar estas recomendaciones. Se genera una solicitud de extracción con los cambios para que puedas revisar las actualizaciones. Una vez que revises y combinas la solicitud de extracción, un trabajo de Cloud Build implementa los cambios en tu infraestructura de la organización de Google Cloud.

En la canalización, se usan varios servicios complementarios de Google Cloud para realizar un seguimiento de las recomendaciones procesadas, lo que genera notificaciones cuando se completa la compilación y almacena el estado de Terraform. Aprenderás más sobre estos servicios a lo largo de este instructivo.

En la siguiente lista, se describen las funciones de los componentes y los requisitos de control de acceso:

Recomendaciones de Platform Intelligence
Función: Genera recomendaciones de seguridad y tamaño de VM

Control de acceso: La cuenta de servicio de Google Cloud debe tener los permisos de IAM necesarios para recuperar las recomendaciones mediante la API del recomendador.

Revisa las funciones y los permisos del recomendador a fin de seleccionar la función más adecuada aplicable a la cuenta de servicio que usas para ejecutar el servicio recommender-parser.

Cloud Scheduler

Propósito: Cloud Scheduler activa el servicio de análisis del recomendador. Cloud Scheduler te permite configurar varios trabajos que invocan tantas instancias del servicio del analizador como necesites. Cada invocación debe pasar las siguientes entradas:

  • Lista de proyectos para los que se deben procesar las recomendaciones
  • Tipo de recomendación
  • Nombre del repositorio de IaC

Control de acceso: Crea o identifica una cuenta de servicio de Google Cloud para acceder a las llamadas desde Cloud Scheduler al servicio de análisis del recomendador.

Otorga a la cuenta de servicio la función de agente de servicio de Cloud Scheduler para que pueda ejecutar trabajos de Cloud Scheduler. Además, otorga a la cuenta de servicio la función de invocador de Cloud Run, ya que esa cuenta invoca un servicio de Cloud Run.

Si quieres obtener más detalles, consulta la documentación sobre cómo configurar el acceso autenticado para trabajos de programador.

Servicio de Cloud Run

Función: El servicio de análisis del recomendador es el lugar en el que reside toda la lógica de procesamiento. Tiene varias rutas y cada una de ellas cumple un propósito específico:

  • Analizar las recomendaciones para cada tipo de recomendación
  • Actualizar el estado de las recomendaciones que se procesan

Control de acceso: Usa la IAM para administrar el acceso a este servicio.

Además, asígnale el servicio a una cuenta de servicio dedicada. Esto garantiza que solo el servicio pueda invocar otros servicios como Firestore.

HashiCorp Terraform

Función: Terraform 0.12 es la herramienta de infraestructura como código.

Se usa un compilador de Cloud Build para Terraform a fin de invocar comandos de Terraform, y la cuenta de servicio de Cloud Build se usa para este propósito.

Cloud Build

Función: Google Cloud Build automatiza la implementación de infraestructura en función de los cambios realizados en los manifiestos de la IaC según las recomendaciones de Policy Intelligence.

Control de acceso: La cuenta de servicio de Cloud Build debe tener el conjunto de permisos correcto para interactuar con los recursos de tu proyecto de prueba.

Consulta la documentación para configurar una cuenta de servicio de Cloud Build.

GitHub

Función: El repositorio de IaC usa GitHub para el control de la fuente. El repositorio de IaC en GitHub está integrado en Cloud Build. Cuando se realizan confirmaciones en la rama principal, se activa un trabajo de Cloud Build para ejecutar un conjunto de tareas preconfiguradas.

Control de acceso: Deberás generar claves SSH para habilitar el acceso a tu repositorio de IaC.

Además, debes generar un token de acceso personal para enviar confirmaciones a GitHub.

Firestore

Firestore es una base de datos de documentos NoSQL escalable y completamente administrada que se usa en esta arquitectura para conservar información relacionada con los ID de recomendación que analiza el servicio de análisis de recomendador, junto con los detalles correspondientes pertinentes a confirmaciones de Git.

Los detalles que se conservan en Firestore cumplen una función integral en el ciclo de reacción que forma parte de la canalización de extremo a extremo. Después de seleccionar una recomendación generada por la API del recomendador y antes de procesar la recomendación, el servicio marca el estado de la recomendación como CLAIMED. Después de que se aplica la recomendación con éxito, el servicio consulta la base de datos para recuperar los ID de recomendación que el trabajo de Cloud Build aplicó de forma correcta y cambia el estado de la recomendación a SUCCEEDED. Si el trabajo de Cloud Build falla, el estado de recomendación cambiará a FAILED.

Control de acceso: Consulta las funciones de Firestore para obtener más información. El servicio de análisis del recomendador lee datos de Firestore y necesita la función roles/datastore.user para hacerlo.

Pub/Sub

Función: Cloud Build publica mensajes en un tema de Pub/Sub cuando el estado de la compilación cambia, como cuando esta se crea, cuando cambia a un estado en funcionamiento o cuando finaliza.

El tema de Pub/Sub en el que Cloud Build publica mensajes se llama cloud-builds y se crea automáticamente cuando habilitas la API de Cloud Build en tu proyecto.

Control de acceso: Las suscripciones de envío se pueden configurar para proporcionar un encabezado de autenticación a fin de permitir que el servicio autorice la solicitud. Consulta Usa suscripciones de envío para obtener más información.

Objetivos

  • Compila una canalización de automatización para hacer lo siguiente
    • Supervisar de forma proactiva las recomendaciones de Policy Intelligence de la plataforma
    • Analizar las recomendaciones y aplicar actualizaciones a un repositorio de IaC existente
  • Obtén más información sobre cómo puedes usar un conjunto de servicios de Google Cloud, Hashicorp Terraform y GitHub para compilar esta canalización.
  • Comprende las suposiciones y prácticas recomendadas que debes tener en cuenta para compilar esta canalización
  • Prueba la canalización

Costos

En este instructivo, se usan componentes facturables de Google Cloud, que incluyen lo siguiente:

  • Cloud Run
  • Cloud Build
  • Compute Engine
  • Cloud Storage
  • Firestore
  • Pub/Sub
  • Cloud Scheduler
  • Recomendador

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto. Los usuarios nuevos de Google Cloud pueden ser elegibles para obtener una prueba gratuita.

Antes de comenzar

En este instructivo, se supone que tienes una cuenta de GitHub y que estás familiarizado con Git, Node.js, Terraform y Docker.

Notas y suposiciones de la versión

Hay muchas variantes en la forma en que se usan los manifiestos y las herramientas de IaC.

Revisa la siguiente información para determinar cómo este instructivo se adapta a tu canalización de IaC y qué tipos de cambios podrían requerirse.

  • Esta canalización utiliza Terraform ver. 0,12 Los cambios significativos en la sintaxis de configuración de HCL o los cambios en la estructura del archivo de estado de Terraform pueden generar problemas rotundos.
  • En esta canalización, se supone que las estructuras de directorios de IaC no están anidadas y que un repositorio de IaC administra los recursos en uno o más proyectos de Google Cloud.
  • Las variables de Terraform que se pasan como argumentos de la línea de comandos de variables de entorno no se admiten. El prototipo supone la configuración declarativa de las variables de Terraform en un archivo tfvars.
  • El recomendador genera recomendaciones de IAM cuando no se usa un subconjunto de permisos para una función durante 60 días, y las recomendaciones de tamaño de VM siguen un patrón similar. Para los fines de este instructivo, se proporcionaron cargas útiles de recomendación de muestra que se pueden usar a fin de probar la canalización.
  • No se admiten bucles en Terraform en esta versión.
  • Los módulos de Terraform no se admiten. La base de código es de código abierto y se da por hecho que realizarás las mejoras específicas necesarias al flujo de trabajo de análisis para que se adapte a tu estructura de directorio y al uso de los módulos.

La versión actual del servicio de análisis del recomendador de código abierto se alinea con las siguientes limitaciones conocidas de recomendaciones de IAM:

Requisitos previos

  1. Selecciona o crea dos proyectos de Google Cloud.

    Ir a la página Selector de proyectos

    • Un proyecto de compilación que aloja y ejecuta la canalización de automatización.
    • Un proyecto de prueba que aloja los recursos de Google Cloud usados para probar la canalización de automatización.
  2. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  3. En el proyecto de prueba, habilita el recomendador y la API de Compute Engine.

    Habilita las API

  4. En el proyecto de compilación, habilita las API de Cloud Run, Firestore, Pub/Sub, Cloud Scheduler, IAM y CloudResourceManager.

    Habilita las API

Cuando finalices este instructivo, puedes borrar los recursos creados para evitar que se te siga facturando. Para obtener más detalles consulta la sección Limpieza.

Configure su entorno

  1. En Cloud Console, selecciona el proyecto build.
  2. En Cloud Console, ve a Cloud Shell:

    Ir a Cloud Shell

    En la parte inferior de Cloud Console, se abre una sesión de Cloud Shell que muestra una ventana emergente con una línea de comandos. Cloud Shell es un entorno de shell con el SDK de Cloud ya instalado, en el que se incluye la herramienta de línea de comandos de gcloud, y que ya tiene valores establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

    Usa Cloud Shell para todos los comandos de la terminal en este instructivo.

  3. Crea una variable de entorno para retener el número de proyecto de tu proyecto build con el siguiente comando:

    export BUILD_PROJECT_ID=$DEVSHELL_PROJECT_ID
    
  4. Crea una variable de entorno para retener el número de proyecto de tu proyecto de test. Copia el ID del proyecto de prueba de forma manual y reemplaza PROJECT-ID por él.

    export TEST_PROJECT_ID=PROJECT-ID
    
  5. Puedes asignar la configuración predeterminada para los valores que se usan en todo el instructivo, como la región y la zona. En este instructivo, usarás us-central1 como la región predeterminada y us-central1-b como la zona predeterminada.

  6. Establece la región y zona predeterminadas para este instructivo mediante la ejecución del siguiente comando:

    gcloud config set compute/zone us-central1-b --project $BUILD_PROJECT_ID
    gcloud config set compute/zone us-central1-b --project $TEST_PROJECT_ID
    
  7. Configura tu proyecto build como el proyecto predeterminado:

    gcloud config set project $BUILD_PROJECT_ID
    
  8. Crea una variable de entorno llamada BUILD_PROJECT_NUMBER para tu número de proyecto de build.

    export BUILD_PROJECT_NUMBER=$(gcloud projects describe $DEVSHELL_PROJECT_ID --format='value(projectNumber)')
    
  9. Clona el repositorio de Git para este instructivo:

Cree un bucket para el estado de Terraform

Crea un bucket de Cloud Storage en tu proyecto de compilación para almacenar el archivo de estado de Terraform.

gsutil mb -p ${BUILD_PROJECT_ID} -l us-central1 \
 gs://recommender-tf-state-$BUILD_PROJECT_ID

Crea un repositorio de GitHub

Crea un repositorio de GitHub que sirva como repositorio de IaC de muestra.

  1. Crea un nuevo repositorio privado de GitHub. Este repositorio de IAC-REPO-NAME sirve como repositorio de IaC para los fines de este instructivo.

  2. En los siguientes pasos, enviarás los archivos del subdirectorio sample-iac del repositorio clonado a tu cuenta de GitHub.

    1. En Cloud Shell, copia el directorio sample-iac en tu directorio principal. Usarás este directorio para crear un repositorio local nuevo y enviarlo a GitHub.

      cp -r recommender-iac-pipeline-nodejs-tutorial/sample-iac $HOME
      
    2. Navega al directorio nuevo

      cd $HOME/sample-iac
      
    3. Inicializa el repositorio en tu máquina local.

      git init
      
    4. Agrega IAC-REPO-NAME como repositorio remoto y reemplaza IAC-REPO-NAME y GITHUB-ACCOUNT por los valores adecuados.

      git remote add origin https://github.com/GITHUB-ACCOUNT/IAC-REPO-NAME
      
    5. Reemplace los marcadores de posición de los archivos en este repositorio por el ID del proyecto de test y el nombre del bucket de Cloud Storage de Terraform.

      sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./terraform.tfvars
      
      sed -i "s|__STATE_BUCKET_NAME__|recommender-tf-state-$BUILD_PROJECT_ID|g" ./backend.tf
      
    6. Agrega, confirma y envía a GitHub.

      git add .
      git commit -m "First Commit"
      git push origin master
      
    7. Accede a tu cuenta de GitHub cuando se te solicite.

Genera claves SSH para tu repositorio

Configura la autenticación de claves SSH con tu repositorio de IaC en GitHub y sube las claves a Cloud Storage.

  1. Genera claves SSH para tu repositorio

    1. Genera un par de claves SSH Reemplaza your_email@example.com* por tu dirección de correo electrónico de GitHub. En Cloud Shell:

      ssh-keygen -t rsa -b 4096 -m PEM -C "your_email@example.com"
      
    2. Cuando se te solicite “Ingresar un archivo en el que se guardará la clave”, presiona Intro. Con esta acción, se acepta la ubicación del archivo predeterminada.

    3. Cuando se te solicite ingresar una frase de contraseña, presiona Intro.

  2. Anota el directorio SSH-KEYS-DIR en el que guardaste las claves SSH descargadas. De forma predeterminada, la ubicación es $HOME/.ssh/

  3. Copia la clave pública SSH que generaste en tu repositorio de GitHub como una clave de implementación.

    1. Copia la clave pública SSH que generaste en Cloud Shell. Reemplaza SSH-KEYS-DIR por la ruta del directorio.

      cat SSH-KEYS-DIR/id_rsa.pub
      
    2. En tu cuenta de GitHub, navega hasta el repositorio IAC-REPO-NAME.

    3. Haz clic en Configuración > Implementar claves.

    4. Haz clic en Agregar clave de implementación y pega la clave pública SSH que copiaste. Elige un Título para la clave.

    5. Selecciona la casilla de verificación “Permitir acceso de escritura

    6. Haz clic en Guardar.

  4. Regresa a tu sesión de Cloud Shell

  5. Crea el archivo known_hosts para GitHub. En tu sesión de Cloud Shell, ejecuta el siguiente comando:

    ssh-keyscan github.com >> ~/.ssh/known_hosts
    
  6. Crea un bucket de Cloud Storage en tu proyecto de build y sube las claves SSH y el archivo known_hosts a este. Reemplaza SSH-KEYS-DIR con la ruta al directorio en el que generaste las claves SSH.

    gsutil mb -p ${BUILD_PROJECT_ID} -l us-central1 gs://github-keys-$BUILD_PROJECT_ID
    
    gsutil cp SSH-KEYS-DIR/id_rsa* gs://github-keys-$BUILD_PROJECT_ID
    gsutil cp SSH-KEYS-DIR/known_hosts gs://github-keys-$BUILD_PROJECT_ID
    
  7. Genera un token de acceso personal para GitHub. Este token se usa cuando se realizan operaciones de Git mediante llamadas a la API que realiza el servicio de análisis del recomendador para generar solicitudes de extracción y comprobar los manifiestos de IaC actualizados.

    1. En tu cuenta de GitHub, en la esquina superior derecha de cualquier página, haz clic en tu foto de perfil y, luego, en Settings.

    2. En la barra lateral izquierda, haz clic en Developer settings.

    3. En la barra lateral izquierda, haz clic en Personal access tokens.

    4. Haz clic en Generate new token.

    5. Asigna un nombre descriptivo al token.

    6. Selecciona los alcances como repositorio.

    7. Haz clic en Generate token.

    8. Copia el token al portapapeles.

    9. En tu sesión de Cloud Shell, crea una variable de entorno.

      export GITHUB_PAT=personal-access-token-you-copied
      

Configurar Cloud Build

  1. Conecta tu repositorio de Git IAC-REPO-NAME para integrarlo en Cloud Build.

    1. Ve a la página de la app de Cloud Build en GitHub Marketplace.
    2. Desplázate hacia abajo y haz clic en Configurar con Google Cloud Build en la parte inferior de la página.
    3. Si se te solicita, accede a GitHub.
    4. Selecciona Only select repositories. Usa la lista desplegable Select repositories para habilitar solo el acceso a tu IAC-REPO-NAME en la aplicación de Cloud Build.
    5. Haz clic en Install.
    6. Accede a Google Cloud.

      Se mostrará la página de autorización, en la que se te pide que autorices a la app de Google Cloud Build para que se conecte a Google Cloud.

    7. Haz clic en Autorizar Google Cloud Build a través de GoogleCloudBuild. Se te redireccionará a Cloud Console.

    8. Selecciona tu proyecto de Google Cloud.

    9. Marca la casilla de verificación de consentimiento y haz clic en Siguiente.

    10. En la página Select repository que aparece, selecciona el repositorio de GitHub IAC-REPO-NAME.

    11. Haz clic en Conectar repositorio.

    12. Haz clic en Crear un activador. Esto creará un activador para ti.

    13. Haz clic en Crear para guardar el activador de compilación.

    Para obtener más información, consulta Ejecuta compilaciones en GitHub.

  2. El directorio que copiaste tiene un archivo cloudbuild.yaml. En este archivo de configuración, se describen los pasos que ejecuta un trabajo de Cloud Build cuando se activa.

    steps:
    - name: hashicorp/terraform:0.12.0
      args: ['init']
    - name: hashicorp/terraform:0.12.0
      args: ['apply', '-auto-approve']
    
  3. Agrega permisos a tu cuenta de servicio de Cloud Build para permitirle crear cuentas de servicio, asociar funciones y máquinas virtuales (instancias de Compute Engine) en el proyecto de prueba.

    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:$BUILD_PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role roles/compute.admin \
      --project $TEST_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:$BUILD_PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role roles/iam.serviceAccountAdmin \
      --project $TEST_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
    --member serviceAccount:$BUILD_PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
    --role roles/iam.securityAdmin \
    --project $TEST_PROJECT_ID
    
  4. Abre la página Activador de compilación en Cloud Console.

  5. Selecciona el proyecto build y haz clic en Abrir.

  6. Actualiza la definición del activador:

    1. Haz clic en el menú y, luego, en Editar.
    2. En Configuración, selecciona la opción Archivo de configuración de Cloud Build (yaml o json) y escribe cloudbuild.yaml en el campo de texto.
    3. Haz clic en Guardar.
  7. Para probar un activador de compilación de forma manual, haz clic en Ejecutar en la entrada de tu activador en la lista.

  8. Verifica que el trabajo de Cloud Build que ejecutó en el paso anterior haya creado una instancia de Compute Engine llamada tf-compute-1 y una cuenta de servicio llamada Terraform Recommender Test en tu proyecto de prueba.

Implementa el servicio recommender-parser de Cloud Run

  1. En Cloud Shell, cambia los directorios al directorio creado mediante la clonación del repositorio

    cd $HOME/recommender-iac-pipeline-nodejs-tutorial/parser-service
    
  2. Configura Google Cloud a fin de usar una región predeterminada para los servicios de Cloud Run. En este instructivo, usarás la región us-central1, pero puedes elegir una región compatible diferente si lo prefieres.

    gcloud config set run/region us-central1
    
  3. El directorio parser-service tiene un subdirectorio de stub con algunos JSON de carga útil de muestra para que pruebes el servicio de análisis de recomendador. Ejecuta los siguientes comandos sed para reemplazar los marcadores de posición PROJECT_ID en estos JSON por el ID de tu proyecto de prueba.

    sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./stub/iam.json
    sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./stub/vm.json
    
  4. Ejecuta el siguiente comando a fin de crear una variable de entorno para tu imagen de Docker.

    export IMAGE=gcr.io/$BUILD_PROJECT_ID/recommender-parser:1.0
    
  5. Compila la imagen y súbela a Container Registry.

    gcloud builds submit --tag $IMAGE .
    
  6. Crea una cuenta de servicio para que el servicio recommender-parser interactúe con otros servicios de Google Cloud en la canalización. Se recomienda otorgar permisos detallados a tus servicios de Cloud Run. Consulta Identidad del servicio de Cloud Run para obtener más información.

    gcloud beta iam service-accounts create recommender-parser-sa \
      --description "Service account that the recommender-parser service uses to invoke other GCP services" \
      --display-name "recommender-parser-sa" \
      --project $BUILD_PROJECT_ID
    
  7. El servicio recommender-parser necesita acceder a las Llaves SSH de GitHub y al estado de Terraform que subiste a los bucket de Cloud Storage creados anteriormente. Agrega la cuenta de servicio como miembro del bucket de Cloud Storage.

    gsutil iam ch serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com:objectCreator,objectViewer \
    gs://github-keys-$BUILD_PROJECT_ID
    
    gsutil iam ch serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com:objectCreator,objectViewer \
    gs://recommender-tf-state-$BUILD_PROJECT_ID
    
  8. Otorga a la cuenta de servicio del servicio recommender-parser acceso a Firestore, al recomendador y a la API de Service Usage.

    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/datastore.user
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.iamAdmin
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.iamViewer
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.computeAdmin
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/serviceusage.serviceUsageConsumer
    
  9. Implementa el servicio de Cloud Run, llamado recommender-parser, mediante la ejecución del comando. Reemplaza GITHUB-ACCOUNT por el nombre de usuario de tu cuenta de GitHub, no por el correo electrónico. Acepta las solicitudes del sistema.

    gcloud run deploy \
     --image=${IMAGE} \
     --no-allow-unauthenticated \
     --region us-central1 \
     --platform managed \
     --service-account recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
     --set-env-vars="GITHUB_ACCOUNT=github.com:GITHUB-ACCOUNT,GITHUB_PAT=${GITHUB_PAT},SSH_KEYS_BUCKET=github-keys-${BUILD_PROJECT_ID},TERRAFORM_STATE_BUCKET=recommender-tf-state-$BUILD_PROJECT_ID" \
     --project $BUILD_PROJECT_ID \
     recommender-parser
    

Configura Firestore

  1. En Google Cloud Console, en el proyecto build, navega hasta la página de Firestore.
  2. Cuando se te solicite la selección del modo, haz clic en Seleccionar modo nativo.
  3. Selecciona us-east1 como la ubicación predeterminada.
  4. Haga clic en Crear base de datos.

El servicio recommender-parser escribe documentos en esta base de datos para los siguientes fines:

  • Para realizar un seguimiento de las recomendaciones recuperadas de la API de recomendador
  • Llama a la API del recomendador una vez que las recomendaciones se procesen para actualizar el estado de cada recomendación procesada a SUCCEEDED o FAILED según corresponda. Este es un paso clave que hace que la canalización sea idempotente, ya que garantiza que las recomendaciones no se procesen de forma incompleta ni varias veces.

Configura un trabajo de Cloud Scheduler

  1. Crea una cuenta de servicio que los trabajos de Cloud Scheduler usen para ejecutar el servicio recommender-parser.

    gcloud beta iam service-accounts create recommender-scheduler-sa \
      --description "Service Account used by Cloud Scheduler to invoke the recommender-parser service" \
      --display-name "recommender-scheduler-sa" \
      --project $BUILD_PROJECT_ID
    
  2. Proporciona la función de ejecutor/invocador de la cuenta de servicio para poder invocar el servicio de Cloud Run.

    gcloud beta run services add-iam-policy-binding recommender-parser \
    --member=serviceAccount:recommender-scheduler-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
    --role=roles/run.invoker \
    --region=us-central1
    
  3. Obtén tu URL del servicio del recomendador:

    gcloud beta run services list --platform managed --project $BUILD_PROJECT_ID
    

    Tu trabajo de Cloud Scheduler invoca la ruta del servicio recommender-parser, /recommendation/iam, para analizar recomendaciones de IAM y la ruta /recommender/vm para analizar las recomendaciones de tamaño de la VM.

  4. Crea una variable para el extremo que invocan los trabajos de Cloud Scheduler. Reemplaza RECOMMENDER-SERVICE-URL por la URL del servicio del recomendador que copiaste en el paso anterior.

    export RECOMMENDER_ROUTE_TO_INVOKE_IAM=RECOMMENDER-SERVICE-URL/recommendation/iam
    

    Tu URL debería verse como esta muestra después de agregar la información de ruta:

    RECOMMENDER-SERVICE-URL/recommendation/iam
    
  5. Crea un trabajo de Cloud Scheduler llamado recommender-iam-scheduler..

    • Cambia la zona horaria seleccionada en función de tu ubicación.
    • Reemplaza IAC-REPO-NAME por el nombre del repositorio de GitHub que creaste.

    El cuerpo del mensaje toma tres entradas, y debes construirlo como se describe a continuación:

    • repo: este es el nombre de tu repositorio de GitHub IAC-REPO-NAME que creaste en Crea un repositorio de GitHub.

    • projects: Una lista o un array de ID de proyectos de Google Cloud a los que se mapea este repositorio de GitHub de IaC. En este instructivo, es tu proyecto test.

    • stub:El recomendador genera recomendaciones de IAM cuando no se usa un subconjunto de permisos para una función durante 60 días, y las recomendaciones de tamaño de VM siguen un patrón similar. Para probar la canalización a pedido, stub se puede pasar como true a fin de que la canalización se pruebe con las cargas útiles de recomendador de muestra proporcionadas en el repositorio que clonaste para este instructivo.

    gcloud beta scheduler jobs create http recommender-iam-scheduler \
      --project $BUILD_PROJECT_ID \
      --time-zone "America/Los_Angeles" \
      --schedule="0 */3 * * *" \
      --uri=$RECOMMENDER_ROUTE_TO_INVOKE_IAM \
      --description="Scheduler job to invoke recommendation pipeline" \
      --oidc-service-account-email="recommender-scheduler-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com" \
      --headers="Content-Type=application/json" \
      --http-method="POST" \
      --message-body="{ \"repo\": \"IAC-REPO-NAME\", \"projects\": [\"$TEST_PROJECT_ID\"], \"location\": \"global\", \"stub\": true }"
    

Pasos adicionales

Cloud Build publica la información de compilación en un tema de Pub/Sub llamado cloud-builds que se creó automáticamente cuando habilitaste la API de Cloud Build en tu proyecto de compilación.

  1. Ejecuta el siguiente comando para verificar que el tema de cloud-builds exista en el proyecto build:

    gcloud pubsub topics describe cloud-builds
    

    Si el tema existe, verás el siguiente resultado, en el que BUILD-PROJECT-ID es el ID del proyecto de compilación:

    name: projects/BUILD-PROJECT-ID/topics/cloud-builds
    

    Si recibes un mensaje de error que indica que no se encontró el recurso, sigue las instrucciones sobre cómo suscribirse a las notificaciones de compilación para crear el tema de forma manual.

  2. Crea una cuenta de servicio que Pub/Sub use para invocar el extremo del servicio recommender-parser.

    gcloud beta iam service-accounts create recommender-ci-subscription-sa \
      --description "Service Account used by Cloud Pub/Sub to push Cloud Build events to the recommender-parser service" \
      --display-name "recommender-ci-subscription-sa" \
      --project $BUILD_PROJECT_ID
    
  3. La cuenta de servicio de Pub/Sub debe estar asociada con las funciones que necesita para publicar mensajes y, también, invocar el servicio recommender-parser.

    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/pubsub.publisher \
      --project $BUILD_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/pubsub.subscriber \
      --project $BUILD_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/run.invoker \
      --project $BUILD_PROJECT_ID
    
  4. Agrega la cuenta de servicio recommender-ci-subscription-sa que creaste en el servicio recommender-parser como miembro con la función invoker.

    gcloud beta run services add-iam-policy-binding recommender-parser \
      --member=serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/run.invoker --region=us-central1
    
  5. Navega a Pub/Sub en Google Cloud Console.

  6. Haz clic en el tema cloud-builds.

  7. Haz clic en Crear suscripción.

  8. En ID de la suscripción, escribe recommender-service-build-events.

  9. En Tipo de entrega, selecciona Envío.

  10. En Extremo, escribe tu URL del servicio del recomendador que agregó /ci.

  11. Marca Habilitar autenticación.

    1. Selecciona la cuenta de servicio recommender-ci-subscription-sa que creaste.
    2. Haz clic en Otorgar en respuesta al mensaje de solicitud.
  12. Selecciona Plazo de confirmación en 60 segundos.

  13. No cambies el resto de los valores predeterminados.

  14. Haga clic en Crear.

Prueba la canalización

El recomendador genera recomendaciones de IAM cuando no se usa un subconjunto de permisos para una función durante 60 días. Las recomendaciones de tamaño de VM siguen un patrón similar. Para probar esta canalización a pedido, usarás las cargas útiles de ejemplo de las recomendaciones JSON que se proporcionaron en el subdirectorio stub suministrado en el repositorio que clonaste para este instructivo. Esto te permite probar la canalización, excluir las llamadas a la API que hace el análisis del recomendador al extremo de la API del recomendador para actualizar el estado de las recomendaciones que se aplicó de forma correcta

Como alternativa, si tienes recomendaciones activas en tus proyectos de Google Cloud, puedes probar la canalización de extremo a extremo sin necesidad de usar stubs. El resultado descrito a continuación es pertinente en el momento en que utilizas las cargas útiles de muestra para probar la canalización. Sin embargo, los pasos para probar esta canalización sin muestras siguen siendo los mismos.

  1. En Cloud Console, navega hasta tu proyecto de prueba y revisa el recurso que se creó. Debes contar con lo siguiente:

    1. Una instancia de Compute Engine llamada tf-compute-1 que sea del tipo de máquina g1-small
    2. Una cuenta de servicio llamada Terraform Recommender Test con la función editor para tu proyecto de prueba.
  2. En la página de la consola de Cloud Scheduler en tu proyecto build, haz clic en Ejecutar ahora para el trabajo recommender-iam-scheduler.

  3. Haz clic en el trabajo para ver los registros. También puedes ver los registros del servicio del recomendador para obtener una vista detallada de los pasos que ejecuta el servicio.

  4. Cuando el servicio finalice su ejecución, navega hasta tu repositorio IAC-REPO-NAME de GitHub. El servicio recommender-parser habría generado una solicitud de extracción por ti. Revisa los manifiestos de IaC modificados que incluyen esta solicitud de extracción y haz clic en Combinar solicitud de extracción si estás satisfecho con los cambios en los manifiestos de IaC.

  5. Cuando se combina la solicitud de extracción, se crea una confirmación nueva para la rama principal. Esto activa un trabajo de Cloud Build que implementa las modificaciones en los recursos de Google Cloud en el proyecto test. Espera unos minutos para que se complete el trabajo de Cloud Build y podrás revisar su estado en Cloud Console.

  6. Cuando se complete el trabajo, navega a tu proyecto de prueba. Las cargas útiles de muestra proporcionadas realizan los siguientes cambios en los recursos de tu proyecto de prueba.

    • La cuenta de servicio de prueba de Terraform, que antes tiene una función de editor cuando se implementó, se cambió a viewer.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos utilizados en este instructivo, borra ambos proyectos que creaste.

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, sigue estos pasos:

  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.

¿Qué sigue?

  • Explora arquitecturas de referencia, diagramas, instructivos y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.
  • Obtén más información sobre Google Cloud Policy Intelligence en la documentación.