비공개 IP 구성

이 페이지에서는 Cloud SQL 인스턴스에서 비공개 IP를 사용하도록 구성하는 방법을 설명합니다.

비공개 IP의 작동 방식과 환경, 관리 요구사항은 비공개 IP를 참조하세요.

시작하기 전에

Cloud SQL 인스턴스에서 비공개 IP를 사용하도록 구성하기 전에 다음을 수행해야 합니다.

  • 프로젝트에 Service Networking API를 사용 설정합니다.

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

    • 호스트 프로젝트에 Service Networking API를 사용 설정합니다.
    • 호스트 프로젝트에 사용자를 추가합니다.
    • 사용자에게 호스트 프로젝트의 compute.networkAdmin IAM 역할을 부여합니다.
  • 사용할 VPC 네트워크를 선택합니다.

  • 한 번만 수행: VPC 네트워크에서 비공개 서비스 액세스를 구성하여 IP 주소 범위를 할당하고 비공개 서비스 연결을 만듭니다. 그러면 VPC 네트워크의 리소스를 Cloud SQL 인스턴스에 연결할 수 있습니다.

    • 비공개 서비스 액세스를 사용 설정하려면 compute.networkAdmin IAM 역할이 필요합니다.

      네트워크에 비공개 서비스 액세스가 설정되면 인스턴스에서 비공개 IP를 사용하도록 구성할 때 더 이상 compute.networkAdmin 역할이 필요하지 않습니다.

    • Cloud SQL 인스턴스에 비공개 IP를 사용할 경우 Cloud SQL 인스턴스에 연결해야 하는 모든 Google Cloud 프로젝트에 비공개 서비스 액세스를 한 번만 구성하면 됩니다. 자세한 내용은 비공개 서비스 액세스를 참조하세요.

Cloud SQL은 아래의 모든 조건이 충족되면 비공개 서비스 액세스를 구성합니다.

  • Google Cloud 프로젝트에서 아직 비공개 서비스 액세스를 구성하지 않았습니다.
  • Google Cloud 프로젝트의 모든 Cloud SQL 인스턴스에 비공개 IP를 처음으로 사용 설정합니다.
  • 인스턴스의 Connections 페이지에서 비공개 IP를 사용 설정할 때 default 연결된 네트워킹 및 Use an automatically allocated IP range 옵션을 모두 선택합니다.

비공개 IP를 사용하도록 인스턴스 구성

인스턴스를 만들 때 또는 기존 인스턴스에 비공개 IP를 사용하도록 Cloud SQL 인스턴스를 구성할 수 있습니다.

새 인스턴스에 비공개 IP 구성

Cloud SQL 인스턴스를 만들 때 이 인스턴스에서 비공개 IP를 사용하도록 구성하려면 다음 안내를 따르세요.

Console

  1. Google Cloud Console의 Cloud SQL 인스턴스 페이지로 이동합니다.

    Cloud SQL 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.
  3. 생성 마법사의 구성 옵션에서 연결 섹션을 펼칩니다.
  4. 비공개 IP 체크박스를 선택합니다.

    드롭다운 목록에 프로젝트에서 사용할 수 있는 VPC 네트워크가 표시됩니다. 프로젝트가 공유 VPC의 서비스 프로젝트이면 호스트 프로젝트의 VPC 네트워크도 표시됩니다.

  5. 사용할 VPC 네트워크를 선택합니다.
  6. 비공개 서비스 액세스를 구성했으면 다음을 수행합니다.

    1. 사용할 VPC 네트워크를 선택합니다.
    2. 연결을 클릭합니다.
    3. 드롭다운에 할당한 IP 주소 범위가 표시됩니다.

    4. 만들기를 클릭합니다.
    5. 저장을 클릭합니다.

    Cloud SQL에서 자동으로 범위를 할당하고 비공개 연결을 만들도록 하려면 다음 안내를 따르세요.

    1. `기본` VPC 네트워크를 선택합니다.
    2. 할당 및 연결을 클릭합니다.
    3. 저장을 클릭합니다.

gcloud

아직 수행하지 않은 경우 Cloud SQL에 비공개 서비스 액세스를 구성하려면 다음 안내를 따르세요. --network 매개변수를 사용하여 선택한 VPC 네트워크의 이름을 지정하고 --no-assign-ip 플래그를 사용하여 공개 IP를 중지해 Cloud SQL 인스턴스를 만듭니다.

VPC 네트워크가 공유 VPC 네트워크가 아닌 경우 --network 매개변수 값의 형식은 https://www.googleapis.com/compute/alpha/projects/[PROJECT_ID]/global/networks/[VPC_NETWORK_NAME]입니다.

VPC 네트워크가 공유 VPC 네트워크이면 --network 매개변수 값의 형식은 projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME입니다. 여기서 HOST_PROJECT_ID는 공유 VPC 호스트 프로젝트의 이름이고 VPC_NETWORK_NAME은 공유 VPC 네트워크의 이름입니다.

gcloud --project=[PROJECT_ID] beta sql instances create [INSTANCE_ID]
       --network=[VPC_NETWORK_NAME]
       --no-assign-ip

기존 인스턴스에 비공개 IP 구성

기존 Cloud SQL 인스턴스에서 비공개 IP를 사용하도록 구성하면 해당 인스턴스가 다시 시작되므로 다운타임이 발생합니다.

비공개 IP를 사용하도록 기존 인스턴스를 구성하려면 다음 안내를 따르세요.

Console

  1. Google Cloud Console의 Cloud SQL 인스턴스 페이지로 이동합니다.
    Cloud SQL 인스턴스 페이지로 이동
  2. 인스턴스 이름을 클릭하여 개요 페이지를 엽니다.
  3. 연결 탭을 선택합니다.
  4. 비공개 IP 체크박스를 선택합니다.

    드롭다운 목록에 프로젝트에서 사용할 수 있는 네트워크가 표시됩니다. 프로젝트가 공유 VPC의 서비스 프로젝트이면 호스트 프로젝트의 VPC 네트워크도 표시됩니다.

  5. 비공개 서비스 액세스를 구성했으면 다음을 수행합니다.
    1. 사용할 VPC 네트워크를 선택합니다.
    2. 드롭다운에 할당한 IP 주소 범위가 표시됩니다.

    3. 연결을 클릭합니다.
    4. 저장을 클릭합니다.
  6. Cloud SQL에서 자동으로 IP 주소를 할당하도록 하려면 다음 안내를 따르세요.
    1. '기본' VPC 네트워크를 선택합니다.
    2. 할당 및 연결을 클릭합니다.
    3. 저장을 클릭합니다.

gcloud

아직 수행하지 않은 경우 Cloud SQL에 비공개 서비스 액세스를 구성하려면 다음 안내를 따르세요. --network 매개변수를 사용하여 선택한 VPC 네트워크의 이름을 지정해서 Cloud SQL 인스턴스를 업데이트합니다.

VPC_NETWORK_NAME은 선택한 VPC 네트워크의 이름입니다. 예를 들면 my-vpc-network입니다. --network 매개변수 값의 형식은 https://www.googleapis.com/compute/alpha/projects/[PROJECT_ID]/global/networks/[VPC_NETWORK_NAME]입니다.

gcloud --project=[PROJECT_ID] beta sql instances patch [INSTANCE_ID]
       --network=[VPC_NETWORK_NAME]
       --no-assign-ip

비공개 IP를 사용하여 인스턴스에 연결

비공개 서비스 액세스를 사용하여 동일한 VPC 네트워크의 Compute Engine 또는 Google Kubernetes Engine 인스턴스(여기서는 내부 소스로 정의)에서 또는 해당 네트워크의 외부(외부 소스)에서 Cloud SQL 인스턴스에 연결합니다.

내부 소스에서 연결

Compute Engine 리소스에서 실행되는 Cloud SQL 프록시와 같이 Cloud SQL 인스턴스와 동일한 Google Cloud 프로젝트의 소스에서 연결하려면 해당 리소스가 Cloud SQL 인스턴스와 동일한 VPC 네트워크에 있어야 합니다.

외부 소스에서 연결

온프레미스 네트워크가 Cloud SQL 인스턴스가 연결된 VPC 네트워크에 연결된 경우 온프레미스 네트워크의 클라이언트에서 연결할 수 있습니다. 온프레미스 네트워크에서의 연결을 허용하려면 다음 안내를 따르세요.

  1. Cloud VPN 터널이나 Dedicated Interconnect 또는 Partner Interconnect의 Interconnect 연결(VLAN)을 사용하여 VPC 네트워크를 온프레미스 네트워크에 연결해야 합니다.
  2. 비공개 서비스 연결에서 생성된 피어링을 식별합니다. 사용하는 데이터베이스 엔진 유형(MySQL, PostgreSQL, SQL Server)별로 피어링이 생성됩니다.
  3. 커스텀 경로를 교환하도록 피어링 연결을 업데이트합니다.
  4. 비공개 서비스 연결에 사용되는 할당 범위를 식별합니다.
  5. Cloud VPN 터널 또는 Cloud Interconnect 연결(VLAN)의 BGP 세션을 관리하는 Cloud Router에 할당된 범위에 대한 Cloud Router 커스텀 경로 공지를 만듭니다.

RFC 1918 이외의 주소에서 연결

RFC 1918은 내부적으로(즉, 조직 내에서) 사용되기 위해 할당되는 IP 주소를 지정하며 인터넷에서 라우팅하지 않습니다. 구체적으로 다음과 같습니다.

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

비공개 IP 주소를 사용하는 Cloud SQL 인스턴스에 대한 연결은 RFC 1918 주소 범위에 대해 자동으로 승인됩니다. 이에 따라 모든 비공개 클라이언트가 프록시를 통하지 않고 데이터베이스에 액세스할 수 있습니다.

RFC 1918 이외의 주소 범위(RFC 1918 주소 범위에 속하지 않는 주소)는 승인된 네트워크로 구성되어야 합니다.

RFC 1918 이외의 주소에서 연결하려면 RFC 1918 이외의 주소 범위에서 오는 트래픽을 허용하도록 인스턴스별 IP 승인을 설정해야 합니다.

예를 들어 다음과 같은 gcloud 명령어를 사용합니다.

gcloud sql instances patch INSTANCE_NAME --authorized-networks 172.16.12.0/28,172.16.1.0/24,172.16.10.0/24,172.16.2.0/24,172.16.11.0/24,192.88.99.0/24,11.0.0.0/24

Cloud SQL은 기본적으로 VPC에서 RFC 1918 이외의 서브넷 경로를 학습하지 않습니다. RFC 1918 이외의 경로를 내보내려면 네트워크 피어링을 Cloud SQL로 업데이트해야 합니다.

gcloud compute networks peerings update cloudsql-mysql-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT
  • cloudsql-mysql-googleapis-comVPC 네트워크 페이지의 Private Service Connection 이름입니다.

    네트워크를 선택한 다음 Private Service Connection 섹션을 확인합니다.

  • NETWORK은 VPC 네트워크의 이름입니다.

문제해결

자세한 내용을 보려면 표의 링크를 클릭하세요.

문제 설명 문제 원인 해결 방법
Aborted connection 패킷을 읽는 중에 오류가 발생하거나 연결이 취소되었습니다. 해결 방법을 참조하세요.
Unauthorized to connect 오류 여러 근본 원인이 있을 수 있습니다. 해결 방법을 참조하세요.
네트워크 연결 실패 프로젝트에서 Service Networking API가 사용 설정되지 않았습니다. 프로젝트에서 Service Networking API를 사용 설정합니다.
Remaining connection slots are reserved 최대 연결 수에 도달했습니다. max_connections 플래그를 늘립니다.
Set Service Networking service account as servicenetworking.serviceAgent role on consumer project 서비스 계정의 네트워킹 권한이 없거나 잘못되었습니다. Service Networking API를 중지했다가 다시 사용 설정합니다.
error x509: certificate is not valid for any names, but wanted to match project-name:db-name. 알려진 문제: 현재 Cloud SQL 프록시 다이얼러는 Go 1.15와 호환되지 않습니다. 해결될 때까지 해결 방법이 나와 있는 GitHub의 토론을 참조하세요.

연결 취소됨

Got an error reading communication packets 또는 Aborted connection xxx to db: DB_NAME 오류 메시지가 표시됩니다.

문제 원인

  • 네트워킹 불안정.
  • TCP 연결 유지 명령어에 대한 응답이 없습니다. 클라이언트 또는 서버가 응답하지 않으며 과부하되었을 수 있습니다.
  • 데이터베이스 엔진 연결 수명이 초과되어 서버에서 연결을 종료했습니다.

해결 방법

애플리케이션은 네트워크 장애를 허용하고 연결 풀링 및 재시도와 같은 권장사항을 따라야 합니다. 대부분의 연결 풀러는 이러한 오류를 포착합니다(가능한 경우). 그렇지 않으면 애플리케이션이 다시 시도하거나 정상적으로 실패해야 합니다.

연결을 다시 시도하려면 다음 방법을 사용하는 것이 좋습니다.

  1. 지수 백오프. 재시도 간격을 기하급수적으로 늘립니다.
  2. 무작위 백오프도 추가합니다.
이러한 방법을 조합하면 제한을 줄일 수 있습니다.


연결 권한 없음

Unauthorized to connect 오류 메시지가 표시됩니다.

문제 원인

승인은 여러 수준에서 발생하므로 여러 가지 원인이 있을 수 있습니다.

  • 데이터베이스 수준에서 데이터베이스 사용자가 있어야 하며 비밀번호가 일치해야 합니다.
  • 프로젝트 수준에서 사용자에게 올바른 IAM 권한이 없을 수 있습니다.
  • Cloud SQL 수준에서 인스턴스 연결 방법에 따라 근본 원인이 달라질 수 있습니다. 공개 IP를 통해 인스턴스에 직접 연결하는 경우 연결의 소스 IP가 인스턴스의 승인된 네트워크에 있어야 합니다.

    비공개 IP 연결은 기본적으로 허용되지만 RFC 1918 이외의 주소에서 연결하는 경우에는 예외입니다. RFC 1918 이외의 클라이언트 주소는 승인된 네트워크로 구성되어야 합니다.

    Cloud SQL은 기본적으로 VPC에서 RFC 1918 이외의 서브넷 경로를 학습하지 않습니다. RFC 1918 이외의 경로를 내보내려면 네트워크 피어링을 Cloud SQL로 업데이트해야 합니다. 예를 들면 다음과 같습니다.

    gcloud compute networks peerings update cloudsql-mysql-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT
    

    Cloud SQL 프록시를 통해 연결하는 경우 IAM 권한이 올바르게 설정되었는지 확인합니다.

  • 네트워크 수준에서 Cloud SQL 인스턴스가 공개 IP를 사용하는 경우 연결의 소스 IP가 승인된 네트워크에 있어야 합니다.

해결 방법

  • 사용자 이름과 비밀번호를 확인합니다.
  • 사용자의 IAM 역할과 권한을 확인합니다.
  • 공개 IP를 사용하는 경우 소스가 승인된 네트워크에 있는지 확인합니다.

네트워크 연결 실패

Error: Network association failed due to the following error 오류 메시지가 표시됩니다. 서비스 네트워킹 서비스 계정을 소비자 프로젝트에서 servicenetworking.serviceAgent 역할로 설정합니다.

문제 원인

프로젝트에서 Service Networking API가 사용 설정되지 않았습니다.

해결 방법

프로젝트에서 Service Networking API를 사용 설정합니다. Cloud SQL 인스턴스에 비공개 IP 주소를 할당하려고 하고 공유 VPC를 사용할 때 이 오류가 표시되면 호스트 프로젝트에도 Service Networking API를 사용 설정해야 합니다.


나머지 연결 슬롯이 예약됨

FATAL: remaining connection slots are reserved for non-replication superuser connections 오류 메시지가 표시됩니다.

문제 원인

최대 연결 수에 도달했습니다.

해결 방법

max_connections 플래그 값을 수정합니다. 특정 값 이상으로 max_connections를 늘리면 SLA 지원을 받지 못하게 될 수 있습니다.


서비스 네트워킹 서비스 계정을 소비자 프로젝트에서 servicenetworking.serviceAgent 역할로 설정

set Service Networking service account as servicenetworking.serviceAgent role on consumer project. 오류 메시지가 표시됩니다.

문제 원인

사용자 또는 서비스 계정 권한이 올바르지 않습니다. 이 문제는 Terraform 구성 스크립트와 같은 자동 설정 스크립트 중에 발생할 수 있습니다.

해결 방법

서비스 권한을 복구하려면 Service Networking API를 중지하고 5분 정도 기다린 후 다시 사용 설정합니다.

다음 gcloud 명령어를 사용하여 프로젝트에 역할을 할당할 수도 있습니다.

gcloud beta services identity create --service=servicenetworking.googleapis.com --project=project-id
gcloud projects add-iam-policy-binding project-id --member="service-account-prefix@service-networking.iam.gserviceaccount.com" --role="roles/servicenetworking.serviceAgent"

오류 x509: 인증서가 이름에 유효하지 않음

error x509: certificate is not valid for any names, but wanted to match project-name:db-name 오류 메시지가 표시됩니다.

문제 원인

알려진 문제: 현재 Cloud SQL 프록시 다이얼러는 Go 1.15와 호환되지 않습니다.

해결 방법

버그가 수정될 때까지 해결 방법이 포함된 GitHub의 토론을 참조하세요.


다음 단계