Terraform - повторное использование существующей подсети для создания экземпляра облачного sql на GCP
Я пытаюсь создать экземпляр облачного sql на GCP с помощью terraform. Я хочу использовать существующую подсеть VPC, созданную на предыдущем шаге, но, похоже, нет способа сослаться на нее. Вместо этого все примеры, похоже, требуют настройки нового диапазона IP-адресов. Это мой текущий код, который создает новый диапазон IP-адресов:
provider = google-beta
project = "project_name"
name = "private_range"
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 18
network = "projects/project_name/global/networks/vpc_name"
address = "192.168.128.0"
}
resource "google_service_networking_connection" "private_vpc_connection" {
provider = google-beta
network = "projects/project_name/global/networks/vpc_name"
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}
resource "google_sql_database_instance" "instance" {
provider = google-beta
project = "project_name"
name = "db-instance10"
region = "us-east1"
database_version = "MYSQL_5_7"
depends_on = [google_service_networking_connection.private_vpc_connection]
settings {
tier = "db-f1-micro"
ip_configuration {
ipv4_enabled = false
private_network = "projects/project_name/global/networks/vpc_name"
}
}
}
provider "google-beta" {
region = "us-east1"
zone = "us-east1-c"
}
Когда я указываю тот же диапазон IP-адресов, что и существующая подсеть. Я получаю сообщение об ошибке:
Ошибка: ошибка ожидания для создания GlobalAddress: Ошибка ожидания создания GlobalAddress: Запрошенный диапазон конфликтует с другими ресурсами: предоставленный диапазон IP-адресов перекрывается с существующим диапазоном IP-адресов подсети.
Кажется, не существует очевидного способа сослаться на существующий ресурс подсети, поскольку параметр reserved_peering_ranges, кажется, принимает только имя ресурса диапазона IP-адресов.
Вот спецификация ресурсов для существующей подсети:
creation_timestamp = "2020-06-03T07:28:05.762-07:00"
enable_flow_logs = true
fingerprint = "ied1TiEZjgc="
gateway_address = "192.168.128.1"
id = "us-east1/vpc_subnet_name"
ip_cidr_range = "192.168.128.0/18"
name = "vpc_subnet_name"
network = "https://www.googleapis.com/compute/v1/projects/project_name/global/networks/vpc_name"
private_ip_google_access = true
project = "project_name"
region = "us-east1"
secondary_ip_range = []
self_link = "https://www.googleapis.com/compute/v1/projects/project_name/regions/us-east1/subnetworks/vpc_subnet_name"
log_config {
aggregation_interval = "INTERVAL_5_SEC"
flow_sampling = 0.5
metadata = "INCLUDE_ALL_METADATA"
}
}
2 ответа
Для подключения к экземпляру Cloud sql через частный IP-адрес требуется настроить доступ к частным службам, использующий выделенный диапазон IP-адресов, который не должен перекрываться с какой-либо существующей подсетью VPC.
Частное соединение связывает вашу сеть VPC с сетью VPC службы. Это соединение позволяет экземплярам виртуальных машин в вашей сети VPC использовать внутренние IP-адреса для доступа к ресурсам службы, например экземпляру Cloud sql, имеющему внутренние IP-адреса.
После создания выделенный диапазон IP-адресов и соединение можно повторно использовать с другими службами.
вы можете использовать приведенный ниже модуль для создания облачного sql с существующим частным vpc, но вам необходимо изменить его в соответствии с вашей сетью. в этом сценарии я создал отдельную частную сеть и создал облачный sql с использованием этой сети.
https://github.com/gruntwork-io/terraform-google-sql
- получить существующую сеть в вашем облачном инфраструктуре, из которой вы хотите создать свой cloudql, приведенная ниже команда дает список сетей gcloud --uri
- вам нужно добавить сеть, в которой упоминается собственная ссылка, и указать шаги, на которых создается vpc. пожалуйста, обратитесь к приведенному ниже файлу main.tf
расположение этого файла --- Cloud_SQL.terraform\modules\sql_example_postgres-private-ip\examples\postgres-private-ip\main.tf
соответственно добавьте переменную.
# ------------------------------------------------------------------------------
# LAUNCH A POSTGRES CLOUD SQL PRIVATE IP INSTANCE
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# CONFIGURE OUR GCP CONNECTION
# ------------------------------------------------------------------------------
provider "google-beta" {
project = var.project
region = var.region
}
terraform {
# This module is now only being tested with Terraform 0.14.x. However, to make upgrading easier, we are setting
# 0.12.26 as the minimum version, as that version added support for required_providers with source URLs, making it
# forwards compatible with 0.14.x code.
required_version = ">= 0.12.26"
required_providers {
google-beta = {
source = "hashicorp/google-beta"
version = "~> 3.57.0"
}
}
}
# ------------------------------------------------------------------------------
# CREATE A RANDOM SUFFIX AND PREPARE RESOURCE NAMES
# ------------------------------------------------------------------------------
resource "random_id" "name" {
byte_length = 2
}
####################################################################
# Reserve global internal address range for the peering
resource "google_compute_global_address" "private_ip_address" {
provider = google-beta
# name = local.private_ip_name
name = var.vpc_network
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 16
# network = google_compute_network.private_network.self_link
# network = google_compute_network.vpc_network.self_link
network = "https://www.googleapis.com/compute/v1/projects/lucky-operand-312611/global/networks/myprivatevpc/"
}
# Establish VPC network peering connection using the reserved address range
resource "google_service_networking_connection" "private_vpc_connection" {
provider = google-beta
# network = google_compute_network.private_network.self_link
network = "https://www.googleapis.com/compute/v1/projects/lucky-operand-312611/global/networks/myprivatevpc"
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}
# ------------------------------------------------------------------------------
# CREATE DATABASE INSTANCE WITH PRIVATE IP
# ------------------------------------------------------------------------------
module "postgres" {
# When using these modules in your own templates, you will need to use a Git URL with a ref attribute that pins you
# to a specific version of the modules, such as the following example:
# source = "github.com/gruntwork-io/terraform-google-sql.git//modules/cloud-sql?ref=v0.2.0"
source = "../../modules/cloud-sql"
project = var.project
region = var.region
name = var.instance_name
db_name = var.db_name
engine = var.postgres_version
machine_type = var.machine_type
# To make it easier to test this example, we are disabling deletion protection so we can destroy the databases
# during the tests. By default, we recommend setting deletion_protection to true, to ensure database instances are
# not inadvertently destroyed.
deletion_protection = false
# These together will construct the master_user privileges, i.e.
# 'master_user_name'@'master_user_host' IDENTIFIED BY 'master_user_password'.
# These should typically be set as the environment variable TF_VAR_master_user_password, etc.
# so you don't check these into source control."
master_user_password = var.master_user_password
master_user_name = var.master_user_name
master_user_host = "%"
# Pass the private network link to the module
# private_network = google_compute_network.private_network.self_link
private_network = "https://www.googleapis.com/compute/v1/projects/lucky-operand-312611/global/networks/myprivatevpc"
# Wait for the vpc connection to complete
dependencies = [google_service_networking_connection.private_vpc_connection.network]
custom_labels = {
test-id = "postgres-private-ip-example"
}
}