terraform-google-modules/terraform-google-gcloud

I get local provisioner error when I try to set composer permissions using gloud on terraform

adithyaGR opened this issue · 1 comments

TL;DR

We are using terraform automation and deploying the code through pipeline. The pipeline is hosted in a project called prj-netw-prod-npda-common-01 and the project where we are trying to deploy the code is prj-netw-npe-npda-airflow-01.

The service account of the pipeline is named sa-datapltf-cicd-dev@prj-netw-prod-npda-common-01.iam.gserviceaccount.com, the SA has owner permission in prj-netw-npe-npda-airflow-01. But the pipeline is throwing an error when trying to execute the code in the pipeline.
Basically we are trying to do the following., but with "using terrafrom"

"gcloud composer environments run afl-datapltf-npe-nane1-cluster-01 --location northamerica-northeast1 users add-role -- -e sa-datapltf-cicd-dev@prj-netw-prod-npda-common-01.iam.gserviceaccount.com -r Admin --project prj-netw-npe-npda-airflow-01"

how do we fix this issue

Expected behavior

Set the permissions without an error

Observed behavior

Error: local-exec provisioner error

│ with module.composer_ui_permissions["sa-datapltf-cicd-dev@prj-netw-prod-npda-common-01.iam.gserviceaccount.com"].null_resource.run_command[0],
│ on .terraform/modules/composer_ui_permissions/main.tf line 231, in resource "null_resource" "run_command":
│ 231: provisioner "local-exec" {

│ Error running command 'PATH=/google-cloud-sdk/bin:$PATH
│ gcloud composer environments run afl-datapltf-npe-nane1-cluster-01
│ --location northamerica-northeast1 --project prj-netw-npe-npda-airflow-01
│ users add-role -- -e
sa-datapltf-cicd-dev@prj-netw-prod-npda-common-01.iam.gserviceaccount.com
│ -r Admin
│ ': exit status 1. Output: CRITICAL: ACTION REQUIRED:
│ gke-gcloud-auth-plugin, which is needed for continued use of kubectl, was
│ not found or is not executable. Install gke-gcloud-auth-plugin for use with
│ kubectl by following
https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
│ kubeconfig entry generated for northamerica-northeast1-afl-98925f4f-gke.
│ W0112 14:57:24.418929 406 gcp.go:119] WARNING: the gcp auth plugin is
│ deprecated in v1.22+, unavailable in v1.26+; use gcloud instead.
│ To learn more, consult
https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
│ W0112 14:57:26.355941 435 gcp.go:119] WARNING: the gcp auth plugin is
│ deprecated in v1.22+, unavailable in v1.26+; use gcloud instead.
│ To learn more, consult
https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
│ Executing within the following Kubernetes cluster namespace:
│ composer-2-1-2-airflow-2-3-4-98925f4f
│ W0112 14:57:26.509027 445 gcp.go:119] WARNING: the gcp auth plugin is
│ deprecated in v1.22+, unavailable in v1.26+; use gcloud instead.
│ To learn more, consult
https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
│ Unable to use a TTY - input is not a terminal or the right kind of file
│ /opt/python3.8/lib/python3.8/site-packages/airflow/www/app.py:147
│ DeprecationWarning: 'app.json_encoder' is deprecated and will be removed in
│ Flask 2.3. Customize 'app.json_provider_class' or 'app.json' instead.
│ User
│ "sa-datapltf-cicd-dev@prj-netw-prod-npda-common-01.iam.gserviceaccount.com"
│ does not exist
│ command terminated with exit code 1
│ ERROR: (gcloud.composer.environments.run) kubectl returned non-zero status
│ code. Make sure you have followed
https://cloud.google.com/composer/docs/how-to/accessing/airflow-cli#private-ip
│ to enable access to your private Cloud Composer environment from your
│ machine.
│ [2023-01-12T14:57:48.643+0000] {providers_manager.py:215} INFO - Optional
│ provider feature disabled when importing
│ 'airflow.providers.google.leveldb.hooks.leveldb.LevelDBHook' from
│ 'apache-airflow-providers-google' package
│ [2023-01-12T14:57:49.344+0000] {providers_manager.py:215} INFO - Optional
│ provider feature disabled when importing
│ 'airflow.providers.google.leveldb.hooks.leveldb.LevelDBHook' from
│ 'apache-airflow-providers-google' package

Terraform Configuration

module "composer_ui_permissions" {
    for_each = { for k  in var.users : k.user => k }

    source = "terraform-google-modules/gcloud/google"
    version          = "~> 3.1"
    platform         = "linux"
    create_cmd_entrypoint  = "gcloud"
    create_cmd_body        = "composer environments run ${each.value.composer_name} --location northamerica-northeast1 users add-role -- -e ${each.value.user} -r ${each.value.role} --project ${var.airflow_project}"
}

#Input vars.tf(separate file) looks like this

  users=[
    {
       user =  "sa-datapltf-cicd-dev@prj-netw-prod-npda-common-01.iam.gserviceaccount.com"
       role = "Admin"
       composer_name = "afl-datapltf-npe-nane1-cluster-01"
    } 
  ],
  
  airflow_project = prj-netw-npe-npda-airflow-01

Terraform Version

terraform {
  required_version = "~> 1.2.0"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 4.32.0"
    }
    google-beta = {
      source  = "hashicorp/google-beta"
      version = "~> 4.32.0"
    }
    null = {
      source  = "hashicorp/null"
      version = "~> 3.1.1"
    }
  }
}

Additional information

No response

the user name should be part of composer users list, if its not there then it would throw the errors of user not found