Search code examples
google-cloud-platformterraform-provider-gcpgoogle-iam

Can't use GCP IAM API with a service account


I am trying to create a new service account with terraform code. This code works well when I run it on behalf of my user credentials (the project Owner). But I see an error when I run the code on behalf of terraform service account

module "service_accounts" {
  source        = "terraform-google-modules/service-accounts/google"
  version       = "~> 4.1"
  project_id    = var.project
  prefix        = var.env
  names         = ["dataproc-sa"]
  project_roles = [
    "${var.project}=>roles/cloudkms.cryptoKeyEncrypterDecrypter",
    "${var.project}=>roles/storage.objectViewer",
    "${var.project}=>roles/dataproc.worker",
  ]
}

The terraform-google-modules/service-accounts/google module documentation says

Service account or user credentials with the following roles must be used to provision the resources of this module:

* Service Account Admin: roles/iam.serviceAccountAdmin
* (optional) Service Account Key Admin: roles/iam.serviceAccountKeyAdmin when generate_keys is set to true
* (optional) roles needed to grant optional IAM roles at the project or organizational level

I've bound roles/iam.serviceAccountAdmin to the [email protected] service account, despite this I see the next error

Error: Error creating service account: googleapi: Error 403: 
Identity and Access Management (IAM) API has not been used in project xxxxxxxxx 
before or it is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=xxxxxxxxx 
then retry. If you enabled this API recently, wait a few minutes for 
the action to propagate to our systems and retry.

It looks like the terraform service account doesn't have the appropriate permissions to create a new service account

What should I do to allow the service account create another one? What kind of permissions are missed? The code works well if I run it with the project Owner role (but I don't want to do this)

EDIT: Forgot to mention that I tried to bind roles/iam.admin to the terraform service account but it gave me the next error

ERROR: Policy modification failed. For a binding with condition, 
run "gcloud alpha iam policies lint-condition" to identify 
issues in condition.
ERROR: (gcloud.projects.add-iam-policy-binding) 
INVALID_ARGUMENT: Role roles/iam.admin is not supported for this resource.

Solution

  • The problem is the IAM service is not enabled. To enable that service you need the IAM role Service Usage Admin aka roles/serviceusage.serviceUsageAdmin. The Owner and Editor roles also have the permission serviceusage.services.enable.

    You can enable the service using the CLI:

    gcloud services enable iam.googleapis.com
    

    Or add this to your Terraform HCL to enable the IAM service.

    resource "google_project_service" "iam_service" {
      project = var.project
      service = "iam.googleapis.com"
    }
    

    You should also add a depends_on to resources that depend on the service being enabled:

      depends_on = [
        google_project_service.iam_service
      ]