비공개 서비스 액세스와 Private Service Connect 모두 구성

이 페이지에서는 비공개 서비스 액세스Private Service Connect를 모두 구성하는 방법을 설명합니다.

비공개 서비스 액세스를 구성하면 Google Cloud 프로젝트에서 Virtual Private Cloud (VPC) 네트워크의 IP 주소 범위를 할당하고 비공개 서비스 연결을 만들 수 있습니다. 그러면 VPC 네트워크의 리소스를 Cloud SQL 인스턴스에 연결할 수 있습니다.

Private Service Connect를 구성하면 다른 그룹, 팀, 프로젝트 또는 조직에 속하는 여러 VPC 네트워크에서 기본 Cloud SQL 인스턴스 또는 읽기 복제본에 연결할 수 있습니다.

비공개 서비스 액세스 및 Private Service Connect를 지원하는 인스턴스 만들기

비공개 서비스 액세스와 Private Service Connect를 모두 지원하는 Cloud SQL 인스턴스를 만들면 두 서비스의 이점을 모두 누릴 수 있습니다. 자세한 내용은 인스턴스 연결 옵션을 참고하세요.

Private Service Connect를 사용하면 서로 다른 그룹, 팀, 프로젝트 또는 조직에 속하는 여러 VPC 네트워크에서 Cloud SQL 인스턴스에 연결할 수 있습니다.

gcloud CLI 또는 API를 사용하여 비공개 서비스 액세스 및 Private Service Connect를 지원하는 Cloud SQL 인스턴스를 만들 수 있습니다.

gcloud

비공개 서비스 액세스와 Private Service Connect를 모두 지원하는 인스턴스를 만들려면 gcloud beta sql instances create 명령어를 사용합니다.

gcloud beta sql instances create INSTANCE_NAME \
--project=PROJECT_ID \
--region=REGION_NAME \
--enable-private-service-connect \
--allowed-psc-projects=ALLOWED_PROJECTS \
--availability-type=AVAILABILITY_TYPE \
--no-assign-ip \
--allocated-ip-range-name=RANGE_NAME \
--enable-google-private-path \
--tier=MACHINE_TYPE \
--database-version=DATABASE_VERSION \
--network=VPC_PSA_NETWORK_PATH \
--enable-bin-log \
--psc-auto-connections=network=VPC_PSC_NETWORK_PATH,project=SERVICE_PROJECT

다음을 바꿉니다.

  • INSTANCE_NAME: 인스턴스 이름
  • PROJECT_ID: 인스턴스가 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
  • REGION_NAME: 인스턴스의 리전 이름
  • ALLOWED_PROJECTS: 허용되는 프로젝트 ID 또는 숫자의 목록(쉼표로 구분). 프로젝트가 이 목록에 포함되지 않은 경우 프로젝트에서 인스턴스에 연결할 Private Service Connect 엔드포인트를 만들 수 없습니다.

  • AVAILABILITY_TYPE: 인스턴스에 고가용성을 사용 설정합니다. 이 매개변수에 대해 다음 값 중 하나를 지정합니다.
    • REGIONAL: 고가용성을 사용 설정하며, 프로덕션 인스턴스에 권장됩니다. 인스턴스는 선택한 리전 내의 다른 영역으로 장애 조치됩니다.
    • ZONAL: 장애 조치 기능을 제공하지 않습니다. 이 설정이 기본 설정입니다.

    인스턴스의 고가용성 설정 및 삭제에 대한 자세한 내용은 기존 인스턴스를 고가용성으로 구성인스턴스의 고가용성 비활성화를 참조하세요.

  • RANGE_NAME: 이 선택적 매개변수의 경우 IP 범위가 할당되는 범위 이름을 설정합니다. 범위 이름은 RFC 1035를 준수해야 하며 1~63(영문 기준)자 이내여야 합니다.
  • MACHINE_TYPE: 인스턴스의 머신 유형입니다.
  • DATABASE_VERSION: 인스턴스의 데이터베이스 버전(예: MYSQL_8_0)
  • VPC_PSA_NETWORK_PATH: 인스턴스가 연결되는 VPC 네트워크의 이름 및 경로입니다 (예: "projects/PROJECT_ID/global/networks/default"). 이 네트워크는 비공개 서비스 액세스 연결과 Cloud SQL 인스턴스의 비공개 서비스 액세스 IP 주소에 사용됩니다.
  • VPC_PSC_NETWORK_PATH: Private Service Connect 엔드포인트를 만들어야 하는 VPC 네트워크의 경로입니다. 예를 들면 다음과 같습니다.
    projects/my-host-project/global/networks/default
  • SERVICE_PROJECT: Private Service Connect 엔드포인트가 생성된 프로젝트입니다. VPC 네트워크가 공유 VPC가 아닌 경우 네트워크의 호스트 프로젝트만 될 수 있습니다. 공유 VPC인 경우 호스트 프로젝트 또는 서비스 프로젝트일 수 있습니다.

Private Service Connect가 사용 설정된 인스턴스에 연결하는 방법을 알아보려면 Cloud SQL 인스턴스에 연결을 참고하세요.

공개 IP를 비활성화하려면 --no-assign-ip 매개변수를 사용합니다.

또는 선택적으로 --enable-google-private-path 매개변수를 사용하여 BigQuery와 같은 다른 Google Cloud 서비스가 Cloud SQL의 데이터에 액세스하고 비공개 IP 연결을 통해 이 데이터에 대해 쿼리할 수 있도록 허용합니다. 이 매개변수는 다음 경우에만 유효합니다.

  • --no-assign-ip 매개변수를 사용합니다.
  • --network 매개변수를 사용하여 비공개 연결을 만드는 데 사용할 VPC 네트워크의 이름을 지정합니다.

Terraform

비공개 서비스 액세스와 Private Service Connect가 모두 사용 설정된 인스턴스를 만들려면 google_sql_database_instance Terraform 리소스를 사용합니다.


resource "google_compute_network" "peering_network" {
  name                    = "private-network"
  auto_create_subnetworks = "false"
}

resource "google_compute_global_address" "private_ip_address" {
  name          = "private-ip-address"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.peering_network.id
}

resource "google_service_networking_connection" "default" {
  network                 = google_compute_network.peering_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

resource "google_sql_database_instance" "default" {
  name             = "mysql-instance"
  region           = "us-central1"
  database_version = "MYSQL_8_0"

  depends_on = [google_service_networking_connection.default]

  settings {
    tier = "db-f1-micro"
    ip_configuration {
      psc_config {
        psc_enabled               = true
        allowed_consumer_projects = [] # Add consumer project IDs here.
      }
      ipv4_enabled    = false
      private_network = google_compute_network.peering_network.id
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

resource "google_compute_network_peering_routes_config" "peering_routes" {
  peering              = google_service_networking_connection.default.peering
  network              = google_compute_network.peering_network.name
  import_custom_routes = true
  export_custom_routes = true
}

resource "google_compute_address" "default" {
  name         = "psc-compute-address-${google_sql_database_instance.default.name}"
  region       = "us-central1"
  address_type = "INTERNAL"
  subnetwork   = "default"      # Replace value with the name of the subnet here.
  address      = "192.168.0.43" # Replace value with the IP address to reserve.
}

data "google_sql_database_instance" "default" {
  name = resource.google_sql_database_instance.default.name
}

resource "google_compute_forwarding_rule" "default" {
  name                  = "psc-forwarding-rule-${google_sql_database_instance.default.name}"
  region                = "us-central1"
  network               = "default"
  ip_address            = google_compute_address.default.self_link
  load_balancing_scheme = ""
  target                = data.google_sql_database_instance.default.psc_service_attachment_link
}

Google Cloud 프로젝트에 Terraform 구성을 적용하려면 다음 섹션의 단계를 완료하세요.

Cloud Shell 준비

  1. Cloud Shell을 실행합니다.
  2. Terraform 구성을 적용할 기본 Google Cloud 프로젝트를 설정합니다.

    이 명령어는 프로젝트당 한 번만 실행하면 되며 어떤 디렉터리에서도 실행할 수 있습니다.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 구성 파일에서 명시적 값을 설정하면 환경 변수가 재정의됩니다.

디렉터리 준비

각 Terraform 구성 파일에는 자체 디렉터리(루트 모듈이라고도 함)가 있어야 합니다.

  1. Cloud Shell에서 디렉터리를 만들고 해당 디렉터리 내에 새 파일을 만드세요. 파일 이름에는 .tf 확장자가 있어야 합니다(예: main.tf). 이 튜토리얼에서는 파일을 main.tf라고 합니다.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 튜토리얼을 따라 하는 경우 각 섹션이나 단계에서 샘플 코드를 복사할 수 있습니다.

    샘플 코드를 새로 만든 main.tf에 복사합니다.

    필요한 경우 GitHub에서 코드를 복사합니다. 이는 Terraform 스니펫이 엔드 투 엔드 솔루션의 일부인 경우에 권장됩니다.

  3. 환경에 적용할 샘플 매개변수를 검토하고 수정합니다.
  4. 변경사항을 저장합니다.
  5. Terraform을 초기화합니다. 이 작업은 디렉터리당 한 번만 수행하면 됩니다.
    terraform init

    원하는 경우 최신 Google 공급업체 버전을 사용하려면 -upgrade 옵션을 포함합니다.

    terraform init -upgrade

변경사항 적용

  1. 구성을 검토하고 Terraform에서 만들거나 업데이트할 리소스가 예상과 일치하는지 확인합니다.
    terraform plan

    필요에 따라 구성을 수정합니다.

  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 Terraform 구성을 적용합니다.
    terraform apply

    Terraform에 '적용 완료' 메시지가 표시될 때까지 기다립니다.

  3. 결과를 보려면 Google Cloud 프로젝트를 엽니다. Google Cloud 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.

REST

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 인스턴스가 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
  • INSTANCE_NAME: 인스턴스 이름
  • REGION_NAME: 인스턴스의 리전 이름
  • AVAILABILITY_TYPE: 인스턴스에 고가용성을 사용 설정합니다. 이 매개변수에 대해 다음 값 중 하나를 지정합니다.
    • REGIONAL: 고가용성을 사용 설정하며, 프로덕션 인스턴스에 권장됩니다. 인스턴스는 선택한 리전 내의 다른 영역으로 장애 조치됩니다.
    • ZONAL: 장애 조치 기능을 제공하지 않습니다. 이 설정이 기본 설정입니다.

    인스턴스의 고가용성 설정 및 삭제에 대한 자세한 내용은 기존 인스턴스를 고가용성으로 구성인스턴스의 고가용성 비활성화를 참조하세요.

  • VPC_PSA_NETWORK_PATH: 인스턴스가 연결되는 VPC 네트워크의 경로입니다 (예: "projects/PROJECT_ID/global/networks/default"). 이 네트워크는 비공개 서비스 액세스 연결과 Cloud SQL 인스턴스의 비공개 서비스 액세스 IP 주소에 사용됩니다.
  • RANGE_NAME: 이 선택적 매개변수의 경우 IP 범위가 할당되는 범위 이름을 설정합니다. 범위 이름은 RFC 1035를 준수해야 하며 1~63(영문 기준)자 이내여야 합니다.
  • ALLOWED_PROJECTS: 허용되는 프로젝트 ID 또는 숫자의 목록(쉼표로 구분). 프로젝트가 이 목록에 포함되지 않은 경우 프로젝트에서 인스턴스에 연결할 Private Service Connect 엔드포인트를 만들 수 없습니다.

  • VPC_PSC_NETWORK_PATH: Private Service Connect 엔드포인트를 만들어야 하는 VPC 네트워크의 경로입니다. 예를 들면 다음과 같습니다.
    projects/my-host-project/global/networks/default
  • SERVICE_PROJECT: Private Service Connect 엔드포인트가 생성된 프로젝트입니다. VPC 네트워크가 공유 VPC가 아닌 경우 네트워크의 호스트 프로젝트만 될 수 있습니다. 공유 VPC인 경우 호스트 프로젝트 또는 서비스 프로젝트일 수 있습니다.

  • MACHINE_TYPE: 인스턴스의 머신 유형입니다.

Private Service Connect가 사용 설정된 인스턴스에 연결하는 방법을 알아보려면 Cloud SQL 인스턴스에 연결을 참고하세요.

인스턴스에 내부 IP 주소가 있으므로 ipv4Enabled 매개변수를 false로 설정합니다.

선택적 enablePrivatePathForGoogleCloudServices 매개변수를 true로 설정하면 BigQuery와 같은 다른 Google Cloud 서비스가 Cloud SQL의 데이터에 액세스하고 내부 IP 연결을 통해 이 데이터에 대해 쿼리할 수 있습니다. 이 매개변수를 false로 설정하면 다른 Google Cloud 서비스에서 내부 IP 연결을 통해 Cloud SQL의 데이터에 액세스할 수 없습니다.

HTTP 메서드 및 URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

JSON 요청 본문:

{
  "name": "INSTANCE_NAME",
  "project": PROJECT_ID",
  "region": "REGION_NAME",
  "databaseVersion": "MYSQL_8_0",
  "kind": "sql#instance",
  "settings": {
    "availabilityType": "AVAILABILITY_TYPE",
    "backupConfiguration": {
      "binaryLogEnabled": true,
      "enabled": true,
      "kind": "sql#backupConfiguration",
      "startTime": "00:00"
    },
    "ipConfiguration": {
      "ipv4Enabled": false,
      "privateNetwork": VPC_PSA_NETWORK_PATH,
      "allocatedIpRange": "RANGE_NAME",
      "enablePrivatePathForGoogleCloudServices": true,
      "pscConfig": {
        "allowedConsumerProjects": [
          "ALLOWED_PROJECTS"
        ],
        "pscAutoConnections": [
          {
            "consumerProject":"SERVICE_PROJECT",
            "consumerNetwork":"projects/SERVICE_PROJECT/global/networks/VPC_PSC_NETWORK_PATH"
          }
        ],
        "pscEnabled": true
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "SYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME",
  "status": "RUNNING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "startTime": "2023-06-14T18:48:35.499Z",
  "operationType": "CREATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

인스턴스의 Private Service Connect 비활성화

비공개 서비스 액세스와 Private Service Connect가 모두 사용 설정된 인스턴스의 Private Service Connect를 비활성화할 수 있습니다.

인스턴스의 Private Service Connect를 비활성화하면 이 작업에 8분이 소요되며 인스턴스에서 약 45초의 다운타임이 발생할 수 있습니다. 작업이 완료되면 비공개 서비스 액세스와 Private Service Connect 연결 경로가 더 이상 동일한 인스턴스에 공존하지 않습니다. Private Service Connect를 사용하여 인스턴스에 연결할 수 없습니다.

gcloud CLI 또는 API를 사용하여 인스턴스의 Private Service Connect를 비활성화할 수 있습니다.

gcloud

인스턴스의 Private Service Connect를 비활성화하려면 gcloud beta sql instances patch 명령어를 사용합니다.

gcloud beta sql instances patch INSTANCE_NAME \
--project=PROJECT_ID \
--no-enable-private-service-connect \
--clear-allowed-psc-projects

다음을 바꿉니다.

  • INSTANCE_NAME: 인스턴스 이름입니다.
  • PROJECT_ID: 인스턴스가 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호

REST

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 인스턴스가 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
  • INSTANCE_NAME: 인스턴스 이름

HTTP 메서드 및 URL:

PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

JSON 요청 본문:

{
  "kind": "sql#instance",
  "name": "INSTANCE_NAME",
  "project": "PROJECT_ID",
  "settings": {
    "ipConfiguration": {
      "pscConfig": {
        "pscEnabled": "false",
        "allowedConsumerProjects": [{}]
      }
    },
    "kind": "sql#settings"
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME",
  "status": "RUNNING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "startTime": "2023-06-14T18:48:35.499Z",
  "operationType": "UPDATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

인스턴스에 Private Service Connect 사용 설정

비공개 서비스 액세스가 이미 사용 설정된 인스턴스에 Private Service Connect를 사용 설정할 수 있습니다. Private Service Connect를 사용하여 여러 VPC 네트워크에서 Cloud SQL 인스턴스에 연결할 수 있습니다.

인스턴스에 Private Service Connect를 사용 설정하면 이 작업에 8분이 소요되며 인스턴스에서 약 45초의 다운타임이 발생할 수 있습니다. 작업이 완료되면 비공개 서비스 액세스와 Private Service Connect 연결 경로가 모두 동일한 인스턴스에 공존합니다.

gcloud CLI 또는 API를 사용하여 인스턴스에 Private Service Connect를 사용 설정할 수 있습니다.

gcloud

인스턴스에 Private Service Connect를 사용 설정하려면 gcloud beta sql instances patch 명령어를 사용합니다.

gcloud beta sql instances patch INSTANCE_NAME \
--project=PROJECT_ID \
--enable-private-service-connect \
--allowed-psc-projects=ALLOWED_PROJECTS \
--psc-auto-connections=network=VPC_PSC_NETWORK_PATH,project=SERVICE_PROJECT

다음을 바꿉니다.

  • INSTANCE_NAME: 인스턴스 이름입니다.
  • PROJECT_ID: 인스턴스가 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
  • ALLOWED_PROJECTS: 허용되는 프로젝트 ID 또는 숫자의 목록(쉼표로 구분). 프로젝트가 이 목록에 포함되지 않은 경우 프로젝트에서 인스턴스에 연결할 Private Service Connect 엔드포인트를 만들 수 없습니다.

  • VPC_PSC_NETWORK_PATH: Private Service Connect 엔드포인트가 생성된 VPC 네트워크의 경로입니다. 예를 들면 다음과 같습니다.
    projects/my-host-project/global/networks/default
  • SERVICE_PROJECT: Private Service Connect 엔드포인트가 생성된 프로젝트입니다. VPC 네트워크가 공유 VPC가 아닌 경우 네트워크의 호스트 프로젝트만 될 수 있습니다. 공유 VPC인 경우 호스트 프로젝트 또는 서비스 프로젝트일 수 있습니다.

Private Service Connect가 사용 설정된 인스턴스에 연결하는 방법을 알아보려면 Cloud SQL 인스턴스에 연결을 참고하세요.

REST

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 인스턴스가 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
  • INSTANCE_NAME: 인스턴스 이름입니다.
  • ALLOWED_PROJECTS: 허용되는 프로젝트 ID 또는 숫자의 목록(쉼표로 구분). 이러한 프로젝트는 이미 Private Service Connect를 사용하도록 구성된 프로젝트를 재정의합니다. 프로젝트가 이 목록에 포함되지 않은 경우 프로젝트에서 인스턴스에 연결할 Private Service Connect 엔드포인트를 만들 수 없습니다.
  • VPC_PSC_NETWORK_PATH: Private Service Connect 엔드포인트가 생성된 VPC 네트워크의 경로입니다. 예를 들면 다음과 같습니다.
    projects/my-host-project/global/networks/default
  • SERVICE_PROJECT: Private Service Connect 엔드포인트가 생성된 프로젝트입니다. VPC 네트워크가 공유 VPC가 아닌 경우 네트워크의 호스트 프로젝트만 될 수 있습니다. 공유 VPC인 경우 호스트 프로젝트 또는 서비스 프로젝트일 수 있습니다.

HTTP 메서드 및 URL:

PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

JSON 요청 본문:

{
  "kind": "sql#instance",
  "name": "INSTANCE_NAME",
  "project": "PROJECT_ID",
  "settings": {
    "ipConfiguration": {
      "pscConfig": {
        "pscAutoConnections": [
          {
            "consumerProject":"SERVICE_PROJECT",
            "consumerNetwork":"projects/SERVICE_PROJECT/global/networks/VPC_PSC_NETWORK_PATH"
          }
        ],
        "pscEnabled": "true",
        "allowedConsumerProjects": [ALLOWED_PROJECTS]
      }
    },
    "kind": "sql#settings"
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME",
  "status": "RUNNING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "startTime": "2023-06-14T18:48:35.499Z",
  "operationType": "UPDATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

Private Service Connect가 사용 설정된 인스턴스에 연결하는 방법을 알아보려면 Cloud SQL 인스턴스에 연결을 참고하세요.