terraform-modules/apis-batch-enable/tf-batch-enable-apis.tf (225 lines of code) (raw):

#################################################################################### # Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #################################################################################### #################################################################################### # Enables the APIs used by the resources # Using the Batch Enable (up to 20 at time is the Most Efficient way to do this) # See: https://cloud.google.com/service-usage/docs/reference/rest/v1/services/batchEnable # This also helps avoid the "API not activated issue" # # Author: Adam Paternostro #################################################################################### terraform { required_providers { google = { source = "hashicorp/google-beta" version = "5.35.0" } } } #################################################################################### # Variables #################################################################################### variable "project_id" {} variable "project_number" {} #################################################################################### # API Services - Using Curl to manaully enable APIs in 20 sizes batches #################################################################################### # NOTE: This is fast, takes about 1-2 seconds per curl call. But this is not Terraform native; therefore, see the next section (takes ~1 minute). /******************************************************************************************* # Do first 20 services (20 is the limit) resource "null_resource" "batch_enable_service_apis_01" { provisioner "local-exec" { interpreter = ["/bin/bash","-c"] command = <<EOF if [ -z "$${GOOGLE_APPLICATION_CREDENTIALS}" ] then echo "We are not running in a local docker container. No need to login." else echo "We are running in local docker container. Logging in." gcloud auth activate-service-account "${var.deployment_service_account_name}" --key-file="$${GOOGLE_APPLICATION_CREDENTIALS}" --project="${var.project_id}" gcloud config set account "${var.deployment_service_account_name}" fi json='{ "serviceIds": [ "serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","servicemanagement.googleapis.com","orgpolicy.googleapis.com","compute.googleapis.com","bigquerystorage.googleapis.com","bigquerydatatransfer.googleapis.com","bigqueryreservation.googleapis.com","bigqueryconnection.googleapis.com","composer.googleapis.com","dataproc.googleapis.com","datacatalog.googleapis.com","aiplatform.googleapis.com","notebooks.googleapis.com","spanner.googleapis.com","dataflow.googleapis.com","analyticshub.googleapis.com","cloudkms.googleapis.com","metastore.googleapis.com","dataplex.googleapis.com" ] }' response=$(curl -X POST "https://serviceusage.googleapis.com/v1/projects/${var.project_number}/services:batchEnable" \ --header "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ --header "Content-Type: application/json" \ --data "$${json}" \ --compressed) echo "Response: $${response}" # EXAMPLE: successTest: operations/acat.p2-494222074122-7ec9a3dd-b9fc-4748-8d43-99366bf9bfaf successTest=$(echo $${response} | jq .name --raw-output) echo "successTest: $${successTest}" if [[ $${successTest} == operations* ]] then echo "Successfully activated services" exit 0 else echo "FAILED to activated services" exit 1 fi EOF } } # Do second 20 services resource "null_resource" "batch_enable_service_apis_02" { provisioner "local-exec" { interpreter = ["/bin/bash","-c"] command = <<EOF if [ -z "$${GOOGLE_APPLICATION_CREDENTIALS}" ] then echo "We are not running in a local docker container. No need to login." else echo "We are running in local docker container. Logging in." gcloud auth activate-service-account "${var.deployment_service_account_name}" --key-file="$${GOOGLE_APPLICATION_CREDENTIALS}" --project="${var.project_id}" gcloud config set account "${var.deployment_service_account_name}" fi json='{ "serviceIds": [ "bigquerydatapolicy.googleapis.com" ] }' response=$(curl -X POST "https://serviceusage.googleapis.com/v1/projects/${var.project_number}/services:batchEnable" \ --header "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ --header "Content-Type: application/json" \ --data "$${json}" \ --compressed) echo "Response: $${response}" # EXAMPLE: successTest: operations/acat.p2-494222074122-7ec9a3dd-b9fc-4748-8d43-99366bf9bfaf successTest=$(echo $${response} | jq .name --raw-output) echo "successTest: $${successTest}" if [[ $${successTest} == operations* ]] then echo "Successfully activated services" exit 0 else echo "FAILED to activated services" exit 1 fi EOF } depends_on = [null_resource.batch_enable_service_apis_01] } *******************************************************************************************/ #################################################################################### # API Services (let Google provide do batching for you) #################################################################################### # NOTE: These services will be enabled via Batches since batching is turned on by default for the Google provider # Batching will also help the cache hit/eviction which means you will less likely get an error that a specific # service has not been activated (when used later on by terraform). # # You can review the terraform log file and search for: Creating new batch "Enable Project Service" # # You will see the following: # [DEBUG] Creating new batch "Enable Project Service \"cloudkms.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" from request "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"orgpolicy.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"orgpolicy.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"bigquerystorage.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"bigquerystorage.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com bigquerystorage.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"notebooks.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"notebooks.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com bigquerystorage.googleapis.com notebooks.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"dataflow.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"dataflow.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com bigquerystorage.googleapis.com notebooks.googleapis.com dataflow.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"bigqueryconnection.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"bigqueryconnection.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com bigquerystorage.googleapis.com notebooks.googleapis.com dataflow.googleapis.com bigqueryconnection.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"dataplex.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"dataplex.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com bigquerystorage.googleapis.com notebooks.googleapis.com dataflow.googleapis.com bigqueryconnection.googleapis.com dataplex.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"bigquerydatatransfer.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"bigquerydatatransfer.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com bigquerystorage.googleapis.com notebooks.googleapis.com dataflow.googleapis.com bigqueryconnection.googleapis.com dataplex.googleapis.com bigquerydatatransfer.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"dataproc.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"dataproc.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com bigquerystorage.googleapis.com notebooks.googleapis.com dataflow.googleapis.com bigqueryconnection.googleapis.com dataplex.googleapis.com bigquerydatatransfer.googleapis.com dataproc.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Adding batch request "Enable Project Service \"analyticshub.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to existing batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable": timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Added batch request "Enable Project Service \"analyticshub.googleapis.com\" for project \"data-analytics-demo-7rlf2vua2t\"" to batch. New batch body: [cloudkms.googleapis.com orgpolicy.googleapis.com bigquerystorage.googleapis.com notebooks.googleapis.com dataflow.googleapis.com bigqueryconnection.googleapis.com dataplex.googleapis.com bigquerydatatransfer.googleapis.com dataproc.googleapis.com analyticshub.googleapis.com]: timestamp=2022-09-07T15:09:29.901-0400 # [DEBUG] Sending batch "project/data-analytics-demo-7rlf2vua2t/services:batchEnable" combining 10 requests): timestamp=2022-09-07T15:09:32.901-0400 resource "google_project_service" "service-serviceusage" { project = var.project_id service = "serviceusage.googleapis.com" } resource "google_project_service" "service-cloudresourcemanager" { project = var.project_id service = "cloudresourcemanager.googleapis.com" } resource "google_project_service" "service-servicemanagement" { project = var.project_id service = "servicemanagement.googleapis.com" } resource "google_project_service" "service-orgpolicy" { project = var.project_id service = "orgpolicy.googleapis.com" } resource "google_project_service" "service-compute" { project = var.project_id service = "compute.googleapis.com" } resource "google_project_service" "service-bigquerystorage" { project = var.project_id service = "bigquerystorage.googleapis.com" } resource "google_project_service" "service-bigquerydatatransfer" { project = var.project_id service = "bigquerydatatransfer.googleapis.com" } resource "google_project_service" "service-bigqueryreservation" { project = var.project_id service = "bigqueryreservation.googleapis.com" } resource "google_project_service" "service-bigqueryconnection" { project = var.project_id service = "bigqueryconnection.googleapis.com" } resource "google_project_service" "service-composer" { project = var.project_id service = "composer.googleapis.com" } resource "google_project_service" "service-dataproc" { project = var.project_id service = "dataproc.googleapis.com" } resource "google_project_service" "service-datacatalog" { project = var.project_id service = "datacatalog.googleapis.com" } resource "google_project_service" "service-aiplatform" { project = var.project_id service = "aiplatform.googleapis.com" } resource "google_project_service" "service-notebooks" { project = var.project_id service = "notebooks.googleapis.com" } resource "google_project_service" "service-spanner" { project = var.project_id service = "spanner.googleapis.com" } resource "google_project_service" "service-dataflow" { project = var.project_id service = "dataflow.googleapis.com" } resource "google_project_service" "service-analyticshub" { project = var.project_id service = "analyticshub.googleapis.com" } resource "google_project_service" "service-cloudkms" { project = var.project_id service = "cloudkms.googleapis.com" } resource "google_project_service" "service-metastore" { project = var.project_id service = "metastore.googleapis.com" } resource "google_project_service" "service-dataplex" { project = var.project_id service = "dataplex.googleapis.com" } resource "google_project_service" "service-bigquerydatapolicy" { project = var.project_id service = "bigquerydatapolicy.googleapis.com" } resource "google_project_service" "service-cloudfunctions" { project = var.project_id service = "cloudfunctions.googleapis.com" } resource "google_project_service" "service-vision" { project = var.project_id service = "vision.googleapis.com" } resource "google_project_service" "service-datafusion" { project = var.project_id service = "datafusion.googleapis.com" } resource "google_project_service" "service-dataform" { project = var.project_id service = "dataform.googleapis.com" } resource "google_project_service" "service-secretmanager" { project = var.project_id service = "secretmanager.googleapis.com" } resource "google_project_service" "service-cloudrun" { project = var.project_id service = "run.googleapis.com" } resource "google_project_service" "service-biglake" { project = var.project_id service = "biglake.googleapis.com" } resource "google_project_service" "service-datalineage" { project = var.project_id service = "datalineage.googleapis.com" } resource "google_project_service" "service-datastream" { project = var.project_id service = "datastream.googleapis.com" } resource "google_project_service" "service-pubsub" { project = var.project_id service = "pubsub.googleapis.com" } resource "google_project_service" "service-servicenetworking" { project = var.project_id service = "servicenetworking.googleapis.com" } # For Cloud Run Deploy resource "google_project_service" "service-cloudbuild" { project = var.project_id service = "cloudbuild.googleapis.com" } resource "google_project_service" "service-clouddeploy" { project = var.project_id service = "clouddeploy.googleapis.com" } resource "google_project_service" "service-artifactregistry" { project = var.project_id service = "artifactregistry.googleapis.com" } resource "google_project_service" "service-speech" { project = var.project_id service = "speech.googleapis.com" } resource "google_project_service" "service-workflows" { project = var.project_id service = "workflows.googleapis.com" }