비공개 서비스 액세스 구성

이 페이지에서는 VPC 네트워크에 비공개 서비스 액세스를 구성하는 방법을 설명합니다.

비공개 서비스 액세스VPC 네트워크와 Cloud SQL 인스턴스가 상주하는 기본 Google 서비스 VPC 네트워크 사이에서 VPC 피어링 연결로 구현됩니다. 비공개 연결을 통해 VPC 네트워크의 VM 인스턴스와 액세스하는 서비스가 내부 IP 주소를 사용하여 독점적으로 통신할 수 있습니다. VM 인스턴스는 비공개 서비스 액세스를 통해 사용 가능한 서비스에 도달하기 위해 인터넷 액세스 또는 외부 IP 주소를 필요로 하지 않습니다.

시작하기 전에

Cloud SQL을 사용하려면 비공개 IP 연결에 사용되는 VPC 네트워크마다 비공개 서비스 액세스가 필요합니다. 비공개 서비스 액세스 연결을 관리하려면 사용자에게 다음 IAM 권한이 있어야 합니다.

  • compute.networks.list
  • compute.addresses.create
  • compute.addresses.list
  • servicenetworking.services.addPeering

이러한 권한이 없으면 권한 부족 오류가 발생할 수 있습니다.

공유 VPC 네트워크를 사용하는 경우 다음 작업도 수행해야 합니다.

  • 호스트 프로젝트에 사용자를 추가합니다.
  • 호스트 프로젝트에서 동일한 권한 4개를 사용자에게 할당합니다.
  • 사용자에게 compute.globalAddresses.list IAM 권한을 부여합니다.

Cloud SQL용 비공개 서비스 액세스 구성

비공개 서비스 액세스 구성 프로세스는 두 부분으로 이루어집니다.

  • 기존 IP 주소 범위 선택 또는 새 IP 주소 범위 할당

    또한 Google에서 사용자 대신 범위를 할당하도록 할 수도 있습니다. 이 경우 Google에서는 프리픽스 길이가 /20인 IP 범위를 자동으로 할당하고 default-ip-range 이름을 사용합니다.

    여러 리전 또는 다른 데이터베이스 유형의 인스턴스를 만들려면 각 리전 또는 데이터베이스 유형에 사용 가능한 /24 이상의 IP 주소 범위가 있어야 합니다. 여기에는 Filestore 또는 Memorystore와 같은 다른 애플리케이션이 포함됩니다. 새 리전 또는 데이터베이스 유형의 경우 Cloud SQL에 무료 /24 범위가 있어야 합니다.

  • VPC 네트워크에서 기존 서비스 제작자 네트워크로의 비공개 연결 만들기

IP 주소 범위 할당

콘솔

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. 사용할 VPC 네트워크를 선택합니다.
  3. 비공개 서비스 연결 탭을 선택합니다.
  4. 서비스에 할당된 IP 범위 탭을 선택합니다.
  5. IP 범위 할당을 클릭합니다.
  6. 할당된 범위의 이름google-managed-services-VPC_NETWORK_NAME을 지정합니다. 여기서 VPC_NETWORK_NAME은 연결할 VPC 네트워크의 이름입니다(예: google-managed-services-default). 설명은 선택사항입니다.
  7. 커스텀 옵션을 선택한 다음 할당할 IP 주소 범위를 CIDR 표기법으로 입력합니다.
  8. 할당을 클릭하여 할당된 범위를 만듭니다.

gcloud

다음 중 하나를 수행합니다.

  • 주소 범위와 프리픽스 길이(서브넷 마스크)를 지정하려면 addressesprefix-length 플래그를 사용합니다. 예를 들어 CIDR 블록 192.168.0.0/16을 할당하려면 주소에 192.168.0.0을 지정하고 프리픽스 길이에 16을 지정합니다.
  •         gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \
            --global \
            --purpose=VPC_PEERING \
            --addresses=192.168.0.0 \
            --prefix-length=16 \
            --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
            
  • 프리픽스 길이(서브넷 마스크)만 지정하려면 prefix-length 플래그를 사용합니다. 주소 범위를 생략하면 VPC 네트워크에서 사용되지 않는 주소 범위를 Google Cloud가 자동으로 선택합니다. 다음 예시에서는 프리픽스 길이가 16비트인 사용되지 않는 IP 주소 범위를 선택합니다.
  •         gcloud compute addresses create google-managed-services-VPC_NETWORK_NAME \
            --global \
            --purpose=VPC_PEERING \
            --prefix-length=16 \
            --network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME
            

VPC_NETWORK_NAME을 VPC 네트워크 이름으로 바꿉니다(예: my-vpc-network).

다음 예시에서는 VPC 네트워크 my-vpc-network의 리소스가 비공개 IP를 사용하여 Cloud SQL 인스턴스에 연결하도록 허용하는 IP 범위를 할당합니다.

    gcloud compute addresses create google-managed-services-my-vpc-network \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=16 \
    --network=projects/myprojectid/global/networks/myvpcnetwork \
    --project=my-project
    

Terraform

IP 주소 범위를 할당하려면 Terraform 리소스를 사용합니다.

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
}

변경사항 적용

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이 리소스를 만들었거나 업데이트했는지 확인합니다.

변경사항 삭제

다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.

terraform destroy

비공개 연결 만들기

콘솔

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. 사용할 VPC 네트워크를 선택합니다.
  3. 비공개 서비스 연결 탭을 선택합니다.
  4. 서비스에 대한 비공개 연결 탭을 선택합니다.
  5. 연결 만들기를 클릭하여 네트워크와 서비스 제작자 사이에 비공개 연결을 만듭니다.
  6. 지정된 할당으로는 다른 서비스 프로듀서가 사용하지 않는 하나 이상의 할당된 기존 범위를 선택합니다.
  7. 연결을 클릭하여 연결을 만듭니다.

gcloud

  1. 비공개 연결을 만듭니다.

    gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=google-managed-services-VPC_NETWORK_NAME \
    --network=VPC_NETWORK_NAME \
    --project=PROJECT_ID

    이 명령어는 장기 Cloud SQL 인스턴스 작업을 시작하고 작업 ID를 반환합니다.

  2. 작업이 성공했는지 확인합니다.

    gcloud services vpc-peerings operations describe \
    --name=OPERATION_ID

비공개 연결을 만들 때 할당 범위를 2개 이상 지정할 수 있습니다. 예를 들어 할당 범위 하나가 소진되면 할당 범위를 추가로 지정할 수 있습니다. 서비스는 제공된 모든 범위의 IP 주소를 지정된 순서대로 사용합니다.

Terraform

비공개 연결을 만들려면 Terraform 리소스를 사용합니다.

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]
}

계정이 적시에 프로비저닝되므로 비공개 연결이 생성되는 동안 service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com 형식의 서비스 계정에 servicenetworking.serviceAgent 역할이 부여됩니다.

프로젝트의 compute.globalAddresses.list 권한 또는 compute.projects.get 권한에 관한 오류가 표시되면 다음 gcloud 명령어를 실행합니다.

gcloud projects add-iam-policy-binding HOST_PROJECT_NAME \
    --member=serviceAccount:service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com \
    --role=roles/servicenetworking.serviceAgent

비공개 서비스 액세스 구성 변경

기존 Cloud SQL 인스턴스를 수정하지 않고 비공개 서비스 연결에 할당된 주소 범위를 변경할 수 있습니다. 기존 Cloud SQL 인스턴스의 비공개 IP 주소를 변경하려면 이 단계를 따르세요.

할당된 주소 범위를 변경하려면 다음 안내를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. 사용할 VPC 네트워크를 선택합니다.
  3. 비공개 서비스 연결 탭을 선택합니다.
  4. 서비스에 할당된 IP 범위 탭을 선택합니다.
  5. 삭제할 범위의 이름을 선택합니다.

  6. 해제를 클릭합니다.

  7. IP 범위 할당을 클릭합니다.

  8. 같은 이름으로 새 범위를 만듭니다.

    이미 이 주소 이름을 사용하여 비공개 연결이 설정되었으므로 이름이 중요합니다.

gcloud services vpc-peerings update \
--network=VPC_NETWORK_NAME \
--ranges=ALLOCATED_RANGES \
--service=servicenetworking.googleapis.com \
--force

기존 Cloud SQL 인스턴스의 비공개 IP 주소 변경

기존 Cloud SQL 인스턴스의 비공개 IP 주소를 변경하려면 인스턴스를 원래 네트워크에서 임시 VPC 네트워크로 이동합니다. 그런 다음 인스턴스 원래 네트워크의 비공개 서비스 액세스 구성을 변경하고 Cloud SQL 인스턴스를 다시 원래 네트워크로 이동합니다.

다른 VPC 네트워크로 이동하려면 다음 절차의 마지막 단계(인스턴스 다시 이동)를 제외한 모든 단계를 따릅니다. 이 경우 TEMPORARY_VPC_NETWORK_NAME은 새 VPC 네트워크입니다. 또한 이전 비공개 연결을 삭제합니다. 삭제된 비공개 연결이 Google Cloud 콘솔에서 사라지는 데 며칠이 걸릴 수 있습니다.

Cloud SQL 인스턴스가 공유 VPC 네트워크에서 호스팅되는 경우 다음 안내에 사용된 VPC_NETWORK_NAME 변수는 호스트 프로젝트의 VPC 네트워크 이름이어야 합니다. 공유 VPC 네트워크로 네트워크를 지정하려면 네트워크의 전체 URL을 사용합니다(예: projects/HOST_PROJECT/global/networks/NETWORK_NAME).

콘솔

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. 임시 VPC 네트워크를 만듭니다.
  3. 임시 VPC 네트워크에서 IP 할당을 만듭니다.
  4. 임시 VPC 네트워크에서 비공개 연결을 만듭니다.
  5. Cloud SQL 인스턴스를 임시 VPC 네트워크로 이동합니다.

    gcloud beta sql instances patch INSTANCE_ID \
      --project=PROJECT_ID \
      --network=projects/PROJECT_ID/global/networks/TEMPORARY_VPC_NETWORK_NAME \
      --no-assign-ip
  6. 원래 네트워크에서 비공개 서비스 액세스 구성을 변경하여 새 할당 범위를 추가하거나 기존 범위를 삭제합니다.

  7. Cloud SQL 인스턴스를 원래 VPC 네트워크로 다시 이동합니다.

    gcloud beta sql instances patch INSTANCE_ID \
      --project=PROJECT_ID \
      --network=projects/PROJECT_ID/global/networks/ORIGINAL_VPC_NETWORK_NAME \
      --no-assign-ip