Antes de comenzar
Instalar Google Cloud CLI
Para usar gcloud beta terraform vet
, primero debes instalar Google Cloud CLI:
Instala la CLI de Google Cloud, pero omite el comando
gcloud init
.Ejecuta los siguientes comandos para instalar el componente terraform-tools:
gcloud components update gcloud components install terraform-tools
Ejecuta el siguiente comando para verificar que la CLI de gcloud esté instalada:
gcloud beta terraform vet --help
Obtén los permisos necesarios
La cuenta de Google Cloud que uses para la validación debe tener los siguientes permisos:
getIamPolicy
:gcloud beta terraform vet
necesita obtener políticas completas de Identity and Access Management y combinarlas con miembros y vinculaciones para obtener un estado final preciso para validar.resourcemanager.projects.get
:gcloud beta terraform vet
necesita obtener la ascendencia del proyecto desde la API a fin de crear de forma precisa un nombre de recurso de CAI completo para cualquier proyecto relacionado con los recursos validados.resourcemanager.folders.get
:gcloud beta terraform vet
necesita obtener el principal de la carpeta de la API para poder construir con precisión un nombre de recurso de CAI completo si los recursos validados contienen recursos relacionados con la carpeta.
Configura una biblioteca de políticas
Debes crear una biblioteca de políticas para usar esta herramienta.
Valida políticas
1. Genera un plan de Terraform
gcloud beta terraform vet
es compatible con Terraform 0.12+. gcloud beta terraform vet
toma el JSON terraform plan
como su entrada. Para generar el archivo JSON, ejecuta los siguientes comandos en el directorio de Terraform:
terraform plan -out=tfplan.tfplan terraform show -json ./tfplan.tfplan > ./tfplan.json
2. Ejecuta gcloud beta terraform vet
gcloud beta terraform vet
te permite validar tu terraform plan
JSON con el POLICY_LIBRARY_REPO de tu organización. Por ejemplo:
git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR
Cuando ejecutas este comando, gcloud beta terraform vet
recupera los datos del proyecto mediante las API de Google Cloud que son necesarias para una validación precisa de tu plan.
Marcas
--policy-library=POLICY_LIBRARY_DIR
: Directorio que contiene una biblioteca de políticas.--project=PROJECT_ID
:gcloud beta terraform vet
acepta una marca--project
opcional. Esta marca especifica el proyecto predeterminado cuando se compila la ascendencia (desde la jerarquía de recursos de Google Cloud) para cualquier recurso que no tenga un proyecto explícito configurado.--format=FORMAT
: El valor predeterminado es yaml. Los formatos admitidos sondefault
,json
,none
,text
,yaml
. Para obtener más información, ejecuta $ gcloud topic formats.
Código de salida y resultado
- Si se validan todas las restricciones, el comando muestra el código de salida 0 y no muestra los incumplimientos.
- Si se encuentran infracciones,
gcloud beta terraform vet
muestra el código de salida 2 y una lista de infracciones. Por ejemplo, el resultado de JSON podría verse así:
[ { "constraint": "GCPIAMAllowedPolicyMemberDomainsConstraintV2.service_accounts_only", "constraint_config": { "api_version": "constraints.gatekeeper.sh/v1alpha1", "kind": "GCPIAMAllowedPolicyMemberDomainsConstraintV2", "metadata": { "annotations": { "description": "Checks that members that have been granted IAM roles belong to allowlisted domains.", "validation.gcp.forsetisecurity.org/originalName": "service_accounts_only", "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/iam_service_accounts_only.yaml" }, "name": "service-accounts-only" }, "spec": { "match": { "target": [ "organizations/**" ] }, "parameters": { "domains": [ "gserviceaccount.com" ] }, "severity": "high" } }, "message": "IAM policy for //cloudresourcemanager.googleapis.com/projects/PROJECT_ID contains member from unexpected domain: user:me@example.com", "metadata": { "ancestry_path": "organizations/ORG_ID/projects/PROJECT_ID", "constraint": { "annotations": { "description": "Checks that members that have been granted IAM roles belong to allowlisted domains.", "validation.gcp.forsetisecurity.org/originalName": "service_accounts_only", "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/iam_service_accounts_only.yaml" }, "labels": {}, "parameters": { "domains": [ "gserviceaccount.com" ] } }, "details": { "member": "user:me@example.com", "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID" } }, "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID", "severity": "high" } ]
Ejemplo de CI/CD
Una secuencia de comandos de Bash para usar gcloud beta terraform vet
en una canalización de CI/CD podría verse así:
terraform plan -out=tfplan.tfplan terraform show -json ./tfplan.tfplan > ./tfplan.json git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR VIOLATIONS=$(gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR --format=json) retVal=$? if [ $retVal -eq 2 ]; then # Optional: parse the VIOLATIONS variable as json and check the severity level echo "$VIOLATIONS" echo "Violations found; not proceeding with terraform apply" exit 1 fi if [ $retVal -ne 0]; then echo "Error during gcloud beta terraform vet; not proceeding with terraform apply" exit 1 fi echo "No policy violations detected; proceeding with terraform apply" terraform apply
Los desarrolladores también pueden usar gcloud beta terraform vet
de forma local para probar los cambios de Terraform antes de ejecutar tu canalización de CI/CD.