PostgreSQL에 연결

BigQuery 관리자는 PostgreSQL 데이터에 액세스하기 위한 연결을 만들 수 있습니다. 이 연결을 사용하면 데이터 분석가는 PostgreSQL에서 데이터를 쿼리할 수 있습니다.

지원되는 PostgreSQL 환경 및 버전

BigQuery 통합은 다음 PostgreSQL 배포 환경을 지원합니다.

  • Cloud VPN 또는 Cloud Interconnect를 통해 Google Cloud에 연결된 온프레미스 PostgreSQL 인스턴스
  • Compute Engine의 자체 관리형 PostgreSQL 인스턴스
  • 공개 IP 주소 또는 네트워크 연결을 통해 액세스할 수 있는 클라우드 호스팅 PostgreSQL 인스턴스

BigQuery 통합은 다음 PostgreSQL 버전을 지원합니다.

  • PostgreSQL 16(권장)
  • PostgreSQL 15

시작하기 전에

필요한 API를 사용 설정하고, PostgreSQL 데이터베이스를 구성하고, 사용자에게 이 문서의 각 작업을 수행하는 데 필요한 권한을 부여하는 Identity and Access Management 역할을 부여합니다.

  1. BigQuery Connection API 사용 설정하기

    API 사용 설정하기

  2. 네트워크 연결을 사용하여 비공개 네트워크를 통해 트래픽을 라우팅하려면 Compute Engine API도 사용 설정합니다.

    Compute Engine API 사용 설정

  3. PostgreSQL 데이터베이스에서 쿼리하려는 테이블 또는 스키마에 대한 SELECT 권한이 있는 전용 데이터베이스 사용자를 만듭니다.

    CREATE USER USER_NAME WITH PASSWORD 'PASSWORD';
    GRANT USAGE ON SCHEMA SCHEMA_NAME TO USER_NAME;
    GRANT SELECT ON ALL TABLES IN SCHEMA SCHEMA_NAME TO USER_NAME;

    다음을 바꿉니다.

    • USER_NAME: 데이터베이스 사용자의 사용자 이름입니다.
    • PASSWORD: 데이터베이스 사용자의 비밀번호입니다.
    • SCHEMA_NAME: 쿼리하려는 테이블의 스키마입니다.
  4. 다음 중 하나를 수행하여 PostgreSQL 데이터베이스 인스턴스에 대한 네트워크 연결을 구성합니다.

    • 비공개 네트워크를 통해 트래픽을 라우팅하는 경우 BigQuery 연결과 동일한 리전에 네트워크 연결을 만듭니다. DNS 피어링은 지원되지 않습니다. VPC 네트워크 내에서 확인 가능한 IP 주소 또는 호스트 이름을 사용하여 연결하세요.
    • 공개 인터넷을 통해 연결하는 경우 모든 Google IP 주소 범위를 PostgreSQL 데이터베이스의 방화벽 규칙에 추가합니다.

필요한 역할

PostgreSQL에 연결하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

BigQuery를 PostgreSQL에 연결

Google Cloud 콘솔 또는 bq 명령줄 도구에서 BigQuery를 PostgreSQL에 연결할 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색기 창에서 데이터 추가를 클릭합니다.

    데이터 추가 페이지가 열립니다.

  3. 필터링 기준 창의 데이터 소스 유형 섹션에서 데이터베이스를 선택합니다.

    또는 데이터 소스 검색 필드에 postgresql을 입력합니다.

  4. 추천 데이터 소스 섹션에서 PostgreSQL을 클릭합니다.

  5. 외부 데이터에 액세스 섹션에서 PostgreSQL에 대한 페더레이션 쿼리 설명이 있는 BigQuery 제휴 솔루션 카드를 클릭합니다(PostgreSQL용 Cloud SQL 또는 PostgreSQL용 AlloyDB 카드가 아님).

    외부 데이터 소스 창이 열립니다.

  6. 외부 데이터 소스 창에서 다음을 구성합니다.

    • 연결 ID 필드에 고유한 연결 ID를 입력합니다(예: postgres_prod_conn).
    • 위치 유형 섹션에서 리전을 선택한 후 BigQuery 데이터 세트가 있는 리전을 선택합니다. 이 연결을 사용하는 쿼리는 이 리전에서 실행해야 합니다.
    • (선택사항) 별칭 필드에 연결에 대한 설명이 포함된 이름을 입력합니다.
    • (선택사항) 설명 필드에 이 연결 리소스에 대한 설명을 입력합니다.
    • 암호화 섹션에서 Google-managed encryption key를 선택하거나 Cloud KMS 키를 선택하여 고객 관리 암호화 키(CMEK)를 사용합니다.
    • 호스트:포트 필드에 PostgreSQL 데이터베이스 서버의 호스트 및 포트를 HOST:PORT 형식으로 입력합니다(예: 10.10.2.2:5432).
    • 사용자 이름 필드에 기본 요건에서 만든 데이터베이스 사용자를 입력합니다.
    • 비밀번호 필드에 데이터베이스 사용자의 비밀번호를 입력합니다.
    • 데이터베이스 필드에 PostgreSQL 데이터베이스 이름을 입력합니다.
    • (선택사항) 네트워크 연결 필드에서 비공개 연결을 사용하는 경우 projects/PROJECT_ID/regions/NA_REGION/networkAttachments/ATTACHMENT_NAME 형식으로 네트워크 연결의 리소스 경로를 입력합니다.
    • TLS 모드 목록에서 지원되는 TLS 모드 중 하나를 선택합니다(예: 데이터 암호화 및 CA와 호스트 이름 확인(권장)).
    • 인증 기관(CA) 목록에서 Public CA(웹 PKI)를 선택하거나 커스텀 CA를 선택하고 PEM 형식의 인증서를 붙여넣습니다.
  7. 연결 만들기를 클릭합니다.

bq

--connection 플래그와 함께 bq mk 명령어를 사용합니다.

bq mk --connection \
  --location=LOCATION \
  --project_id=PROJECT_ID \
  --connector_configuration '{
    "connector_id": "postgresql",
    "endpoint": {
      "host_port": "HOST_PORT"
    },
    "asset": {
      "database": "DATABASE"
    },
    "authentication": {
      "username_password": {
        "username": "USERNAME",
        "password": {
          "plaintext": "PASSWORD"
        }
      }
    },
    "tls": {
      "mode": "TLS_MODE"
    },
    "network": {
      "private_service_connect": {
        "network_attachment": "projects/PROJECT_ID/regions/NA_REGION/networkAttachments/ATTACHMENT_NAME"
      }
    }
  }' \
  CONNECTION_ID

다음을 바꿉니다.

  • LOCATION: PostgreSQL과 함께 쿼리하려는 데이터 세트와 일치하는 BigQuery 리전(예: us-central1)입니다. 이 연결을 사용하는 쿼리는 이 리전에서 실행해야 합니다.
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
  • HOST_PORT: HOST:PORT 형식의 PostgreSQL 데이터베이스 서버의 호스트 및 포트입니다(예: 10.10.2.2:5432).
  • DATABASE: PostgreSQL 데이터베이스 이름
  • USERNAME: PostgreSQL 데이터베이스 사용자
  • PASSWORD: 데이터베이스 사용자의 비밀번호입니다.
  • TLS_MODE: TLS 암호화 모드(ENCRYPT_VERIFY_CA_AND_HOST, ENCRYPT_VERIFY_CA, ENCRYPT_VERIFY_NONE 또는 DISABLE). ENCRYPT_VERIFY_CA_AND_HOST 또는 ENCRYPT_VERIFY_CA과 함께 커스텀 CA 인증서를 사용하는 경우 "tls" 아래에 "private_pki": { "trusted_certificates_pem": "CERT_CONTENT" } 객체를 포함합니다.
  • NA_REGION: 네트워크 연결이 있는 리전입니다.
  • ATTACHMENT_NAME: 네트워크 연결의 이름입니다. 공개 IP를 통해 연결하는 경우 "network" 객체를 생략합니다.
  • CONNECTION_ID: 이 연결의 고유 식별자입니다.
  • (선택사항) --kms_key_name=KMS_KEY_NAME: 고객 관리 암호화 키(CMEK)입니다. 생략하면 사용자 인증 정보가 기본 Google-owned and Google-managed encryption key로 보호됩니다.

전송 계층 보안(TLS) 구성

PostgreSQL 커넥터는 전송 계층 보안(TLS)을 지원하여 BigQuery와 PostgreSQL 데이터베이스 간에 전송 중인 쿼리 트래픽을 암호화합니다.

BigQuery를 PostgreSQL에 연결할 때 다음 TLS 모드 중 하나를 선택합니다.

  • 데이터 암호화 및 인증 기관(CA)과 호스트 이름 확인(ENCRYPT_VERIFY_CA_AND_HOST 모드) TLS를 사용하여 전체 서버 유효성 검사를 수행합니다. 전송 중 데이터를 모두 암호화하고, 데이터베이스 서버의 인증서가 신뢰할 수 있는 인증 기관에 의해 서명되었는지 확인하고, 연결 중인 호스트 이름이 인증서의 일반 이름(CN) 또는 소유자 대체 이름(SAN)과 일치하는지 확인합니다. 공개 IP를 통한 연결에 필수입니다.

  • 데이터 암호화 및 CA만 확인(ENCRYPT_VERIFY_CA 모드) 전송 중 데이터는 모두 암호화하고 서버의 인증서가 신뢰할 수 있는 인증 기관에 의해 서명되었는지 확인하지만 서버의 호스트 이름은 확인하지 않습니다. 서버 인증서가 신뢰할 수 있는 CA에 의해 서명되었지만 인증서 CN 또는 SAN과 일치하지 않는 IP 주소 또는 호스트 이름을 사용하여 연결하는 경우 이 모드를 사용합니다.

  • 암호화만(ENCRYPT_VERIFY_NONE 모드). BigQuery와 서버 간에 전송되는 모든 데이터를 암호화합니다. 인증서 또는 호스트 이름 확인을 실행하지 않습니다. 비공개 VPC 내에서만 권장됩니다.

  • 암호화 또는 확인 없음(DISABLE 모드) 데이터를 암호화하지 않으며 인증서 또는 호스트 이름 확인을 실행하지 않습니다. 보호된 VPC 네트워크 내의 비공개 네트워크 연결을 통해 연결하는 경우에만 허용됩니다.

PEM 형식의 신뢰할 수 있는 서버 인증서

ENCRYPT_VERIFY_CA_AND_HOST 모드 또는 ENCRYPT_VERIFY_CA 모드를 사용하는 경우 다음을 수행합니다.

  • 데이터베이스 서버 인증서가 공개 CA(예: Let's Encrypt, DigiCert 또는 Google Trust Services를 포함한 Mozilla 루트 CA 프로그램에 포함된 인증서)에 의해 서명된 경우 인증서를 제공할 필요가 없습니다. 공개 CA의 루트 인증서는 기본적으로 신뢰됩니다.
  • 조직 내에서 내부 또는 비공개 CA가 서명한 인증서 또는 자체 서명 인증서를 사용하는 경우 연결 설정 중에 신뢰할 수 있는 PEM 인증서 필드에 PEM(Privacy-Enhanced Mail) 형식의 전체 인증서 체인을 제공해야 합니다.

사용자와 연결 공유

데이터를 쿼리하고 연결을 관리할 수 있도록 사용자에게 다음 역할을 부여할 수 있습니다.

  • roles/bigquery.connectionUser: 사용자가 연결을 사용하여 외부 데이터 소스에 연결하고 쿼리를 실행할 수 있습니다.

  • roles/bigquery.connectionAdmin: 사용자가 연결을 관리할 수 있습니다.

BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

    연결은 프로젝트의 연결 그룹에 나열됩니다.

  2. 왼쪽 창에서 탐색기를 클릭합니다.

    강조 표시된 탐색기 창 버튼

    왼쪽 창이 표시되지 않으면 왼쪽 창 펼치기를 클릭하여 창을 엽니다.

  3. 프로젝트를 클릭하고 연결을 클릭한 후 연결을 선택합니다.

  4. 세부정보 창에서 공유를 클릭하여 연결을 공유합니다. 다음 작업을 수행합니다.

    1. 연결 권한 대화상자에서 주 구성원을 추가하거나 수정하여 다른 주 구성원과 연결을 공유합니다.

    2. 저장을 클릭합니다.

bq

bq 명령줄 도구로 연결을 공유할 수 없습니다. 연결을 공유하려면 Google Cloud 콘솔이나 BigQuery Connections API 메서드를 사용하여 연결을 공유합니다.

API

BigQuery 연결 REST API 참조 섹션의 projects.locations.connections.setIAM 메서드를 사용하고 policy 리소스의 인스턴스를 지정합니다.

자바

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Java 설정 안내를 따르세요. 자세한 내용은 BigQuery Java API 참고 문서를 확인하세요.

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

가격 책정

페더레이션 쿼리 및 연결에는 다음 요금이 적용됩니다.

다음 단계