Can I automatically enable APIs when using GCP cloud with terraform?
There is a Terraform resource definition called "google_project_service" that allows one to enable a service (API). This is documented at google_project_service.
An example of usage appears to be:
resource "google_project_service" "project" {
project = "your-project-id"
service = "iam.googleapis.com"
}
instead of using count
as suggested by @pradeep you may also loop over the services in question:
variable "gcp_service_list" {
description ="The list of apis necessary for the project"
type = list(string)
default = [
"cloudresourcemanager.googleapis.com",
"serviceusage.googleapis.com"
]
}
resource "google_project_service" "gcp_services" {
for_each = toset(var.gcp_service_list)
project = "your-project-id"
service = each.key
}
Yes , you can use google_project_service
resource to enable one API at a time. You can use count
or other loop methods to enable multiple APIs. You would need project editor/owner role to do this.
# Enable services in newly created GCP Project.
resource "google_project_service" "gcp_services" {
count = length(var.gcp_service_list)
project = google_project.demo_project.project_id
service = var.gcp_service_list[count.index]
disable_dependent_services = true
}
You can find the complete example here.
For those reading this in 2022, enabling serviceusage
and cloudresourcesmanager
automatically from Terraform doesn't work as enabling those APIs through the API has a dependency on them being already enabled...
The solution is to do it through the gcloud command line:
# Use `gcloud` to enable:
# - serviceusage.googleapis.com
# - cloudresourcemanager.googleapis.com
resource "null_resource" "enable_service_usage_api" {
provisioner "local-exec" {
command = "gcloud services enable serviceusage.googleapis.com cloudresourcemanager.googleapis.com --project ${var.project_id}"
}
depends_on = [google_project.project]
}
# Wait for the new configuration to propagate
# (might be redundant)
resource "time_sleep" "wait_project_init" {
create_duration = "60s"
depends_on = [null_resource.enable_service_usage_api]
}
More details on https://medium.com/rockedscience/how-to-fully-automate-the-deployment-of-google-cloud-platform-projects-with-terraform-16c33f1fb31f