| --- |
| page_title: "Terraform Google Provider 3.0.0 Upgrade Guide" |
| description: |- |
| Terraform Google Provider 3.0.0 Upgrade Guide |
| --- |
| |
| # Terraform Google Provider 3.0.0 Upgrade Guide |
| |
| The `3.0.0` release of the Google provider for Terraform is a major version and |
| includes some changes that you will need to consider when upgrading. This guide |
| is intended to help with that process and focuses only on the changes necessary |
| to upgrade from the final `2.X` series release to `3.0.0`. |
| |
| Most of the changes outlined in this guide have been previously marked as |
| deprecated in the Terraform `plan`/`apply` output throughout previous provider |
| releases, up to and including the final `2.X` series release. These changes, |
| such as deprecation notices, can always be found in the CHANGELOG of the |
| affected providers. [google](https://github.com/hashicorp/terraform-provider-google/blob/main/CHANGELOG.md) |
| [google-beta](https://github.com/hashicorp/terraform-provider-google-beta/blob/main/CHANGELOG.md) |
| |
| ## What is `3.0.0-beta.1`? |
| |
| With `3.0.0`, we introduced a prerelease window for our major provider releases. |
| `3.0.0-beta.1` contains all of the changes in `3.0.0`, and allows you to test it |
| prior to the full upgrade. Currently `3.0.0` is not expected to contain new |
| features not available in `3.0.0-beta.1`, only bugfixes for issues we're made |
| aware of before `3.0.0`'s release. Using `3.0.0-beta.1` in production is not |
| recommended. |
| |
| ```hcl |
| provider "google" { |
| # ... other configuration ... |
| |
| version = "~> 3.0.0-beta.1" |
| } |
| ``` |
| |
| ## I accidentally upgraded to 3.0.0, how do I downgrade to `2.X`? |
| |
| If you've inadvertently upgraded to `3.0.0`, first see the |
| [Provider Version Configuration Guide](#provider-version-configuration) to lock |
| your provider version; if you've constrained the provider to a lower version |
| such as shown in the previous version example in that guide, Terraform will pull |
| in a `2.X` series release on `terraform init`. |
| |
| If you've only ran `terraform init` or `terraform plan`, your state will not |
| have been modified and downgrading your provider is sufficient. |
| |
| If you've ran `terraform refresh` or `terraform apply`, Terraform may have made |
| state changes in the meantime. |
| |
| * If you're using a local state, or a remote state backend that does not support |
| versioning, `terraform refresh` with a downgraded provider is likely sufficient |
| to revert your state. The Google provider generally refreshes most state |
| information from the API, and the properties necessary to do so have been left |
| unchanged. |
| |
| * If you're using a remote state backend that supports versioning such as |
| [Google Cloud Storage](https://www.terraform.io/docs/backends/types/gcs.html), |
| you can revert the Terraform state file to a previous version. If you do |
| so and Terraform had created resources as part of a `terraform apply` in the |
| meantime, you'll need to either delete them by hand or `terraform import` them |
| so Terraform knows to manage them. |
| |
| ## Upgrade Topics |
| |
| <!-- TOC depthFrom:2 depthTo:2 --> |
| |
| - [Provider Version Configuration](#provider-version-configuration) |
| - [Provider](#provider) |
| - [ID Format Changes](#id-format-changes) |
| - [Data Source: `google_container_engine_versions`](#data-source-google_container_engine_versions) |
| - [Resource: `google_access_context_manager_access_level`](#resource-google_access_context_manager_access_level) |
| - [Resource: `google_access_context_manager_service_perimeter`](#resource-google_access_context_manager_service_perimeter) |
| - [Resource: `google_app_engine_application`](#resource-google_app_engine_application) |
| - [Resource: `google_app_engine_domain_mapping`](#resource-google_app_engine_domain_mapping) |
| - [Resource: `google_app_engine_standard_app_version`](#resource-google_app_engine_standard_app_version) |
| - [Resource: `google_bigquery_table`](#resource-google_bigquery_table) |
| - [Resource: `google_bigtable_app_profile`](#resource-google_bigtable_app_profile) |
| - [Resource: `google_binary_authorization_policy`](#resource-google_binary_authorization_policy) |
| - [Resource: `google_cloudbuild_trigger`](#resource-google_cloudbuild_trigger) |
| - [Resource: `google_cloudfunctions_function`](#resource-google_cloudfunctions_function) |
| - [Resource: `google_cloudiot_registry`](#resource-google_cloudiot_registry) |
| - [Resource: `google_cloudscheduler_job`](#resource-google_cloudscheduler_job) |
| - [Resource: `google_cloud_run_service`](#resource-google_cloud_run_service) |
| - [Resource: `google_composer_environment`](#resource-google_composer_environment) |
| - [Resource: `google_compute_backend_bucket`](#resource-google_compute_backend_bucket) |
| - [Resource: `google_compute_backend_service`](#resource-google_compute_backend_service) |
| - [Resource: `google_compute_firewall`](#resource-google_compute_firewall) |
| - [Resource: `google_compute_forwarding_rule`](#resource-google_compute_forwarding_rule) |
| - [Resource: `google_compute_global_forwarding_rule`](#resource-google_compute_global_forwarding_rule) |
| - [Resource: `google_compute_health_check`](#resource-google_compute_health_check) |
| - [Resource: `google_compute_image`](#resource-google_compute_image) |
| - [Resource: `google_compute_instance`](#resource-google_compute_instance) |
| - [Resource: `google_compute_instance_group_manager`](#resource-google_compute_instance_group_manager) |
| - [Resource: `google_compute_instance_template`](#resource-google_compute_instance_template) |
| - [Resource: `google_compute_network`](#resource-google_compute_network) |
| - [Resource: `google_compute_network_peering`](#resource-google_compute_network_peering) |
| - [Resource: `google_compute_node_template`](#resource-google_compute_node_template) |
| - [Resource: `google_compute_region_backend_service`](#resource-google_compute_region_backend_service) |
| - [Resource: `google_compute_region_health_check`](#resource-google_compute_region_health_check) |
| - [Resource: `google_compute_region_instance_group_manager`](#resource-google_compute_instance_group_manager) |
| - [Resource: `google_compute_resource_policy`](#resource-google_compute_resource_policy) |
| - [Resource: `google_compute_route`](#resource-google_compute_route) |
| - [Resource: `google_compute_router`](#resource-google_compute_router) |
| - [Resource: `google_compute_router_peer`](#resource-google_compute_router_peer) |
| - [Resource: `google_compute_snapshot`](#resource-google_compute_snapshot) |
| - [Resource: `google_compute_subnetwork`](#resource-google_compute_subnetwork) |
| - [Resource: `google_container_cluster`](#resource-google_container_cluster) |
| - [Resource: `google_container_node_pool`](#resource-google_container_node_pool) |
| - [Resource: `google_dataproc_autoscaling_policy`](#resource-google_dataproc_autoscaling_policy) |
| - [Resource: `google_dataproc_cluster`](#resource-google_dataproc_cluster) |
| - [Resource: `google_dataproc_job`](#resource-google_dataproc_job) |
| - [Resource: `google_dns_managed_zone`](#resource-google_dns_managed_zone) |
| - [Resource: `google_dns_policy`](#resource-google_dns_policy) |
| - [Resource: `google_folder_organization_policy`](#resource-google_folder_organization_policy) |
| - [Resource: `google_healthcare_hl7_v2_store`](#resource-google_healthcare_hl7_v2_store) |
| - [Resource: `google_logging_metric`](#resource-google_logging_metric) |
| - [Resource: `google_mlengine_model`](#resource-google_mlengine_model) |
| - [Resource: `google_monitoring_alert_policy`](#resource-google_monitoring_alert_policy) |
| - [Resource: `google_monitoring_uptime_check_config`](#resource-google_monitoring_uptime_check_config) |
| - [Resource: `google_organization_policy`](#resource-google_organization_policy) |
| - [Resource: `google_project_iam_audit_config`](#resource-google_project_iam_audit_config) |
| - [Resource: `google_project_organization_policy`](#resource-google_project_organization_policy) |
| - [Resource: `google_project_service`](#resource-google_project_service) |
| - [Resource: `google_project_services`](#resource-google_project_services) |
| - [Resource: `google_pubsub_subscription`](#resource-google_pubsub_subscription) |
| - [Resource: `google_security_scanner_scan_config`](#resource-google_security_scanner_scan_config) |
| - [Resource: `google_service_account_key`](#resource-google_service_account_key) |
| - [Resource: `google_sql_database_instance`](#resource-google_sql_database_instance) |
| - [Resource: `google_storage_bucket`](#resource-google_storage_bucket) |
| - [Resource: `google_storage_transfer_job`](#resource-google_storage_transfer_job) |
| - [Resource: `google_tpu_node`](#resource-google_tpu_node) |
| |
| <!-- /TOC --> |
| |
| ## Provider Version Configuration |
| |
| -> Before upgrading to version 3.0.0, it is recommended to upgrade to the most |
| recent `2.X` series release of the provider, make the changes noted in this guide, |
| and ensure that your environment successfully runs |
| [`terraform plan`](https://www.terraform.io/docs/commands/plan.html) |
| without unexpected changes or deprecation notices. |
| |
| It is recommended to use [version constraints](https://www.terraform.io/docs/configuration/providers.html#provider-versions) |
| when configuring Terraform providers. If you are following that recommendation, |
| update the version constraints in your Terraform configuration and run |
| [`terraform init`](https://www.terraform.io/docs/commands/init.html) to download |
| the new version. |
| |
| If you aren't using version constraints, you can use `terraform init -upgrade` |
| in order to upgrade your provider to the latest released version. |
| |
| For example, given this previous configuration: |
| |
| ```hcl |
| provider "google" { |
| # ... other configuration ... |
| |
| version = "~> 2.17.0" |
| } |
| ``` |
| |
| An updated configuration: |
| |
| ```hcl |
| provider "google" { |
| # ... other configuration ... |
| |
| version = "~> 3.0.0" |
| } |
| ``` |
| |
| ## Provider |
| |
| ### Terraform 0.11 no longer supported |
| |
| Support for Terraform 0.11 has been deprecated, and Terraform 0.12 or higher is |
| required to `terraform init` the provider. See [the blog post](https://www.hashicorp.com/blog/deprecating-terraform-0-11-support-in-terraform-providers/) |
| for more information. It is recommended that you upgrade to Terraform 0.12 before |
| upgrading to version 3.0.0 of the provider. |
| |
| ### `userinfo.email` added to default scopes |
| |
| `userinfo.email` has been added to the default set of OAuth scopes in the |
| provider. This provides the Terraform user specified by `credentials`' (generally |
| a service account) email address to GCP APIs in addition to an obfuscated user |
| id; particularly, it makes the email of the Terraform user available for some |
| Kubernetes and IAP use cases. |
| |
| If this was previously defined explicitly, the definition can now be removed. |
| |
| #### Old Config |
| |
| ```hcl |
| provider "google" { |
| scopes = [ |
| "https://www.googleapis.com/auth/compute", |
| "https://www.googleapis.com/auth/cloud-platform", |
| "https://www.googleapis.com/auth/ndev.clouddns.readwrite", |
| "https://www.googleapis.com/auth/devstorage.full_control", |
| "https://www.googleapis.com/auth/userinfo.email", |
| ] |
| } |
| ``` |
| |
| #### New Config |
| |
| ```hcl |
| provider "google" {} |
| ``` |
| |
| ## ID Format Changes |
| |
| ID formats on many resources have changed. ID formats have standardized on being similar to the `self_link` of |
| a resource. Users who depended on particular ID formats in previous versions may be impacted. |
| |
| ## Data Source: `google_container_engine_versions` |
| |
| ### `region` and `zone` are now removed |
| |
| Use `location` instead. |
| |
| ## Resource: `google_access_context_manager_access_level` |
| |
| ### `os_type` is now required on block `google_access_context_manager_access_level.basic.conditions.device_policy.os_constraints` |
| |
| In an attempt to avoid allowing empty blocks in config files, `os_type` is now |
| required on the `basic.conditions.device_policy.os_constraints` block. |
| |
| ## Resource: `google_access_context_manager_service_perimeter` |
| |
| ### At least one of `resources`, `access_levels`, or `restricted_services` is now required on `google_accesscontextmanager_service_perimeter.status` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `resources`, `access_levels`, |
| or `restricted_services` is now required on the `status` block. |
| |
| ## Resource: `google_app_engine_application` |
| |
| ### `split_health_checks` is now required on block `google_app_engine_application.feature_settings` |
| |
| In an attempt to avoid allowing empty blocks in config files, `split_health_checks` is now |
| required on the `feature_settings` block. |
| |
| ## Resource: `google_app_engine_domain_mapping` |
| |
| ### `ssl_management_type` is now required on `google_app_engine_domain_mapping.ssl_settings` |
| |
| In an attempt to avoid allowing empty blocks in config files, `ssl_management_type` is now |
| required on the `ssl_settings` block. |
| |
| ## Resource: `google_app_engine_standard_app_version` |
| |
| ### At least one of `zip` or `files` is now required on `google_app_engine_standard_app_version.deployment` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `zip` or `files` |
| is now required on the `deployment` block. |
| |
| ### `shell` is now required on `google_app_engine_standard_app_version.entrypoint` |
| |
| In an attempt to avoid allowing empty blocks in config files, `shell` is now |
| required on the `entrypoint` block. |
| |
| ### `script_path` is now required on `google_app_engine_standard_app_version.handlers.script` |
| |
| In an attempt to avoid allowing empty blocks in config files, `script_path` is now |
| required on the `handlers.script` block. |
| |
| ### `source_url` is now required on `google_app_engine_standard_app_version.deployment.files` and `google_app_engine_standard_app_version.deployment.zip` |
| |
| In an attempt to avoid allowing empty blocks in config files, `shell` is now |
| required on the `deployment.files` and `deployment.zip` blocks. |
| |
| ## Resource: `google_bigquery_table` |
| |
| ### At least one of `range` or `skip_leading_rows` is now required on `external_data_configuration.google_sheets_options` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one |
| of `range` or `skip_leading_rows` is now required on the |
| `external_data_configuration.google_sheets_options` block. |
| |
| ## Resource: `google_bigtable_app_profile` |
| |
| ### Exactly one of `single_cluster_routing` or `multi_cluster_routing_use_any` is now required on `google_bigtable_app_profile` |
| |
| In attempt to be more consistent with the API, exactly one of `single_cluster_routing` or |
| `multi_cluster_routing_use_any` is now required on `google_bigtable_app_profile`. |
| |
| ### `cluster_id` is now required on `google_bigtable_app_profile.single_cluster_routing` |
| |
| In an attempt to avoid allowing empty blocks in config files, `cluster_id` is now |
| required on the `single_cluster_routing` block. |
| |
| ## Resource: `google_binary_authorization_policy` |
| |
| ### `name_pattern` is now required on `google_binary_authorization_policy.admission_whitelist_patterns` |
| |
| In an attempt to avoid allowing empty blocks in config files, `name_pattern` is now |
| required on the `admission_whitelist_patterns` block. |
| |
| ### `evaluation_mode` and `enforcement_mode` are now required on `google_binary_authorization_policy.cluster_admission_rules` |
| |
| In an attempt to avoid allowing empty blocks in config files, `evaluation_mode` and `enforcement_mode` are now |
| required on the `cluster_admission_rules` block. |
| |
| ## Resource: `google_cloudbuild_trigger` |
| |
| ### Exactly one of `filename` or `build` is now required on `google_cloudbuild_trigger` |
| |
| In attempt to be more consistent with the API, exactly one of `filename` or `build` is now |
| required on `google_cloudbuild_trigger`. |
| |
| ### Exactly one of `branch_name`, `tag_name` or `commit_sha` is now required on `google_cloudbuild_trigger.trigger_template` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one |
| of `branch_name`, `tag_name` or `commit_sha` is now required on the |
| `trigger_template` block. |
| |
| ### Exactly one of `pull_request` or `push` is now required on `google_cloudbuild_trigger.github` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one |
| of `pull_request` or `push` is now required on the `github` block. |
| |
| ### Exactly one of `branch` or `tag_name` is now required on `google_cloudbuild_trigger.github.push` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one |
| of `branch` or `tag_name` is now required on the `github.push` block. |
| |
| ### `steps` is now required on `google_cloudbuild_trigger.build`. |
| |
| In an attempt to avoid allowing empty blocks in config files, `steps` is now |
| required on the `build` block. |
| |
| ### `name` is now required on `google_cloudbuild_trigger.build.steps` |
| |
| In an attempt to avoid allowing empty blocks in config files, `name` is now |
| required on the `build.steps` block. |
| |
| ### `name` and `path` are now required on `google_cloudbuild_trigger.build.steps.volumes` |
| |
| In an attempt to avoid allowing empty blocks in config files, `name` and `path` are now |
| required on the `build.volumes` block. |
| |
| ## Resource: `google_cloudfunctions_function` |
| |
| ### The `runtime` option `nodejs6` has been deprecated |
| |
| `nodejs6` has been deprecated and is no longer the default value for `runtime`. |
| `runtime` is now required. |
| |
| ## Resource: `google_cloudiot_registry` |
| |
| ### Replace singular event notification config field with plural `event_notification_configs` |
| |
| Use the plural field `event_notification_configs` instead of |
| `event_notification_config`, which has now been removed. |
| Since the Cloud IoT API now accept multiple event notification configs for a |
| registry, the singular field no longer exists on the API resource and has been |
| removed from Terraform to prevent conflicts. |
| |
| |
| #### Old Config |
| |
| ```hcl |
| resource "google_cloudiot_registry" "myregistry" { |
| name = "%s" |
| |
| event_notification_config { |
| pubsub_topic_name = google_pubsub_topic.event-topic.id |
| } |
| } |
| |
| ``` |
| |
| #### New Config |
| |
| ```hcl |
| resource "google_cloudiot_registry" "myregistry" { |
| name = "%s" |
| |
| event_notification_configs { |
| pubsub_topic_name = google_pubsub_topic.event-topic.id |
| } |
| } |
| ``` |
| |
| ### `public_key_certificate` is now required on block `google_cloudiot_registry.credentials` |
| |
| In an attempt to avoid allowing empty blocks in config files, `public_key_certificate` is now |
| required on the `credentials` block. |
| |
| ## Resource: `google_cloud_run_service` |
| |
| Google Cloud Run Service is being released at v1 and there are breaking schema changes that have arisen from changing the underlying API. These breaking changes only affect the Beta version of the resource as it was not previously available in the GA provider. |
| |
| To support partial rollouts of different revisions, the `spec` block is now nested under `template` and a second `metadata` block has been added alongside `spec`. Now users can make a change and, using a named revision, they can control the rollout of that revision with a higher granularity. |
| |
| #### Old Config |
| |
| ```hcl |
| resource "google_cloud_run_service" "default" { |
| spec { |
| containers { |
| image = "gcr.io/cloudrun/hello" |
| args = ["arrg2", "pirate"] |
| } |
| container_concurrency = 10 |
| } |
| } |
| ``` |
| |
| #### New Config |
| |
| ```hcl |
| resource "google_cloud_run_service" "default" { |
| template { |
| spec { |
| containers { |
| image = "gcr.io/cloudrun/hello" |
| args = ["arrg2", "pirate"] |
| } |
| container_concurrency = 10 |
| } |
| |
| metadata { |
| annotations = { |
| "autoscaling.knative.dev/maxScale" = "1000" |
| "run.googleapis.com/client-name" = "terraform" |
| } |
| name = "revision-name" |
| } |
| } |
| } |
| ``` |
| |
| ## Resource: `google_cloudscheduler_job` |
| |
| ### Exactly one of `pubsub_target`, `http_target` or `app_engine_http_target` is required on `google_cloudscheduler_job` |
| |
| In attempt to be more consistent with the API, exactly one of `pubsub_target`, `http_target` |
| or `app_engine_http_target` is now required on `google_cloudscheduler_job`. |
| |
| ### `service_account_email` is now required on `google_cloudscheduler_job.http_target.oauth_token` and `google_cloudscheduler_job.http_target.oidc_token`. |
| |
| In an attempt to avoid allowing empty blocks in config files, `service_account_email` is now |
| required on the `http_target.oauth_token` and `http_target.oidc_token` blocks. |
| |
| ### At least one of `retry_count`, `max_retry_duration`, `min_backoff_duration`, `max_backoff_duration`, or `max_doublings` is now required on `google_cloud_scheduler_job.retry_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `retry_count`, |
| `max_retry_duration`, `min_backoff_duration`, `max_backoff_duration`, or `max_doublings` is |
| now required on the `retry_config` block. |
| |
| ### At least one of `service`, `version`, or `instance` is now required on `google_cloud_scheduler_job.app_engine_http_target.app_engine_routing` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `service`, |
| `version`, or `instance` is now required on the `app_engine_http_target.app_engine_routing` block. |
| |
| ## Resource: `google_composer_environment` |
| |
| ### At least one of `airflow_config_overrides`, `pypi_packages`, `env_variables`, `image_version`, `python_version` or `scheduler_count` is now required on `google_composer_environment.config.software_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `airflow_config_overrides`, |
| `pypi_packages`, `env_variables`, `image_version`, `python_version` or `scheduler_count` is now required on the |
| `config.software_config` block. |
| |
| ### `use_ip_aliases` is now required on block `google_composer_environment.ip_allocation_policy` |
| |
| Previously the default value of `use_ip_aliases` was `true`. In an attempt to avoid allowing empty blocks |
| in config files, `use_ip_aliases` is now required on the `ip_allocation_policy` block. |
| |
| ### At least one of `enable_private_endpoint` or `master_ipv4_cidr_block` is now required on `google_composer_environment.config.private_environment_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `enable_private_endpoint` or `master_ipv4_cidr_block` is now required on the |
| `config.private_environment_config` block. |
| |
| ### At least one of `node_count`, `node_config`, `software_config` or `private_environment_config` required on `google_composer_environment.config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `node_count`, `node_config`, `software_config` or `private_environment_config` is now required on the `config` block. |
| |
| ## Resource: `google_compute_backend_bucket` |
| |
| ### `signed_url_cache_max_age_sec` is now required on `google_compute_backend_bucket.autoscaling_policy.cdn_policy` |
| |
| Previously the default value of `signed_url_cache_max_age_sec` was `3600`. In an attempt to avoid allowing empty |
| blocks in config files, `signed_url_cache_max_age_sec` is now required on the |
| `autoscaling_policy.cdn_policy` block. |
| |
| ## Resource: `google_compute_backend_service` |
| |
| ### At least one of `connect_timeout`, `max_requests_per_connection`, `max_connections`, `max_pending_requests`, `max_requests`, or `max_retries` is now required on `google_compute_backend_service.circuit_breakers` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `connect_timeout`, |
| `max_requests_per_connection`, `max_connections`, `max_pending_requests`, `max_requests`, |
| or `max_retries` is now required on the `circuit_breakers` block. |
| |
| ### At least one of `ttl`, `name`, or `path` is now required on `google_compute_backend_service.consistent_hash.http_cookie` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `ttl`, `name`, or `path` |
| is now required on the `consistent_hash.http_cookie` block. |
| |
| ### At least one of `http_cookie`, `http_header_name`, or `minimum_ring_size` is now required on `google_compute_backend_service.consistent_hash` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `http_cookie`, |
| `http_header_name`, or `minimum_ring_size` is now required on the `consistent_hash` block. |
| |
| ### At least one of `cache_key_policy` or `signed_url_cache_max_age_sec` is now required on `google_compute_backend_service.cdn_policy` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `cache_key_policy` or |
| `signed_url_cache_max_age_sec` is now required on the `cdn_policy` block. |
| |
| ### At least one of `include_host`, `include_protocol`, `include_query_string`, `query_string_blacklist`, or `query_string_whitelist` is now required on `google_compute_backend_service.cdn_policy.cache_key_policy` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `include_host`, |
| `include_protocol`, `include_query_string`, `query_string_blacklist`, or `query_string_whitelist` |
| is now required on the `cdn_policy.cache_key_policy` block. |
| |
| ### At least one of `base_ejection_time`, `consecutive_errors`, `consecutive_gateway_failure`, `enforcing_consecutive_errors`, `enforcing_consecutive_gateway_failure`, `enforcing_success_rate`, `interval`, `max_ejection_percent`, `success_rate_minimum_hosts`, `success_rate_request_volume`, or `success_rate_stdev_factor` is now required on `google_compute_backend_service.outlier_detection` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `base_ejection_time`, |
| `consecutive_errors`, `consecutive_gateway_failure`, `enforcing_consecutive_errors`, |
| `enforcing_consecutive_gateway_failure`, `enforcing_success_rate`, `interval`, `max_ejection_percent`, |
| `success_rate_minimum_hosts`, `success_rate_request_volume`, or `success_rate_stdev_factor` |
| is now required on the `outlier_detection` block. |
| |
| ### At least one of `enable` or `sample_rate` is now required on `google_compute_backend_service.log_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `enable` or `sample_rate` |
| is now required on the `log_config` block. |
| |
| ## Resource: `google_compute_firewall` |
| |
| ### Exactly one of `allow` or `deny` is required on `google_compute_firewall` |
| |
| In attempt to be more consistent with the API, exactly one of `allowed` or `denied` |
| is now required on `google_compute_firewall`. |
| |
| ## Resource: `google_compute_forwarding_rule` |
| |
| ### `ip_version` is now removed |
| |
| `ip_version` is not used for regional forwarding rules. |
| |
| ### `ip_address` is now strictly validated to enforce literal IP address format |
| |
| Previously documentation suggested Terraform could use the same range of valid |
| IP Address formats for `ip_address` as accepted by the API (e.g. named addresses |
| or URLs to GCP Address resources). However, the server returns only literal IP |
| addresses and thus caused diffs on re-apply (i.e. a permadiff). We amended |
| documentation to say Terraform only accepts literal IP addresses. |
| |
| This is now strictly validated. While this shouldn't have a large breaking |
| impact as users would have already run into permadiff issues on re-apply, |
| there might be validation errors for existing configs. The solution is be to |
| replace other address formats with the IP address, either manually or by |
| interpolating values from a `google_compute_address` resource. |
| |
| #### Old Config (that would have permadiff) |
| |
| ```hcl |
| resource "google_compute_address" "my-addr" { |
| name = "my-addr" |
| } |
| |
| resource "google_compute_forwarding_rule" "frule" { |
| name = "my-forwarding-rule" |
| |
| address = google_compute_address.my-addr.self_link |
| } |
| ``` |
| |
| #### New Config |
| |
| ```hcl |
| resource "google_compute_address" "my-addr" { |
| name = "my-addr" |
| } |
| |
| resource "google_compute_forwarding_rule" "frule" { |
| name = "my-forwarding-rule" |
| |
| address = google_compute_address.my-addr.address |
| } |
| ``` |
| |
| ## Resource: `google_compute_global_forwarding_rule` |
| |
| ### `ip_address` is now validated to enforce literal IP address format |
| |
| See [`google_compute_forwarding_rule`](#resource-google_compute_forwarding_rule). |
| |
| ## Resource: `google_compute_health_check` |
| |
| ### Exactly one of `http_health_check`, `https_health_check`, `http2_health_check`, `tcp_health_check` or `ssl_health_check` is required on `google_compute_health_check` |
| |
| In attempt to be more consistent with the API, exactly one of `http_health_check`, `https_health_check`, |
| `http2_health_check`, `tcp_health_check` or `ssl_health_check` is now required on |
| `google_compute_health_check`. |
| |
| ### At least one of `host`, `request_path`, `response`, `port`, `port_name`, `proxy_header`, or `port_specification` is now required on `google_compute_health_check.http_health_check`, `google_compute_health_check.https_health_check` and `google_compute_health_check.http2_health_check` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `host`, `request_path`, `response`, |
| `port`, `port_name`, `proxy_header`, or `port_specification` is now required on the |
| `http_health_check`, `https_health_check` and `http2_health_check` blocks. |
| |
| ### At least one of `request`, `response`, `port`, `port_name`, `proxy_header`, or `port_specification` is now required on `google_compute_health_check.ssl_health_check` and `google_compute_health_check.tcp_health_check` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `request`, `response`, `port`, `port_name`, |
| `proxy_header`, or `port_specification` is now required on the `ssl_health_check` and `tcp_health_check` blocks. |
| |
| ## Resource: `google_compute_image` |
| |
| ### `type` is now required on `google_compute_image.guest_os_features` |
| |
| In an attempt to avoid allowing empty blocks in config files, `type` is now required on the |
| `guest_os_features` block. |
| |
| ## Resource: `google_compute_instance` |
| |
| ### `interface` is now required on block `google_compute_instance.scratch_disk` |
| |
| Previously the default value of `interface` was `SCSI`. In an attempt to avoid allowing empty blocks |
| in config files, `interface` is now required on the `scratch_disk` block. |
| |
| ### At least one of `auto_delete`, `device_name`, `disk_encryption_key_raw`, `kms_key_self_link`, `initialize_params`, `mode` or `source` is now required on `google_compute_instance.boot_disk` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `auto_delete`, `device_name`, |
| `disk_encryption_key_raw`, `kms_key_self_link`, `initialize_params`, `mode` or `source` is now required on the |
| `boot_disk` block. |
| |
| ### At least one of `size`, `type`, `image`, or `labels` is now required on `google_compute_instance.boot_disk.initialize_params` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `size`, `type`, `image`, or `labels` |
| is now required on the `initialize_params` block. |
| |
| ### At least one of `enable_secure_boot`, `enable_vtpm`, or `enable_integrity_monitoring` is now required on `google_compute_instance.shielded_instance_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `enable_secure_boot`, `enable_vtpm`, |
| or `enable_integrity_monitoring` is now required on the `shielded_instance_config` block. |
| |
| ### At least one of `on_host_maintenance`, `automatic_restart`, `preemptible`, or `node_affinities` is now required on `google_compute_instance.scheduling` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `on_host_maintenance`, `automatic_restart`, |
| `preemptible`, or `node_affinities` is now required on the `scheduling` block. |
| |
| ## Resource: `google_compute_instance_group_manager` |
| |
| The following changes apply to both `google_compute_instance_group_manager` and `google_compute_region_instance_group_manager`. |
| |
| ### `instance_template` has been replaced by `version.instance_template` |
| |
| Instance group managers should be using `version` blocks to reference which |
| instance template to use for provisioning. To upgrade use a single `version` |
| block with `instance_template` in your config and by default all traffic will be |
| directed to that version. |
| |
| ### Old Config |
| |
| ```hcl |
| resource "google_compute_instance_group_manager" "my_igm" { |
| name = "my-igm" |
| zone = "us-central1-c" |
| base_instance_name = "igm" |
| |
| instance_template = google_compute_instance_template.my_tmpl.self_link |
| } |
| ``` |
| |
| ### New Config |
| |
| ```hcl |
| resource "google_compute_instance_group_manager" "my_igm" { |
| name = "my-igm" |
| zone = "us-central1-c" |
| base_instance_name = "igm" |
| |
| version { |
| name = "prod" |
| instance_template = google_compute_instance_template.my_tmpl.self_link |
| } |
| } |
| ``` |
| |
| ### `update_strategy` has been replaced by `update_policy` |
| |
| To allow much greater control over the updates happening to instance groups |
| `update_strategy` has been replaced by `update_policy`. The functionality controlled by `update_strategy` is now controlled by a combination of `update_policy.type` and `update_policy.minimal_action`. `update_strategy = NONE` can be achieved with `type = OPPORTUNISTIC`. The previous values of `RESTART` and `REPLACE` were both `PROACTIVE` types implicitly previously but can now be controlled explicitly. |
| |
| For more details see the |
| [official guide](https://cloud.google.com/compute/docs/instance-groups/rolling-out-updates-to-managed-instance-groups). |
| |
| ### Old Config |
| |
| ```hcl |
| resource "google_compute_instance_group_manager" "my_igm" { |
| name = "my-igm" |
| zone = "us-central1-c" |
| base_instance_name = "igm" |
| |
| instance_template = "${google_compute_instance_template.my_tmpl.self_link}" |
| |
| update_strategy = "NONE" |
| } |
| ``` |
| |
| ### New Config |
| |
| ```hcl |
| resource "google_compute_instance_group_manager" "my_igm" { |
| name = "my-igm" |
| zone = "us-central1-c" |
| base_instance_name = "igm" |
| |
| version { |
| name = "prod" |
| instance_template = "${google_compute_instance_template.my_tmpl.self_link}" |
| } |
| |
| update_policy { |
| minimal_action = "RESTART" |
| type = "OPPORTUNISTIC" |
| } |
| } |
| ``` |
| |
| ## Resource: `google_compute_instance_template` |
| |
| ### At least one of `enable_secure_boot`, `enable_vtpm`, or `enable_integrity_monitoring` is now required on `google_compute_instance_template.shielded_instance_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `enable_secure_boot`, `enable_vtpm`, or |
| `enable_integrity_monitoring` is now required on the `shielded_instance_config` block. |
| |
| ### At least one of `on_host_maintenance`, `automatic_restart`, `preemptible`, or `node_affinities` is now required on `google_compute_instance_template.scheduling` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `on_host_maintenance`, `automatic_restart`, |
| `preemptible`, or `node_affinities` is now required on the `scheduling` block. |
| |
| ### Disks with invalid scratch disk configurations are now rejected |
| |
| The instance template API allows specifying invalid configurations in some cases, |
| and an error is only returned when attempting to provision them. Terraform will |
| now report that some configs that previously appeared valid at plan time are |
| now invalid. |
| |
| A disk with `type` `"SCRATCH"` must have `disk_type` `"local-ssd"` and a size of 375GB. For example, |
| the following is valid: |
| |
| ```hcl |
| disk { |
| auto_delete = true |
| type = "SCRATCH" |
| disk_type = "local-ssd" |
| disk_size_gb = 375 |
| } |
| ``` |
| |
| These configs would have been accepted by Terraform previously, but will now |
| fail: |
| |
| ```hcl |
| disk { |
| source_image = "https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-7-v20210217" |
| auto_delete = true |
| type = "SCRATCH" |
| } |
| ``` |
| |
| ```hcl |
| disk { |
| source_image = "https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-7-v20210217" |
| auto_delete = true |
| disk_type = "local-ssd" |
| } |
| ``` |
| |
| ```hcl |
| disk { |
| auto_delete = true |
| type = "SCRATCH" |
| disk_type = "local-ssd" |
| disk_size_gb = 300 |
| } |
| ``` |
| |
| ### `kms_key_self_link` is now required on block `google_compute_instance_template.disk_encryption_key` |
| |
| In an attempt to avoid allowing empty blocks in config files, `kms_key_self_link` is now |
| required on the `disk_encryption_key` block. |
| |
| ## Resource: `google_compute_network` |
| |
| ### `ipv4_range` is now removed |
| |
| Legacy Networks are removed and you will no longer be able to create them |
| using this field from Feb 1, 2020 onwards. |
| |
| ## Resource: `google_compute_network_peering` |
| |
| ### `auto_create_routes` is now removed |
| |
| `auto_create_routes` has been removed because it's redundant and not |
| user-configurable. |
| |
| ## Resource: `google_compute_node_template` |
| |
| ### At least one of `cpus` or `memory` is now required on `google_compute_node_template.node_type_flexibility` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `cpus` or `memory` |
| is now required on the `node_type_flexibility` block. |
| |
| ## Resource: `google_compute_region_backend_service` |
| |
| ### At least one of `connect_timeout`, `max_requests_per_connection`, `max_connections`, `max_pending_requests`, `max_requests`, or `max_retries` is now required on `google_compute_region_backend_service.circuit_breakers` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `connect_timeout`, |
| `max_requests_per_connection`, `max_connections`, `max_pending_requests`, `max_requests`, |
| or `max_retries` is now required on the `circuit_breakers` block. |
| |
| ### At least one of `ttl`, `name`, or `path` is now required on `google_compute_region_backend_service.consistent_hash.http_cookie` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `ttl`, `name`, or `path` |
| is now required on the `consistent_hash.http_cookie` block. |
| |
| ### At least one of `http_cookie`, `http_header_name`, or `minimum_ring_size` is now required on `google_compute_region_backend_service.consistent_hash` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `http_cookie`, |
| `http_header_name`, or `minimum_ring_size` is now required on the `consistent_hash` block. |
| |
| ### At least one of `disable_connection_drain_on_failover`, `drop_traffic_if_unhealthy`, or `failover_ratio` is now required on `google_compute_region_backend_service.failover_policy` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `disable_connection_drain_on_failover`, |
| `drop_traffic_if_unhealthy`, or `failover_ratio` is now required on the `failover_policy` block. |
| |
| ### At least one of `base_ejection_time`, `consecutive_errors`, `consecutive_gateway_failure`, `enforcing_consecutive_errors`, `enforcing_consecutive_gateway_failure`, `enforcing_success_rate`, `interval`, `max_ejection_percent`, `success_rate_minimum_hosts`, `success_rate_request_volume`, or `success_rate_stdev_factor` is now required on `google_compute_region_backend_service.outlier_detection` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `base_ejection_time`, |
| `consecutive_errors`, `consecutive_gateway_failure`, `enforcing_consecutive_errors`, |
| `enforcing_consecutive_gateway_failure`, `enforcing_success_rate`, `interval`, `max_ejection_percent`, |
| `success_rate_minimum_hosts`, `success_rate_request_volume`, or `success_rate_stdev_factor` |
| is now required on the `outlier_detection` block. |
| |
| ### At least one of `enable` or `sample_rate` is now required on `google_compute_region_backend_service.log_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `enable` or `sample_rate` |
| is now required on the `log_config` block. |
| |
| ## Resource: `google_compute_region_health_check` |
| |
| ### Exactly one of `http_health_check`, `https_health_check`, `http2_health_check`, `tcp_health_check` or `ssl_health_check` is required on `google_compute_health_check` |
| |
| In attempt to be more consistent with the API, exactly one of `http_health_check`, `https_health_check`, |
| `http2_health_check`, `tcp_health_check` or `ssl_health_check` is now required on the |
| `google_compute_region_health_check`. |
| |
| ### At least one of `host`, `request_path`, `response`, `port`, `port_name`, `proxy_header`, or `port_specification` is now required on `google_compute_region_health_check.http_health_check`, `google_compute_region_health_check.https_health_check` and `google_compute_region_health_check.http2_health_check` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `host`, `request_path`, `response`, |
| `port`, `port_name`, `proxy_header`, or `port_specification` is now required on the |
| `http_health_check`, `https_health_check` and `http2_health_check` blocks. |
| |
| ### At least one of `request`, `response`, `port`, `port_name`, `proxy_header`, or `port_specification` is now required on `google_compute_region_health_check.ssl_health_check` and `google_compute_region_health_check.tcp_health_check` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `request`, `response`, `port`, `port_name`, |
| `proxy_header`, or `port_specification` is now required on the `ssl_health_check` and `tcp_health_check` blocks. |
| |
| ## Resource: `google_compute_resource_policy` |
| |
| ### Exactly one of `hourly_schedule`, `daily_schedule` or `weekly_schedule` is now required on `google_compute_resource_policy.snapshot_schedule_policy.schedule` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one |
| of `hourly_schedule`, `daily_schedule` or `weekly_schedule` is now required |
| on the `snapshot_schedule_policy.schedule` block. |
| |
| ### At least one of `labels`, `storage_locations`, or `guest_flush` is now required on `google_compute_resource_policy.snapshot_schedule_policy.snapshot_properties` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of |
| `labels`, `storage_locations`, or `guest_flush` is now required on the |
| `snapshot_schedule_policy.snapshot_properties` block. |
| |
| ## Resource: `google_compute_route` |
| |
| ### Exactly one of `next_hop_gateway`, `next_hop_instance`, `next_hop_ip`, `next_hop_vpn_tunnel` or `next_hop_ilb` is required on `google_compute_route` |
| |
| In attempt to be more consistent with the API, exactly one of `next_hop_gateway`, `next_hop_instance`, |
| `next_hop_ip`, `next_hop_vpn_tunnel` or `next_hop_ilb` is now required on the |
| `google_compute_route`. |
| |
| ## Resource: `google_compute_router` |
| |
| ### `range` is now required on `google_compute_router.bgp.advertised_ip_ranges` |
| |
| In an attempt to avoid allowing empty blocks in config files, `range` is now |
| required on the `bgp.advertised_ip_ranges` block. |
| |
| ## Resource: `google_compute_router_peer` |
| |
| ### `range` is now required on block `google_compute_router_peer.advertised_ip_ranges` |
| |
| In an attempt to avoid allowing empty blocks in config files, `range` is now |
| required on the `advertised_ip_ranges` block. |
| |
| ## Resource: `google_compute_snapshot` |
| |
| ### `raw_key` is now required on block `google_compute_snapshot.source_disk_encryption_key` |
| |
| In an attempt to avoid allowing empty blocks in config files, `raw_key` is now |
| required on the `source_disk_encryption_key` block. |
| |
| ## Resource: `google_compute_subnetwork` |
| |
| ### `enable_flow_logs` is now removed |
| |
| `enable_flow_logs` has been removed and should be replaced by the `log_config` block with configurations |
| for flow logging. Enablement of flow logs is now controlled by whether `log_config` is defined or not instead |
| of by the `enable_flow_logs` variable. Users with `enable_flow_logs = false` only need to remove the field. |
| |
| ### At least one of `aggregation_interval`, `flow_sampling`, or `metadata` is now required on `google_compute_subnetwork.log_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of |
| `aggregation_interval`, `flow_sampling`, or `metadata` is now required on the |
| `log_config` block. |
| |
| |
| ### Old Config |
| |
| ```hcl |
| resource "google_compute_subnetwork" "subnet-with-logging" { |
| name = "log-test-subnetwork" |
| ip_cidr_range = "10.2.0.0/16" |
| region = "us-central1" |
| network = google_compute_network.custom-test.self_link |
| |
| enable_flow_logs = true |
| } |
| ``` |
| |
| |
| ### New Config |
| |
| ```hcl |
| resource "google_compute_subnetwork" "subnet-with-logging" { |
| name = "log-test-subnetwork" |
| ip_cidr_range = "10.2.0.0/16" |
| region = "us-central1" |
| network = google_compute_network.custom-test.self_link |
| |
| log_config { |
| aggregation_interval = "INTERVAL_10_MIN" |
| flow_sampling = 0.5 |
| metadata = "INCLUDE_ALL_METADATA" |
| } |
| } |
| ``` |
| |
| |
| ## Resource: `google_container_cluster` |
| |
| ### `ip_allocation_policy` will catch out-of-band changes, `use_ip_aliases` removed |
| |
| -> This change and "Automatic subnetwork creation for VPC-native clusters |
| removed" are related; see the other entry for more details. |
| |
| In `2.X`, `ip_allocation_policy` wouldn't cause a diff if it was undefined in |
| config but was set on the cluster itself. Additionally, it could be defined with |
| `use_ip_aliases` set to `false`. However, this made it difficult to reason about |
| whether a cluster was routes-based or VPC-native. |
| |
| With `3.0.0`, Terraform will detect drift on the block. The configuration has also |
| been simplified. Terraform creates a VPC-native cluster when |
| `ip_allocation_policy` is defined (`use_ip_aliases` is implicitly set to true |
| and is no longer configurable). When the block is undefined, Terraform creates a |
| routes-based cluster. |
| |
| Other than removing the `use_ip_aliases` field, most users of VPC-native clusters |
| won't be affected. `terraform plan` will show a diff if a config doesn't contain |
| `ip_allocation_policy` but the underlying cluster does. Routes-based cluster |
| users may need to remove `ip_allocation_policy` if `use_ip_aliases` had been set |
| to `false`. |
| |
| #### Old Config |
| |
| ```hcl |
| resource "google_container_cluster" "primary" { |
| name = "my-cluster" |
| location = "us-central1" |
| |
| initial_node_count = 1 |
| |
| ip_allocation_policy { |
| use_ip_aliases = false |
| } |
| } |
| ``` |
| |
| #### New Config |
| |
| ```hcl |
| resource "google_container_cluster" "primary" { |
| name = "my-cluster" |
| location = "us-central1" |
| |
| initial_node_count = 1 |
| } |
| ``` |
| |
| |
| ### Automatic subnetwork creation for VPC-native clusters removed |
| |
| Automatic creation of subnetworks in GKE has been removed. Now, users of |
| VPC-native clusters will always need to provide a `google_compute_subnetwork` |
| resource to use `ip_allocation_policy`. Routes-based clusters are unaffected. |
| |
| Representing resources managed by another source in Terraform is painful, and |
| leads to confusing patterns that often involve unnecessarily recreating user |
| resources. A number of fields in GKE are dedicated to a feature that allows |
| users to create a GKE-managed subnetwork. |
| |
| This is a great fit for an imperative tool like `gcloud`, but it's not required |
| for Terraform. With Terraform, it's relatively easy to specify a subnetwork in |
| config alongside the cluster. Not only does that allow configuring subnetwork |
| features like flow logging, it's more explicit, allows the subnetwork to be used |
| by other resources, and the subnetwork persists through cluster deletion. |
| |
| Particularly, Shared VPC was incompatible with `create_subnetwork`, and |
| `node_ipv4_cidr` was easy to confuse with |
| `ip_allocation_policy.node_ipv4_cidr_block`. |
| |
| #### Detailed changes: |
| |
| * `ip_allocation_policy.node_ipv4_cidr_block` removed (This controls the primary range of the created subnetwork) |
| * `ip_allocation_policy.create_subnetwork`, `ip_allocation_policy.subnetwork_name` removed |
| * `ip_allocation_policy` will catch drift when not in config |
| * `ip_allocation_policy.use_ip_aliases` removed |
| * Enablement is now based on `ip_allocation_policy` being defined instead |
| * Conflict added between `node_ipv4_cidr`, `ip_allocation_policy` |
| |
| #### Upgrade instructions |
| |
| 1. Remove the removed fields from `google_container_cluster` |
| 1. Add a `google_compute_subnetwork` to your config, import it using `terraform import` |
| 1. Reference the subnetwork using the `subnetwork` field on your `google_container_cluster` |
| |
| -> Subnetworks originally created as part of `create_subnetwork` will be deleted |
| alongside the cluster. If there are other users of the subnetwork, deletion of |
| the cluster will fail. After the original resources are deleted, |
| `terraform apply` will recreate the same subnetwork except that it won't be |
| managed by a GKE cluster and other resources can use it safely. |
| |
| #### Old Config |
| |
| ```hcl |
| resource "google_compute_network" "container_network" { |
| name = "container-network" |
| auto_create_subnetworks = false |
| } |
| |
| resource "google_container_cluster" "primary" { |
| name = "my-cluster" |
| location = "us-central1" |
| network = google_compute_network.container_network.name |
| |
| initial_node_count = 1 |
| |
| ip_allocation_policy { |
| use_ip_aliases = true |
| create_subnetwork = true |
| cluster_ipv4_cidr_block = "10.0.0.0/16" |
| services_ipv4_cidr_block = "10.1.0.0/16" |
| node_ipv4_cidr_block = "10.2.0.0/16" |
| } |
| } |
| ``` |
| |
| #### New Config |
| |
| ```hcl |
| resource "google_compute_network" "container_network" { |
| name = "container-network" |
| auto_create_subnetworks = false |
| } |
| |
| resource "google_compute_subnetwork" "container_subnetwork" { |
| name = "container-subnetwork" |
| description = "auto-created subnetwork for cluster \"my-cluster\"" |
| ip_cidr_range = "10.2.0.0/16" |
| region = "us-central1" |
| network = google_compute_network.container_network.self_link |
| } |
| |
| resource "google_container_cluster" "primary" { |
| name = "my-cluster" |
| location = "us-central1" |
| network = google_compute_network.container_network.name |
| subnetwork = google_compute_subnetwork.container_subnetwork.name |
| |
| initial_node_count = 1 |
| |
| ip_allocation_policy { |
| cluster_ipv4_cidr_block = "10.0.0.0/16" |
| services_ipv4_cidr_block = "10.1.0.0/16" |
| } |
| } |
| ``` |
| |
| ### `taint` field is now authoritative when set |
| |
| The `taint` field inside of `node_config` blocks on `google_container_cluster` |
| and `google_container_node_pool` will no longer ignore GPU-related values when |
| set. |
| |
| Previously, the field ignored upstream taints when unset and ignored unset GPU |
| taints when other taints were set. Now it will ignore upstream taints when set |
| and act authoritatively when set, requiring all taints (including Kubernetes and |
| GKE-managed ones) to be defined in config. |
| |
| Additionally, an empty taint can now be specified with `taint = []`. As a result |
| of this change, the JSON/state representation of the field has changed, |
| introducing an incompatibility for users who specify config in JSON instead of |
| HCL or who use `dynamic` blocks. See more details in the [Attributes as Blocks](https://www.terraform.io/docs/configuration/attr-as-blocks.html) |
| documentation. |
| |
| ### `addons_config.kubernetes_dashboard` is now removed |
| |
| The `kubernetes_dashboard` addon is deprecated for clusters on GKE and |
| will soon be removed. It is recommended to use alternative GCP Console |
| dashboards. |
| |
| ### `channel` is now required on `google_container_cluster.release_channel` |
| |
| In an attempt to avoid allowing empty blocks in config files, `channel` is now |
| required on the `release_channel` block. |
| |
| ### The `disabled` field is now required on the `addons_config` blocks for `http_load_balancing`, `horizontal_pod_autoscaling`, `istio_config`, `cloudrun_config` and `network_policy_config`. |
| |
| In an attempt to avoid allowing empty blocks in config files, `disabled` is now |
| required on the different `google_container_cluster.addons_config` blocks. |
| |
| ### Exactly one of `daily_maintenance_window` or `recurring_window` is now required on `google_container_cluster.maintenance_policy` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one of `daily_maintenance_window` or `recurring_window` is now required on the |
| `maintenance_policy` block. |
| |
| ### At least one of `http_load_balancing`, `horizontal_pod_autoscaling` , `network_policy_config`, `cloudrun_config`, or `istio_config` is now required on `google_container_cluster.addons_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `http_load_balancing`, |
| `horizontal_pod_autoscaling` , `network_policy_config`, `cloudrun_config`, or `istio_config` is now required on the |
| `addons_config` block. |
| |
| ### At least one of `username`, `password` or `client_certificate_config` is now required on `google_container_cluster.master_auth` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `username`, `password` |
| or `client_certificate_config` is now required on the `master_auth` block. |
| |
| ### `enabled` is now required on block `google_container_cluster.vertical_pod_autoscaling` |
| |
| In an attempt to avoid allowing empty blocks in config files, `enabled` is now |
| required on the `vertical_pod_autoscaling` block. |
| |
| ### `enabled` is now required on block `google_container_cluster.network_policy` |
| |
| Previously the default value of `enabled` was `false`. In an attempt to avoid allowing empty blocks |
| in config files, `enabled` is now required on the `network_policy` block. |
| |
| ### `enable_private_endpoint` is now required on block `google_container_cluster.private_cluster_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, `enable_private_endpoint` is now |
| required on the `private_cluster_config` block. |
| |
| ### `logging_service` and `monitoring_service` defaults changed |
| |
| GKE Stackdriver Monitoring (the GKE-specific Stackdriver experience) is now |
| enabled at cluster creation by default, similar to the default in GKE `1.14` |
| through other tools. |
| |
| Terraform will now detect changes out of band when the field(s) are not defined |
| in config, attempting to return them to their new defaults, and will be clear |
| about what values will be set when creating a cluster. |
| |
| `terraform plan` will report changes upon upgrading if the field was previously |
| unset. Applying this change will enable the new Stackdriver service without |
| recreating clusters. Users who wish to use another value should record their |
| intended value in config; the old default values can be added to a |
| `google_container_cluster` resource config block to preserve them. |
| |
| #### Old Defaults |
| |
| ```hcl |
| logging_service = "logging.googleapis.com" |
| monitoring_service = "monitoring.googleapis.com" |
| ``` |
| |
| #### New Defaults |
| |
| ```hcl |
| logging_service = "logging.googleapis.com/kubernetes" |
| monitoring_service = "monitoring.googleapis.com/kubernetes" |
| ``` |
| |
| ### `zone`, `region` and `additional_zones` are now removed |
| |
| `zone` and `region` have been removed in favor of `location` and |
| `additional_zones` has been removed in favor of `node_locations` |
| |
| ## Resource: `google_container_node_pool` |
| |
| ### `zone` and `region` are now removed |
| |
| `zone` and `region` have been removed in favor of `location` |
| |
| ## Resource: `google_dataproc_autoscaling_policy` |
| |
| ### At least one of `min_instances`, `max_instances`, or `weight` is now required on `google_dataproc_autoscaling_policy.secondary_worker_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `min_instances`, |
| `max_instances`, or `weight` is now required on the `secondary_worker_config` |
| block. |
| |
| ## Resource: `google_dataproc_cluster` |
| |
| ### At least one of `staging_bucket`, `gce_cluster_config`, `master_config`, `worker_config`, `preemptible_worker_config`, `software_config`, `initialization_action` or `encryption_config` is now required on `google_dataproc_cluster.cluster_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `staging_bucket`, |
| `gce_cluster_config`, `master_config`, `worker_config`, `preemptible_worker_config`, `software_config`, |
| `initialization_action` or `encryption_config` is now required on the |
| `cluster_config` block. |
| |
| ### At least one of `image_version`, `override_properties` or `optional_components` is now required on `google_dataproc_cluster.cluster_config.software_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `image_version`, |
| `override_properties` or `optional_components` is now required on the |
| `cluster_config.software_config` block. |
| |
| ### At least one of `num_instances` or `disk_config` is now required on `google_dataproc_cluster.cluster_config.preemptible_worker_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `num_instances` |
| or `disk_config` is now required on the `cluster_config.preemptible_worker_config` block. |
| |
| ### At least one of `zone`, `network`, `subnetwork`, `tags`, `service_account`, `service_account_scopes`, `internal_ip_only` or `metadata` is now required on `google_dataproc_cluster.cluster_config.gce_cluster_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `zone`, `network`, `subnetwork`, |
| `tags`, `service_account`, `service_account_scopes`, `internal_ip_only` or `metadata` is now required on the |
| `gce_cluster_config` block. |
| |
| ### At least one of `num_instances`, `image_uri`, `machine_type`, `min_cpu_platform`, `disk_config`, or `accelerators` is now required on `google_dataproc_cluster.cluster_config.master_config` and `google_dataproc_cluster.cluster_config.worker_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `num_instances`, `image_uri`, |
| `machine_type`, `min_cpu_platform`, `disk_config`, or `accelerators` is now required on the |
| `cluster_config.master_config` and `cluster_config.worker_config` blocks. |
| |
| ### At least one of `num_local_ssds`, `boot_disk_size_gb` or `boot_disk_type` is now required on `google_dataproc_cluster.cluster_config.preemptible_worker_config.disk_config`, `google_dataproc_cluster.cluster_config.master_config.disk_config` and `google_dataproc_cluster.cluster_config.worker_config.disk_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `num_local_ssds`, `boot_disk_size_gb` |
| or `boot_disk_type` is now required on the `cluster_config.preemptible_worker_config.disk_config`, |
| `cluster_config.master_config.disk_config` and `cluster_config.worker_config.disk_config` blocks. |
| |
| |
| ### `policy_uri` is now required on `google_dataproc_cluster.autoscaling_config` block. |
| |
| In an attempt to avoid allowing empty blocks in config files, `policy_uri` is now |
| required on the `autoscaling_config` block. |
| |
| ## Resource: `google_dataproc_job` |
| |
| ### At least one of `query_file_uri` or `query_list` is now required on `hive_config`, `pig_config`, and `sparksql_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of |
| `query_file_uri` or `query_list` is now required on the `hive_config`, `pig_config`, and |
| `sparksql_config` blocks. |
| |
| ### At least one of `main_class` or `main_jar_file_uri` is now required on `google_dataproc_job.spark_config` and `google_dataproc_job.hadoop_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of |
| `main_class` or `main_jar_file_uri` is now required on the `spark_config` |
| and `hadoop_config` blocks. |
| |
| ### `driver_log_levels` is now required on `logging_config` blocks for `pyspark_config`, `hadoop_config`, `spark_config`, `pig_config`, and `sparksql_config`. |
| |
| In an attempt to avoid allowing empty blocks in config files, `driver_log_levels` is now |
| required on `pyspark_config`, `hadoop_config`, `spark_config`, `pig_config`, and |
| `sparksql_config` blocks. |
| |
| ### `max_failures_per_hour` is now required on block `google_dataproc_job.scheduling` |
| |
| In an attempt to avoid allowing empty blocks in config files, `max_failures_per_hour` is now |
| required on the `scheduling` block. |
| |
| ## Resource: `google_dns_managed_zone` |
| |
| ### At least one of `kind`, `non_existence`, `state`, or `default_key_specs` is now required on `google_dns_managed_zone.dnssec_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of |
| `kind`, `non_existence`, `state`, or `default_key_specs` is now required on the |
| `dnssec_config` block. |
| |
| ### `target_network` is now required on block `google_dns_managed_zone.peering_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, `target_network` is now |
| required on the `peering_config` block. |
| |
| ### `network_url` is now required on block `google_dns_managed_zone.peering_config.target_network` |
| |
| In an attempt to avoid allowing empty blocks in config files, `network_url` is now |
| required on the `peering_config.target_network` block. |
| |
| ### `target_name_servers` is now required on block `google_dns_managed_zone.forwarding_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, `target_name_servers` is now |
| required on the `forwarding_config` block. |
| |
| ### `ipv4_address` is now required on block `google_dns_managed_zone.forwarding_config.target_name_servers` |
| |
| In an attempt to avoid allowing empty blocks in config files, `ipv4_address` is now |
| required on the `forwarding_config.target_name_servers` block. |
| |
| ### `target_name_servers` is now required on block `google_dns_managed_zone.forwarding_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, `target_name_servers` is now |
| required on the `forwarding_config` block. |
| |
| ### `networks` is now required on block `google_dns_managed_zone.private_visibility_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, `networks` is now |
| required on the `private_visibility_config` block. |
| |
| ### `network_url` is now required on block `google_dns_managed_zone.private_visibility_config.networks` |
| |
| In an attempt to avoid allowing empty blocks in config files, `network_url` is now |
| required on the `private_visibility_config.networks` block. |
| |
| ## Resource: `google_dns_policy` |
| |
| ### `network_url` is now required on block `google_dns_policy.networks` |
| |
| In an attempt to avoid allowing empty blocks in config files, `network_url` is now |
| required on the `networks` block. |
| |
| ### `target_name_servers` is now required on block `google_dns_policy.alternative_name_server_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, `target_name_servers` is now |
| required on the `alternative_name_server_config` block. |
| |
| ### `ipv4_address` is now required on block `google_dns_policy.alternative_name_server_config.target_name_servers` |
| |
| In an attempt to avoid allowing empty blocks in config files, `ipv4_address` is now |
| required on the `alternative_name_server_config.target_name_servers` block. |
| |
| ## Resource: `google_folder_organization_policy` |
| |
| ### Exactly one of `allow` or `deny` is now required on `google_folder_organization_policy.list_policy` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one of `allow` or `deny` is now |
| required on the `list_policy` block. |
| |
| ### Exactly one of `all` or `values` is now required on `google_folder_organization_policy.list_policy.allow` and `google_folder_organization_policy.list_policy.deny` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one of `all` or `values` is now |
| required on the `list_policy.allow` and `list_policy.deny` blocks. |
| |
| ## Resource: `google_healthcare_hl7_v2_store` |
| |
| ### At least one of `allow_null_header ` or `segment_terminator` is now required on `google_healthcare_hl7_v2_store.parser_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `allow_null_header ` |
| or `segment_terminator` is now required on the `parser_config` block. |
| |
| ## Resource: `google_logging_metric` |
| |
| ### At least one of `linear_buckets`, `exponential_buckets` or `explicit_buckets` is now required on `google_logging_metric.bucket_options` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `linear_buckets`, |
| `exponential_buckets` or `explicit_buckets` is now required on the `bucket_options` block. |
| |
| ### At least one of `num_finite_buckets`, `width` or `offset` is now required on `google_logging_metric.bucket_options.linear_buckets` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `num_finite_buckets`, |
| `width` or `offset` is now required on the `bucket_options.linear_buckets` block. |
| |
| ### At least one of `num_finite_buckets`, `growth_factor` or `scale` is now required on `google_logging_metric.bucket_options.exponential_buckets` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `num_finite_buckets`, |
| `growth_factor` or `scale` is now required on the `bucket_options.exponential_buckets` block. |
| |
| ### `bounds` is now required on `google_logging_metric.bucket_options.explicit_buckets` |
| |
| In an attempt to avoid allowing empty blocks in config files, `bounds` is now required on the |
| `bucket_options.explicit_buckets` block. |
| |
| ## Resource: `google_mlengine_model` |
| |
| ### `name` is now required on `google_mlengine_model.default_version` |
| |
| In an attempt to avoid allowing empty blocks in config files, `name` is now required on the |
| `default_version` block. |
| |
| ## Resource: `google_monitoring_alert_policy` |
| |
| ### `labels` is now removed |
| |
| `labels` is removed as it was never used. See `user_labels` for the correct field. |
| |
| ### At least one of `content` or `mime_type` is now required on `google_monitoring_alert_policy.documentation` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `content` or `mime_type` |
| is now required on the `documentation` block. |
| |
| ## Resource: `google_monitoring_uptime_check_config` |
| |
| ### Exactly one of `resource_group` or `monitored_resource` is now required on `google_monitoring_uptime_check_config` |
| |
| In attempt to be more consistent with the API, exactly one of `resource_group` or `monitored_resource` is now required |
| on `google_monitoring_uptime_check_config`. |
| |
| ### Exactly one of `http_check` or `tcp_check` is now required on `google_monitoring_uptime_check_config` |
| |
| In attempt to be more consistent with the API, exactly one of `http_check` or `tcp_check` is now required |
| on `google_monitoring_uptime_check_config`. |
| |
| ### At least one of `auth_info`, `port`, `headers`, `path`, `use_ssl`, or `mask_headers` is now required on `google_monitoring_uptime_check_config.http_check` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `auth_info`, |
| `port`, `headers`, `path`, `use_ssl`, or `mask_headers` is now required on the `http_check` block. |
| |
| ### At least one of `resource_type` or `group_id` is now required on `google_monitoring_uptime_check_config.resource_group` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `resource_type` or `group_id` |
| is now required on the `resource_group` block. |
| |
| ### `content` is now required on block `google_monitoring_uptime_check_config.content_matchers` |
| |
| In an attempt to avoid allowing empty blocks in config files, `content` is now |
| required on the `content_matchers` block. |
| |
| ### `username` and `password` are now required on block `google_monitoring_uptime_check_config.http_check.auth_info` |
| |
| In an attempt to avoid allowing empty blocks in config files, `username` and `password` are now |
| required on the `http_check.auth_info` block. |
| |
| ### `is_internal` and `internal_checker` are now removed |
| |
| `is_internal` and `internal_checker` never worked, and are now removed. |
| |
| ## Resource: `google_organization_policy` |
| |
| ### Exactly one of `allow` or `deny` is now required on `google_organization_policy.list_policy` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one of `allow` or `deny` is now |
| required on the `list_policy` block. |
| |
| ### Exactly one of `all` or `values` is now required on `google_organization_policy.list_policy.allow` and `google_organization_policy.list_policy.deny` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one of `all` or `values` is now |
| required on the `list_policy.allow` and `list_policy.deny` blocks. |
| |
| ## Resource: `google_project_iam_audit_config` |
| |
| ### Audit configs are now authoritative on create |
| |
| Audit configs are now authoritative on create, rather than merging with existing configs on create. |
| Writing an audit config resource will now overwrite any existing audit configs on the given project. |
| |
| ## Resource: `google_project_organization_policy` |
| |
| ### Exactly one of `allow` or `deny` is now required on `google_project_organization_policy.list_policy` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one of `allow` or `deny` is now |
| required on the `list_policy` block. |
| |
| ### Exactly one of `all` or `values` is now required on `google_project_organization_policy.list_policy.allow` and `google_project_organization_policy.list_policy.deny` |
| |
| In an attempt to avoid allowing empty blocks in config files, exactly one of `all` or `values` is now |
| required on the `list_policy.allow` and `list_policy.deny` blocks. |
| |
| ## Resource: `google_project_service` |
| |
| ### `bigquery-json.googleapis.com` service can no longer be specified |
| |
| `bigquery-json.googleapis.com` is being renamed to `bigquery.googleapis.com` in |
| the upstream API. As a result, `bigquery-json.googleapis.com` has been |
| disallowed. Instead, please use `bigquery.googleapis.com`. The provider will |
| automatically convert between them as the upstream API migration continues. |
| |
| ## Resource: `google_project_services` |
| |
| ### `google_project_services` has been removed from the provider |
| |
| The `google_project_services` resource was authoritative over the list of GCP |
| services enabled on a project, so that services not explicitly set would be |
| removed by Terraform. |
| |
| However, this was dangerous to use in practice. Services have dependencies that |
| are automatically enabled alongside them and GCP will add dependencies to |
| services out of band, enabling them. If a user ran Terraform after this, |
| Terraform would disable the service- and implicitly disable any service that |
| relied on it. |
| |
| The `google_project_service` resource is a much better match for most users' |
| intent, managing a single service at a time. Setting several |
| `google_project_service` resources is an assertion that "these services are set |
| on this project", while `google_project_services` was an assertion that "**only** |
| these services are set on this project". |
| |
| Users should migrate to using `google_project_service` resources, or using the |
| [`"terraform-google-modules/project-factory/google//modules/project_services"`](https://registry.terraform.io/modules/terraform-google-modules/project-factory/google/3.3.0/submodules/project_services) |
| module for a similar interface to `google_project_services`. |
| |
| -> Prior to `2.13.0`, each `google_project_service` sent separate API enablement |
| requests. From `2.13.0` onwards, those requests are batched on write, and from `2.20.0` onwards, |
| batched on read. It's recommended that you upgrade to `2.13.0+` before migrating if you |
| encounter write quota issues or `2.20.0+` before migrating if you encounter read quota issues |
| when you migrate off `google_project_services`. |
| |
| #### Old Config |
| |
| ```hcl |
| resource "google_project_services" "project" { |
| project = "your-project-id" |
| services = ["iam.googleapis.com", "cloudresourcemanager.googleapis.com"] |
| disable_on_destroy = false |
| } |
| ``` |
| |
| #### New Config (module) |
| |
| ```hcl |
| module "project_services" { |
| source = "terraform-google-modules/project-factory/google//modules/project_services" |
| version = "3.3.0" |
| |
| project_id = "your-project-id" |
| activate_apis = [ |
| "iam.googleapis.com", |
| "cloudresourcemanager.googleapis.com", |
| ] |
| |
| disable_services_on_destroy = false |
| disable_dependent_services = false |
| } |
| ``` |
| |
| #### New Config (google_project_service) |
| |
| ```hcl |
| resource "google_project_service" "service" { |
| for_each = toset([ |
| "iam.googleapis.com", |
| "cloudresourcemanager.googleapis.com", |
| ]) |
| |
| service = each.key |
| |
| project = "your-project-id" |
| disable_on_destroy = false |
| } |
| ``` |
| |
| ## Resource: `google_pubsub_subscription` |
| |
| ### `name` must now be a short name |
| |
| `name` previously could have been specified by a long name (e.g. `projects/my-project/subscriptions/my-subscription`) |
| or a shortname (e.g. `my-subscription`). `name` now must be the shortname. |
| |
| ### `ttl` is now required on `google_pubsub_subscription.expiration_policy` |
| |
| Previously, an empty `expiration_policy` block would allow the resource to never expire. In an attempt to avoid |
| allowing empty blocks in config files, `ttl` is now required on the `expiration_policy` block. `ttl` should be set |
| to `""` for the resource to never expire. |
| |
| ## Resource: `google_security_scanner_scan_config` |
| |
| ### At least one of `google_account` or `custom_account` is now required on `google_security_scanner_scan_config.authentication` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `google_account` or |
| `custom_account` is now required on the `authentication` block. |
| |
| ## Resource: `google_service_account_key` |
| |
| ### `pgp_key`, `private_key_fingerprint`, and `private_key_encrypted` are now removed |
| |
| `google_service_account_key` previously supported encrypting the private key with |
| a supplied PGP key. This is [no longer supported](https://www.terraform.io/docs/extend/best-practices/sensitive-state.html#don-39-t-encrypt-state) |
| and has been removed as functionality. State should instead be treated as sensitive, |
| and ideally encrypted using a remote state backend. |
| |
| This will require re-provisioning your service account key, unfortunately. There |
| is no known alternative at this time. |
| |
| ## Resource: `google_sql_database_instance` |
| |
| ### At least one of `ca_certificate`, `client_certificate`, `client_key`, `connect_retry_interval`, `dump_file_path`, `failover_target`, `master_heartbeat_period`, `password`, `ssl_cipher`, `username`, or `verify_server_certificate` is now required on `google_sql_database_instance.settings.replica_configuration` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `ca_certificate`, `client_certificate`, `client_key`, `connect_retry_interval`, |
| `dump_file_path`, `failover_target`, `master_heartbeat_period`, `password`, `ssl_cipher`, `username`, or `verify_server_certificate` is now required on the |
| `settings.replica_configuration` block. |
| |
| ### At least one of `cert`, `common_name`, `create_time`, `expiration_time`, or `sha1_fingerprint` is now required on `google_sql_database_instance.settings.server_ca_cert` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `cert`, `common_name`, `create_time`, `expiration_time`, or `sha1_fingerprint` is now required on the `settings.server_ca_cert` block. |
| |
| ### At least one of `day`, `hour`, or `update_track` is now required on `google_sql_database_instance.settings.maintenance_window` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `day`, `hour`, |
| or `update_track` is now required on the `settings.maintenance_window` block. |
| |
| ### At least one of `binary_log_enabled`, `enabled`, `start_time`, or `location` is now required on `google_sql_database_instance.settings.backup_configuration` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `binary_log_enabled`, `enabled`, `start_time`, or `location` is now required on the |
| `settings.backup_configuration` block. |
| |
| ### At least one of `authorized_networks`, `ipv4_enabled`, `require_ssl`, or `private_network` is now required on `google_sql_database_instance.settings.ip_configuration` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `authorized_networks`, `ipv4_enabled`, |
| `require_ssl`, and `private_network` is now required on the `settings.ip_configuration` block. |
| |
| ### `name` and `value` are now required on block `google_sql_database_instance.settings.database_flags` |
| |
| In an attempt to avoid allowing empty blocks in config files, `name` and `value` are now required on the `settings.database_flags` block. |
| |
| ### `value` is now required on block `google_sql_database_instance.settings.ip_configuration.authorized_networks` |
| |
| In an attempt to avoid allowing empty blocks in config files, `value` is now required on the `settings.ip_configuration.authorized_networks` block. |
| |
| ### `zone` is now required on block `google_sql_database_instance.settings.location_preference` |
| |
| In an attempt to avoid allowing empty blocks in config files, `zone` is now |
| required on the `settings.location_preference` block. |
| |
| ## Resource: `google_storage_bucket` |
| |
| ### `enabled` is now required on block `google_storage_bucket.versioning` |
| |
| Previously the default value of `enabled` was `false`. In an attempt to avoid allowing empty blocks |
| in config files, `enabled` is now required on the `versioning` block. |
| |
| ### At least one of `main_page_suffix` or `not_found_page` is now required on `google_storage_bucket.website` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `main_page_suffix` or |
| `not_found_page` is now required on the `website` block. |
| |
| ### At least one of `min_time_elapsed_since_last_modification`, `max_time_elapsed_since_last_modification`, `include_prefixes`, or `exclude_prefixes` is now required on `google_storage_transfer_job.transfer_spec.object_conditions` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `min_time_elapsed_since_last_modification`, |
| `max_time_elapsed_since_last_modification`, `include_prefixes`, or `exclude_prefixes` is now required on the `transfer_spec.object_conditions` block. |
| |
| ### `is_live` is now removed |
| |
| Please use `with_state` instead, as `is_live` is now removed. |
| |
| ## Resource: `google_storage_transfer_job` |
| |
| ### At least one of `overwrite_objects_already_existing_in_sink`, `delete_objects_unique_in_sink`, or `delete_objects_from_source_after_transfer` is now required on `google_storage_transfer_job.transfer_spec.transfer_options` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `overwrite_objects_already_existing_in_sink`, |
| `delete_objects_unique_in_sink`, or `delete_objects_from_source_after_transfer` is now required on the |
| `transfer_spec.transfer_options` block. |
| |
| ### At least one of `gcs_data_source`, `aws_s3_data_source`, or `http_data_source` is now required on `google_storage_transfer_job.transfer_spec` |
| |
| In an attempt to avoid allowing empty blocks in config files, at least one of `gcs_data_source`, `aws_s3_data_source`, |
| or `http_data_source` is now required on the `transfer_spec` block. |
| |
| ## Resource: `google_tpu_node` |
| |
| ### `preemptible` is now required on block `google_tpu_node.scheduling_config` |
| |
| In an attempt to avoid allowing empty blocks in config files, `preemptible` is now |
| required on the `scheduling_config` block. |