Private Service Connect에서 DNS 구성

이 페이지에서는 Private Service Connect에서 DNS를 구성하는 방법을 설명합니다.

개요

DNS는 Private Service Connect가 사용 설정된 인스턴스에 연결하는 데 권장되는 방법입니다. DNS 이름을 사용하면 서로 다른 네트워크가 동일한 인스턴스에 연결할 수 있으며 각 네트워크의 Private Service Connect 엔드포인트에 IP 주소가 다를 수 있습니다. 또한 Cloud SQL 인증 프록시와 언어 커넥터에서 이러한 인스턴스에 연결하려면 DNS 이름이 필요합니다.

Private Service Connect가 사용 설정된 Cloud SQL 인스턴스에는 다음 두 가지 유형의 DNS 이름이 있을 수 있습니다.

  • 인스턴스별 DNS 이름 Cloud SQL의 모든 버전의 인스턴스에서 사용할 수 있습니다. 기본 인스턴스와 각 복제본 인스턴스의 인스턴스별 DNS 이름이 다릅니다.

  • 전역 쓰기 엔드포인트 DNS 이름 이는 고급 재해 복구 (ADR)를 지원하기 위해 Cloud SQL Enterprise Plus 버전의 인스턴스에서 사용할 수 있습니다. 쓰기 엔드포인트는 현재 기본 인스턴스의 IP 주소로 자동 변환되는 전역 DNS 이름입니다. 복제본 장애 조치 또는 전환 작업의 경우 이 쓰기 엔드포인트는 들어오는 연결을 새 기본 인스턴스로 자동으로 리디렉션합니다. 쓰기 엔드포인트를 사용하면 리전 서비스 중단 복구 또는 재해 복구 드릴을 위해 복제본 장애 조치 또는 전환 작업을 실행할 때 애플리케이션 연결을 변경하지 않아도 됩니다.

Private Service Connect의 DNS 자동화

인스턴스별 DNS 이름을 만들려면 Cloud SQL DNS 자동화 기능을 사용하여 DNS 레코드와 이름을 설정하면 됩니다. DNS 자동화를 사용 설정하면 Cloud SQL이 승인된 소비자 VPC 네트워크에서 인스턴스별 DNS 이름의 DNS 레코드를 자동으로 프로비저닝하고 관리합니다.

Cloud SQL Enterprise Plus 버전 인스턴스에서 DNS 자동화를 사용 설정하면 항상 현재 기본 인스턴스의 IP 주소로 자동 변환되는 전역 쓰기 엔드포인트 DNS 이름도 사용 설정할 수 있습니다.

원하는 경우 인스턴스의 인스턴스별 DNS 레코드를 수동으로 구성할 수 있지만 (DNS 수동 구성 참고) DNS 자동화를 사용하는 것이 좋습니다. 수동 DNS 구성은 기존 옵션입니다.

DNS 자동화 사용을 위한 기본 요건

  • DNS 자동화 또는 전역 쓰기 엔드포인트 DNS 이름을 사용하려면 Cloud DNS API를 사용 설정해야 합니다.
  • DNS 자동화는 Private Service Connect가 사용 설정된 경우에만 사용 설정할 수 있습니다 (--enable-private-service-connect 매개변수 사용).
  • DNS 자동화는 하나 이상의 Private Service Connect 자동 연결이 지정된 경우에만 사용 설정할 수 있습니다 (--psc-auto-connections=network 사용).
  • 전역 쓰기 엔드포인트 DNS 이름은 DNS 자동화가 사용 설정된 Cloud SQL Enterprise Plus 버전 인스턴스에만 사용 설정할 수 있습니다.

DNS 자동화 구성

Cloud SQL 인스턴스 만들기에 표시된 대로 Private Service Connect가 사용 설정된 새 인스턴스를 만들 때 DNS 자동화와 전역 쓰기 엔드포인트 DNS 이름을 사용 설정할 수 있습니다.

기존 인스턴스에 대해 DNS 자동화를 사용 설정하거나 사용 중지할 수도 있습니다. 이렇게 하면 Cloud SQL이 각 네트워크에서 연결된 DNS 레코드를 자동으로 프로비저닝하거나 정리합니다.

gcloud

gcloud sql instances patch INSTANCE_NAME \
  --enable-psc-auto-dns=DNS_ENABLEMENT \
  --enable-psc-write-endpoint-dns=GLOBAL_DNS_ENABLEMENT \

REST

HTTP 메서드와 URL은 다음과 같습니다.

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

JSON 요청 본문은 다음과 같은 형식을 취합니다.

{
  "name": "INSTANCE_NAME",
  "project": "PROJECT_ID",
  "region": "REGION_NAME",
  "databaseVersion": "DATABASE_VERSION",
  "kind": "sql#instance",
  "settings": {
    "availabilityType": "AVAILABILITY_TYPE",
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [
          "ALLOWED_PROJECTS"
        ],
        "pscAutoConnections": [
          {
            "consumerProject":"CONSUMER_PROJECT",
            "consumerNetwork":"projects/PARENT_PROJECT/global/networks/CONSUMER_NETWORK"
          }
        ],
        "pscEnabled": true,
        "pscAutoDnsEnabled": DNS_ENABLEMENT,
        "pscWriteEndpointDnsEnabled": GLOBAL_DNS_ENABLEMENT,
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "SYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

다음을 바꿉니다.

  • DNS_ENABLEMENT: DNS 자동화를 사용 설정할지 중지할지에 따라 true 또는 false
  • GLOBAL_DNS_ENABLEMENT: 전역 쓰기 엔드포인트 DNS 이름을 사용 설정할지 사용 중지할지에 따라 true 또는 false true인 경우 enable-psc-auto-dnstrue이어야 합니다.

DNS 이름 보기

describe 명령어를 사용하면 인스턴스의 인스턴스별 DNS 이름과 프로젝트의 전역 쓰기 엔드포인트 DNS 이름을 모두 확인할 수 있습니다.

gcloud

인스턴스별 DNS 이름

DNS 자동화를 사용하여 생성된 인스턴스별 DNS 이름을 찾으려면 다음과 같이 gcloud sql instances describe 명령어를 사용하세요.

    gcloud sql instances describe INSTANCE_NAME \
      --project=PROJECT_ID  \
      --flatten="dnsNames[]" \
      --format="csv[no-heading](dnsNames.dnsScope, dnsNames.recordManager, dnsNames.name)" \
        | grep "INSTANCE,CLOUD_SQL_AUTOMATION"
  

출력은 다음과 같이 표시됩니다. 여기서 DNS_NAME은 인스턴스의 인스턴스별 DNS 이름입니다.

INSTANCE,CLOUD_SQL_AUTOMATION,DNS_NAME

DNS 이름은 인스턴스의 리전 이름과 .sql-psc-goog로 끝납니다(예:
INSTANCE,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.us-central1.sql-psc.goog).
장식되지 않은 DNS 이름만 반환하려면 명령어 끝에 | cut -d, -f3를 추가합니다.

전역 쓰기 엔드포인트 DNS 이름

마찬가지로 describe 명령어를 사용하여 복제 클러스터의 전역 쓰기 엔드포인트 DNS 이름을 찾을 수 있습니다.

    gcloud sql instances describe INSTANCE_NAME \
      --project=INSTANCE_NAME  \
      --flatten="dnsNames[]" \
      --format="csv[no-heading](dnsNames.dnsScope, dnsNames.recordManager, dnsNames.name)" \
        | grep "CLUSTER,CLOUD_SQL_AUTOMATION"
  

출력은 다음과 같이 표시됩니다. 여기서 GLOBAL_DNS_NAME은 복제 클러스터의 전역 쓰기 엔드포인트 DNS 이름입니다.

CLUSTER,CLOUD_SQL_AUTOMATION,GLOBAL_DNS_NAME

전역 쓰기 엔드포인트 DNS 이름은 .global.sql-psc-goog으로 끝납니다(예:
CLUSTER,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.global.sql-psc.goog). 장식되지 않은 DNS 이름만 반환하려면 명령어 끝에 | cut -d, -f3을 추가합니다.

REST

HTTP 메서드와 URL은 다음과 같습니다.

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

인스턴스별 DNS 이름과 전역 쓰기 엔드포인트 DNS 이름은 다음과 같이 응답의 dnsNames 필드에 반환됩니다.

{
  "dnsNames": [
    {
      "connectionType": "PRIVATE_SERVICE_CONNECT",
      "dnsScope": "INSTANCE",
      "name": "31f5395197d0.3e0v7ztul56ph.us-central1.sql.goog.",
      "recordManager": "CUSTOMER"
    },
    {
      "connectionType": "PRIVATE_SERVICE_CONNECT",
      "dnsScope": "INSTANCE",
      "name": "31f5395197d0.3e0v7ztul56ph.us-central1.sql-psc.goog",
      "recordManager": "CLOUD_SQL_AUTOMATION"
    },
    {
      "connectionType": "PRIVATE_SERVICE_CONNECT",
      "dnsScope": "CLUSTER",
      "name": "3lbvojtu2fo6q.3e0v7ztul56ph.global.sql-psc.goog",
      "recordManager": "CLOUD_SQL_AUTOMATION"
    }
  ],
}

전역 쓰기 엔드포인트 DNS 이름 또는 인스턴스별 DNS 이름을 사용하여 인스턴스에 연결할 수 있습니다. DNS 레코드를 사용하여 연결을 참고하세요.

DNS 자동화 상태 필드

다음 두 출력 필드에서 인스턴스 및 복제 클러스터의 DNS 상태를 확인할 수 있습니다.

  • instanceAutoDnsStatus: 인스턴스별 DNS의 상태를 표시합니다.
  • writeEndpointAutoDnsStatus: 전역 쓰기 엔드포인트 DNS의 상태를 표시합니다.

두 필드 모두 다음 값을 가질 수 있습니다.

  • AUTO_DNS_STATUS_UNSPECIFIED
  • AUTO_DNS_OK
  • AUTO_DNS_FAILED
  • AUTO_DNS_UNKNOWN

이러한 필드는 pscAutoConnections 출력 필드 내에 표시됩니다.

    "pscAutoConnections": [
      {
        "consumerNetwork": "projects/my-psc-project/global/networks/psc-dns-net2",
        "consumerNetworkStatus": "VALID",
        "consumerProject": "my-psc-project",
        "instanceAutoDnsStatus": "AUTO_DNS_OK",
        "ipAddress": "10.0.2.4",
        "status": "ACTIVE",
        "writeEndpointAutoDnsStatus": "AUTO_DNS_OK"
      }
    ]

DNS 자동화 문제 해결

Cloud DNS API가 사용 설정되어 있지 않거나 Private Service Connect 연결 정책이 누락되었거나 DNS 레코드 생성 중에 백엔드 오류가 있는 경우 DNS 자동화에서 인스턴스별 DNS 레코드 또는 전역 쓰기 엔드포인트 DNS 이름을 생성하지 못할 수 있습니다.

DNS 자동화가 올바르게 프로비저닝되지 않은 상황이 발생하면 update/patch API 또는 gcloud CLI와 함께 사용할 수 있는 두 가지 플래그가 있습니다.

  • --reconcile-psc-networking (boolean): 설정된 경우 Cloud SQL은 작동하지 않는 DNS 자동화 부분을 복원하려고 시도합니다. 이 플래그는 다운타임을 유발하지 않습니다.
  • --reconcile-psc-networking-force (boolean): reconcile-psc-networking와 유사하지만 설정된 경우 Cloud SQL은 작동 중인 기존 PSC DNS 자동화 부분에서 짧은 다운타임이 발생하더라도 모든 DNS 자동화를 완전히 복원하려고 시도합니다. 이렇게 하면 reconcile-psc-networking가 작동하지 않는 경우에 도움이 될 수 있습니다.

맞춤 DNS 이름 할당

Private Service Connect Cloud SQL 인스턴스의 커스텀 DNS 이름을 구성할 수 있습니다. Private Service Connect 인스턴스 DNS 이름을 값으로 사용하여 CNAME 레코드를 만들면 됩니다. 예를 들어 데이터베이스 DNS 이름 sample-db.mycompany.example.com를 사용하여 Private Service Connect DNS 이름 abcdef123456.987654321fedcb.us-central1.sql-psc.goog이 있는 데이터베이스 인스턴스를 참조하도록 애플리케이션을 구성하려면 먼저 커스텀 DNS 이름으로 인스턴스를 구성한 다음 DNS 제공업체를 사용하여 DNS CNAME 레코드를 만들어야 합니다.

이름 유형 TTL
sample-db.mycompany.example.com CNAME 600 abcdef123456.987654321fedcb.us-central1.sql-psc.goog

수동으로 DNS 구성

수동 DNS 구성은 기존 옵션이므로 DNS 자동화를 사용하는 것이 좋습니다. 선택적으로 인스턴스에 대한 인스턴스별 DNS 레코드를 수동으로 구성할 수 있습니다. DNS 이름을 사용하면 인증 프록시 또는 언어 커넥터를 사용하여 다른 네트워크에서 일관된 방식으로 연결할 수 있습니다. 인스턴스 조회 API 응답은 해당 VPC 네트워크의 비공개 DNS 영역에 DNS 레코드를 만드는 데 사용할 수 있는 추천 DNS 이름을 제공합니다.

gcloud

  1. 인스턴스의 DNS 이름을 포함하여 Cloud SQL 인스턴스에 대한 요약 정보를 보려면 gcloud sql instances describe 명령어를 사용합니다.

            gcloud sql instances describe INSTANCE_NAME \
              --project=PROJECT_ID
          

    다음을 바꿉니다.

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

    응답에 DNS 이름이 표시되는지 확인합니다. 이 이름의 패턴은 INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.입니다. 예를 들면 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.입니다.

    이 섹션의 사전 정의된 DNS 이름을 사용하는 대신 커스텀 DNS 이름을 사용하여 Cloud SQL 인스턴스에 연결하려면 인스턴스를 만들 때 커스텀 주체 대체 이름 (SAN) 설정을 구성합니다. 커스텀 SAN 설정에 삽입한 커스텀 DNS 이름이 인스턴스 서버 인증서의 SAN 필드에 추가됩니다. 이렇게 하면 호스트 이름 검증을 거쳐 커스텀 DNS 이름을 안전하게 사용할 수 있습니다.

    커스텀 SAN 설정을 구성하는 방법에 관한 자세한 내용은 인스턴스 만들기를 참고하세요.

  2. 비공개 DNS 영역을 만들려면 gcloud dns managed-zones create 명령어를 사용합니다. 이 영역은 Private Service Connect 엔드포인트를 통해 Cloud SQL 인스턴스에 연결하는 데 사용되는 VPC 네트워크와 연결됩니다.

      gcloud dns managed-zones create ZONE_NAME \
        --project=PROJECT_ID \
        --description="DESCRIPTION" \
        --dns-name=DNS_NAME \
        --networks=NETWORK_NAME \
        --visibility=private
          

    다음을 바꿉니다.

    • ZONE_NAME: DNS 영역의 이름
    • PROJECT_ID: 영역이 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
    • DESCRIPTION: 영역에 대한 설명 (예: Cloud SQL 인스턴스의 DNS 영역)
    • DNS_NAME: 영역에 대한 DNS 서픽스의 이름 (예: REGION_NAME.sql.goog.). 여기서 REGION_NAME은 영역의 리전 이름입니다.
    • NETWORK_NAME: VPC 네트워크의 이름
  3. Private Service Connect 엔드포인트를 만든 후 영역에 DNS 레코드를 만들려면 gcloud dns record-sets create 명령어를 사용합니다.

       gcloud dns record-sets create DNS_RECORD \
         --project=PROJECT_ID \
         --type=RRSET_TYPE \
         --rrdatas=RR_DATA \
         --zone=ZONE_NAME
          

    다음을 바꿉니다.

    • DNS_RECORD: DNS 레코드 이름. 이 레코드는 이 절차의 앞부분에서 Cloud SQL 인스턴스에서 검색한 DNS 이름 (예:
      ,1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.)으로 설정됩니다.
    • RRSET_TYPE: DNS 레코드 세트의 리소스 레코드 유형. Private Service Connect 엔드포인트용으로 예약한 내부 IP 주소가 IPv4 주소인 경우 이 파라미터에 A를 지정합니다. 그렇지 않고 엔드포인트의 IP 주소가 IPv6 주소이면 AAAA를 지정합니다.
    • RR_DATA: Private Service Connect 엔드포인트에 할당된 IP 주소 (예: 198.51.100.5). rrdata1 rrdata2 rrdata3와 같이 여러 개의 값을 입력할 수도 있습니다 (예:
      10.1.2.3 10.2.3.4 10.3. 4.5).

REST

  1. Cloud SQL 인스턴스의 DNS 이름을 가져옵니다.
  2. 요청 데이터를 사용하기 전에 다음을 바꿉니다.

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

    HTTP 메서드 및 URL:

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

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

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

    {
      ...
      "dnsName": "INSTANCE_ID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog."
    }
    

    dnsName 필드에는 Cloud SQL 인스턴스의 DNS 이름이 표시됩니다. DNS 이름은 항상 마침표(.)로 끝납니다.

  3. 비공개 DNS 영역을 만듭니다. 이 영역은 Private Service Connect 엔드포인트를 통해 Cloud SQL 인스턴스에 연결하는 데 사용되는 VPC 네트워크와 연결됩니다.
  4. 요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: DNS 영역이 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
    • ZONE_NAME: 영역 이름
    • DESCRIPTION: 영역에 대한 설명(예: Cloud SQL 인스턴스의 DNS 영역)
    • DNS_NAME: 영역에 대한 DNS 서픽스의 이름(예: REGION_NAME.sql.goog.). 여기서 REGION_NAME은 영역의 리전 이름입니다.
    • NETWORK_NAME: VPC 네트워크의 이름

    HTTP 메서드 및 URL:

    POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones

    JSON 요청 본문:

    {
      "name": "ZONE_NAME",
      "description": "DESCRIPTION",
      "dnsName": "DNS_NAME",
      "visibility": "private",
      "privateVisibilityConfig": {
        "kind": "dns#managedZonePrivateVisibilityConfig",
        "networks": [
          {
            "kind": "dns#managedZonePrivateVisibilityConfigNetwork",
            "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME"
          }
        ]
      }
    }
    

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

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

    {
      "name": "ZONE_NAME",
      "dnsName": "DNS_NAME",
      "description": "DESCRIPTION",
      "id": "ID",
      "nameServers": [
        "ns-gcp-private.googledomains.com."
      ],
      "creationTime": "2024-05-10T17:05:34.607Z",
      "visibility": "private",
      "privateVisibilityConfig": {
        "networks": [
          {
            "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME",
            "kind": "dns#managedZonePrivateVisibilityConfigNetwork"
          }
        ],
        "gkeClusters": [],
        "kind": "dns#managedZonePrivateVisibilityConfig"
      },
      "cloudLoggingConfig": {
        "kind": "dns#managedZoneCloudLoggingConfig"
      },
      "kind": "dns#managedZone"
    }
    
  5. Private Service Connect 엔드포인트를 만든 후 영역에 DNS 레코드를 만듭니다.
  6. 요청 데이터를 사용하기 전에 다음을 바꿉니다.

    • PROJECT_ID: DNS 영역이 포함된 Google Cloud 프로젝트의 ID 또는 프로젝트 번호
    • ZONE_NAME: 영역 이름
    • DNS_RECORD: DNS 레코드 이름. 이 레코드는 이 절차의 앞부분에서 Cloud SQL 인스턴스에서 검색한 DNS 이름(예: 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.)으로 설정됩니다.
    • RRSET_TYPE: DNS 레코드 세트의 리소스 레코드 유형. Private Service Connect 엔드포인트용으로 예약한 내부 IP 주소가 IPv4인 경우 이 파라미터에 A를 지정합니다. 그렇지 않고 엔드포인트의 IP 주소가 IPv6이면 AAAA를 지정합니다.
    • TTL: 레코드 세트의 초 단위 TTL(수명)(예: 300)
    • RR_DATA: Private Service Connect 엔드포인트에 할당된 IP 주소(예: 198.51.100.5). rrdata1 rrdata2 rrdata3와 같이 여러 개의 값을 입력할 수도 있습니다(예: 10.1.2.3 10.2.3.4 10.3.4.5).

    HTTP 메서드 및 URL:

    POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ZONE_NAME

    JSON 요청 본문:

    {
      "deletions": []
      "additions": [
        {
          "name": "DNS_RECORD",
          "type": "RRSET_TYPE",
          "ttl": TTL,
          "rrdatas": [
            "RR_DATA"
          ]
        }
      ]
    }
    

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

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

    {
      "additions": [
        {
          "name": "DNS_RECORD",
          "type": "RRSET_TYPE",
          "ttl": TTL,
          "rrdatas": [
            "RR_DATA"
          ],
          "signatureRrdatas": [],
          "kind": "dns#resourceRecordSet"
        }
      ],
      "deletions": [],
      "startTime": "2024-05-10T17:29:44.375Z",
      "id": "CHANGE_ID",
      "status": "pending",
      "kind": "dns#change"
    }