예시: MySQL 인스턴스의 비공개 연결

이 페이지에서는 Private Service Connect(PSC)를 사용하여 비공개 네트워크에 있는 MySQL 백엔드 시스템과 Integration Connectors 런타임 간의 연결을 설정하는 방법을 설명합니다.

고려사항

PSC 서비스 연결을 만들 때 다음 핵심 사항을 고려하세요.

  • PSC 서비스 연결과 부하 분산기는 동일한 VPC 내의 다른 서브넷에 있어야 합니다. 특히 서비스 연결은 NAT 서브넷에 있어야 합니다.
  • 백엔드 VM에서 실행되는 소프트웨어는 각 전달 규칙의 IP 주소로 전송되는 부하 분산기 트래픽 및 상태 확인 프로브에 응답해야 합니다(소프트웨어는 0.0.0.0:<port>로 리슨하고 네트워크 인터페이스에 할당된 특정 IP 주소는 리슨하지 않아야 함). 자세한 내용은 상태 확인을 참조하세요.
  • 트래픽 흐름을 용이하게 하도록 방화벽 규칙을 구성하세요.

    인그레스 규칙

    • PSC 서비스 연결의 서브넷에서 오는 트래픽은 ILB의 서브넷에 도달해야 합니다.
    • ILB의 서브넷 내에서 ILB는 트래픽을 백엔드 시스템으로 전송할 수 있어야 합니다.
    • 상태 확인 프로브가 백엔드 시스템에 액세스할 수 있어야 합니다. Google Cloud 상태 확인 프로브에는 고정 IP 범위(35.191.0.0/16, 130.211.0.0/22)가 있습니다. 따라서 이러한 IP는 백엔드 서버로 트래픽을 전송하도록 허용할 수 있습니다.

    이그레스 규칙

    이그레스 트래픽은 특정 거부 규칙이 구성되지 않는 한 기본적으로 Google Cloud 프로젝트에서 사용 설정됩니다.

  • PSC 서비스 연결과 부하 분산기와 같은 모든 Google Cloud 구성요소가 같은 리전에 있어야 합니다.
  • 보안 문제가 발생할 수 있으므로 백엔드 시스템은 공개 네트워크에 열려 있지 않아야 합니다. 하지만 다음 시나리오에서 백엔드 시스템이 트래픽을 허용하도록 유의하세요.
    • 패스스루 부하 분산기(L4 TCP/UDP ILB): PSC 서비스 연결의 NAT IP의 요청이 백엔드에 도달할 수 있어야 합니다. 이러한 NAT IP는 자동 생성됩니다. 따라서 서비스 연결이 있는 전체 NAT 서브넷의 IP 범위를 허용해야 합니다. 자세한 내용은 Private Service Connect 서브넷을 참조하세요.
    • 프록시 기반/HTTP(S4) 부하 분산기(L4 프록시 ILB, L7 ILB): 모든 새 요청은 부하 분산기에서 시작됩니다. 따라서 백엔드는 VPC 네트워크의 프록시 서브넷에서 요청을 수락해야 합니다. 자세한 내용은 Envoy 기반 부하 분산기용 프록시 전용 서브넷을 참조하세요.

예시

비공개 VPC 네트워크에 Google Cloud에서 호스팅되는 MySQL 인스턴스가 있고 Integration Connectors 런타임에 MySQL 인스턴스를 노출한다고 가정해 보겠습니다.

다음 이미지는 PSC 서비스 연결을 구성한 후 샘플 Google Cloud 프로젝트가 어떻게 표시되는지 보여줍니다.

샘플 설명

시작하기 전에

샘플 시나리오용 PSC 서비스 연결을 만들기 전에 다음 태스크를 수행하세요.

  • gcloud CLI를 설치합니다.
  • Google Cloud 프로젝트에 Compute Engine API를 사용 설정하세요.
  • CLI 명령어를 간결하게 만들려면 다음 명령어를 사용하여 PROJECT_ID, REGION, ZONE의 값을 설정하면 됩니다.
    gcloud config set project PROJECT_ID
    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
  • 이 튜토리얼의 명령어에서 BACKEND_SERVER_PORT를 MySQL 서버가 실행되는 기본 포트인 3306으로 바꾸세요.
  • 새 VPC 네트워크를 만들고 이 샘플 시나리오를 시도할 때 이 VPC 네트워크를 사용하는 것이 좋습니다. 시나리오를 테스트한 후에는 VPC 네트워크 및 기타 리소스를 삭제할 수 있습니다.
  • 하나 이상의 기존 연결이 있어야 합니다. 연결은 모든 유형일 수 있습니다. 기존 연결이 있으면 Integration Connectors 런타임에서 서비스 디렉터리의 프로젝트 ID를 가져올 수 있습니다. 이 프로젝트 ID는 PSC 서비스 연결을 만드는 데 필요합니다.

PSC 서비스 연결 만들기

샘플 시나리오에 대해 PSC 서비스 연결을 만들려면 다음 태스크를 수행하세요.

  1. VPC 네트워크 및 필수 서브넷을 만듭니다.
    1. VPC 네트워크를 만드세요.
      gcloud compute networks create VPC_NETWORK --project=PROJECT_NAME --subnet-mode=custom --mtu=1460 --bgp-routing-mode=regional
    2. 서브넷 1을 추가합니다.
      gcloud compute networks subnets create SUBNET_NAME_1 --network=VPC_NETWORK --range=SUBNET_RANGE_1 --purpose=PRIVATE_SERVICE_CONNECT

      이 명령어는 PSC 서비스 연결을 호스팅하는 데만 사용되는 NAT 서브넷으로 Subnet-1을 만듭니다. 이 NAT 서브넷에서는 다른 서비스를 호스팅할 수 없습니다.

    3. 서브넷 2를 추가합니다.
      gcloud compute networks subnets create SUBNET_NAME_2 --network=VPC_NETWORK --range=SUBNET_RANGE_2
  2. VM 인스턴스를 만듭니다.

    새로 만든 VPC에서 VM 인스턴스를 만들려면 다음 명령어를 실행합니다.

    gcloud compute instances create \
    --image-family debian-10 \
    --image-project debian-cloud \
    --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address \
    mysql-test
    

    이 명령어는 이름이 mysql-test인 VM 인스턴스를 만듭니다.

  3. Cloud NAT를 구성합니다.
    1. 간단한 라우터를 만듭니다.
      gcloud compute routers create NAT_ROUTER_NAME \
          --network=VPC_NETWORK
      
    2. 네트워크 주소 변환을 구성합니다.
      gcloud compute routers nats create NAT_GATEWAY_NAME \
          --router=NAT_ROUTER_NAME \
          --auto-allocate-nat-external-ips \
          --nat-all-subnet-ip-ranges
      
  4. SSH를 통해 VM 인스턴스에 연결합니다.
    1. SSH를 허용하는 방화벽 규칙을 만듭니다.
      gcloud compute firewall-rules create VPC_NETWORK-allow-ssh --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
      
    2. SSH를 통해 VM 인스턴스에 연결합니다.
      gcloud compute ssh \
          --tunnel-through-iap \
          mysql-test
      
  5. MySQL 서버를 설치합니다. 자세한 안내는 MySQL 설치를 참조하세요.
  6. MySQL 인스턴스에 연결하고 샘플 데이터를 만듭니다.
    1. MySQL 클라이언트를 사용하여 MySQL에 연결합니다.
      sudo mysql -u root -p
    2. 새 사용자를 만들고 모든 호스트 주소에서 연결할 수 있는 액세스 권한을 부여합니다.
      CREATE USER 'test-user'@'%' IDENTIFIED BY 'test-pass';
      GRANT ALL PRIVILEGES ON * . * TO 'test-user'@'%';
      FLUSH PRIVILEGES;
      

      이 명령어는 사용자 이름이 test-user이고 비밀번호가 test-pass인 사용자를 만듭니다.

    3. 샘플 데이터와 함께 데이터베이스를 만듭니다.
      CREATE DATABASE test-db;
      USE test-db;
      CREATE TABLE Singers (SingerId int, FirstName varchar(255), LastName varchar(255));
      INSERT INTO Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards');
      
    4. MySQL 클라이언트를 종료합니다.
      mysql> exit
    5. VM 인스턴스를 종료합니다.
      exit
  7. 비관리형 인스턴스 그룹을 설정합니다.
    1. 비관리형 인스턴스 그룹을 만듭니다.
      gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
    2. 2단계에서 만든 VM 인스턴스를 그룹에 추가합니다.
      gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances=mysql-test
  8. 상태 확인 프로브를 만들고 프로브의 트래픽을 허용합니다.
    1. 상태 점검 프로브를 만듭니다.
      gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port BACKEND_SERVER_PORT --region=REGION

      이 명령어에서 BACKEND_SERVER_PORT를 MySQL 서버가 실행되는 기본 포트인 3306으로 설정합니다.

    2. 프로브의 트래픽을 허용하는 방화벽 규칙을 만듭니다.
      gcloud compute firewall-rules create VPC_NETWORK-allow-health-check --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:BACKEND_SERVER_PORT --source-ranges=35.191.0.0/16,130.211.0.0/22
  9. L4 내부 부하 분산기를 만들고 부하 분산기의 트래픽을 허용합니다.
    1. 백엔드 서비스를 만듭니다.
      gcloud compute backend-services create BACKEND_SERVICE --load-balancing-scheme=internal --protocol=tcp --health-checks=HEALTH_CHECK_NAME --health-checks-region=REGION 
    2. 인스턴스 그룹을 백엔드 서비스에 추가합니다.
      gcloud compute backend-services add-backend BACKEND_SERVICE --instance-group=INSTANCE_GROUP_NAME --instance-group-zone=ZONE
    3. 전달 규칙을 만듭니다.
      gcloud compute forwarding-rules create FORWARDING_RULE_NAME --load-balancing-scheme=internal --network=VPC_NETWORK --subnet=SUBNET_NAME_2 --ip-protocol=TCP --ports=BACKEND_SERVER_PORT --backend-service=BACKEND_SERVICE --backend-service-region=REGION
    4. 부하 분산기에서 인스턴스 그룹으로 내부 트래픽을 허용하는 방화벽 규칙을 만듭니다.
      gcloud compute firewall-rules create VPC_NETWORK-allow-internal --direction=INGRESS --priority=1000 --network=VPC_NETWORK --action=ALLOW --rules=all --source-ranges=SUBNET_RANGE_2
  10. PSC 서비스 연결을 만듭니다.
    1. PSC 서비스 연결에서 이전 단계에서 만든 내부 부하 분산기로의 트래픽을 허용하는 방화벽 규칙을 만듭니다.
      gcloud compute firewall-rules create VPC_NETWORK-allow-sa --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:BACKEND_SERVER_PORT --source-ranges=SUBNET_RANGE_1
    2. 명시적 승인으로 서비스 연결을 만듭니다.
      gcloud compute service-attachments create SERVICE_ATTACHMENT_NAME --producer-forwarding-rule=FORWARDING_RULE_NAME  --connection-preference=ACCEPT_MANUAL --consumer-accept-list=SERVICE_DIRECTORY_PROJECT_ID=LIMIT --nat-subnets=SUBNET_NAME_1

      이 명령어에서 LIMIT는 프로젝트의 연결 한도입니다. 연결 한도는 이 서비스에 연결할 수 있는 Private Service Connect 엔드포인트의 수입니다. SERVICE_DIRECTORY_PROJECT_ID를 가져오는 방법은 서비스 디렉터리의 프로젝트 ID 가져오기를 참조하세요.

  11. 엔드포인트 연결을 만듭니다.

    엔드포인트 연결은 PSC 서비스 연결의 인터페이스라고 생각하면 됩니다. PSC 서비스 연결을 직접 사용하여 비공개 연결을 구성할 수 없습니다. 엔드포인트 연결을 통해서만 PSC 서비스 연결에 액세스할 수 있습니다. IP 주소 또는 호스트 이름으로 엔드포인트 연결을 만들 수 있습니다. 엔드포인트 연결을 만든 후 비공개 연결용 커넥터를 구성할 때 해당 연결을 사용할 수 있습니다. 자세한 내용은 엔드포인트 연결 만들기를 참조하세요.

  12. PSC 설정을 확인합니다. 이 가이드에서 만든 test-db 데이터베이스에 대한 MySQL 연결을 만들어 PSC 서비스 연결 연결을 확인할 수 있습니다. MySQL 연결을 만드는 자세한 단계는 MySQL 연결 만들기를 참조하세요. 연결을 만들 때 Destinations 섹션에서 (MySQL 연결 만들기의 5단계 참조) Destination typeHostname로 선택한 다음 적절한 엔드포인트 IP 주소 또는 호스트 이름을 입력합니다. 연결이 성공적으로 생성되면 Cloud 콘솔연결 페이지에서 새로 생성된 연결의 상태가 Active가 됩니다.

서비스 디렉터리의 프로젝트 ID 가져오기

지정된 Google Cloud 프로젝트의 요청만 수락하도록 PSC 서비스 연결을 만드는 것이 좋습니다. 하지만 이를 위해서는 Google Cloud 프로젝트와 연결된 서비스 디렉터리의 프로젝트 ID가 필요합니다. 서비스 디렉터리의 프로젝트 ID를 가져오려면 다음 예시와 같이 List Connections API를 사용할 수 있습니다.

구문

curl -X GET \
    -H "authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://connectors.googleapis.com/v1/projects/CONNECTORS_PROJECT_ID/locations/-/connections"

다음을 바꿉니다.

  • CONNECTORS_PROJECT_ID: 연결을 만든 Google Cloud 프로젝트의 ID

예시

이 예시에서는 connectors-test Google Cloud 프로젝트에 대한 서비스 디렉터리의 프로젝트 ID를 가져옵니다.

curl -X GET \
    -H "authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://connectors.googleapis.com/v1/projects/connectors-test/locations/-/connections"

터미널에서 이 명령어를 실행하면 다음과 비슷한 출력이 표시됩니다.

.....
{
  "connections": [
    {
      "name": "projects/connectors-test/locations/asia-northeast1/connections/big-query-iam-invalid-sa",
      "createTime": "2022-10-07T09:02:31.905048520Z",
      "updateTime": "2022-10-07T09:22:39.993778690Z",
      "connectorVersion": "projects/connectors-test/locations/global/providers/gcp/connectors/bigquery/versions/1",
      "status": {
        "state": "ACTIVE"
      },
      "configVariables": [
        {
          "key": "project_id",
          "stringValue": "connectors-test"
        },
        {
          "key": "dataset_id",
          "stringValue": "testDataset"
        }
      ],
      "authConfig": {},
      "serviceAccount": "564332356444-compute@developer.gserviceaccount.com",
      "serviceDirectory": "projects/abcdefghijk-tp/locations/asia-northeast1/namespaces/connectors/services/runtime",
      "nodeConfig": {
        "minNodeCount": 2,
        "maxNodeCount": 50
      }
    },
....

샘플 출력에서 connectors-test Google Cloud 프로젝트의 서비스 디렉터리 프로젝트 ID는 abcdefghijk-tp입니다.

다른 백엔드 시스템의 PSC 서비스 연결

이전 예시의 단계에 따라 다른 백엔드 시스템의 PSC 서비스 연결을 설정할 수 있습니다. 하지만 5단계와 6단계를 원하는 백엔드 시스템에 맞게 수정해야 합니다. VM 인스턴스에 백엔드 시스템을 설치한 후 인스턴스 그룹에 백엔드 시스템을 추가하고 나머지 단계를 그대로 따릅니다.