예시: Cloud SQL 인스턴스의 비공개 연결
이 페이지에서는 Private Service Connect(PSC)를 사용하여 비공개 서비스 액세스(PSA)가 사용 설정된 Cloud SQL 인스턴스 및 Integration Connectors 런타임 간의 연결을 설정하는 방법을 예시를 통해 설명합니다. Cloud SQL 인스턴스는 다음 유형 중 하나일 수 있습니다.
고려사항
PSC 서비스 연결을 만들 때는 다음 핵심 사항을 고려하세요.
- PSC 서비스 연결과 부하 분산기는 같은 VPC 내 서로 다른 서브넷에서 생성됩니다. 특히 서비스 연결은 항상 NAT 서브넷에서 생성됩니다.
- 부하 분산기와 상태 점검 프로브에서 들어오는 트래픽에 필요하므로 SOCKS5 프록시 서버가
0.0.0.0:<port>
IP 주소에 바인딩되어야 합니다. 자세한 내용은 상태 점검을 참조하세요. - 부하 분산기와 상태 점검 프로브의 트래픽을 같은 포트로 보내야 합니다.
- 트래픽 흐름을 용이하게 하도록 방화벽 규칙을 구성하세요.
인그레스 규칙
- PSC 서비스 연결 서브넷에서 들어오는 트래픽이 ILB 서브넷에 도달해야 합니다.
- ILB 서브넷 내에서 ILB는 트래픽을 SOCKS5 프록시 서버로 보낼 수 있어야 합니다.
- 상태 점검 프로브가 SOCKS5 프록시 서버에 액세스할 수 있어야 합니다. Google Cloud 상태 점검 프로브에는 고정 IP 범위(
35.191.0.0/16, 130.211.0.0/22
)가 있습니다. 따라서 이러한 IP는 SOCKS 프록시 서버에 트래픽을 전송할 수 있습니다.
이그레스 규칙
이그레스 트래픽은 특정 거부 규칙이 구성되지 않는 한 Google Cloud 프로젝트에서 기본적으로 사용 설정됩니다.
- PSC 서비스 연결 및 부하 분산기와 같은 모든 Google Cloud 구성요소는 같은 리전에 있어야 합니다.
- 백엔드 시스템이 공용 네트워크에 대해 열려 있으면 보안 문제가 발생할 수 있으므로 열려 있으면 안 됩니다. 하지만 다음 시나리오에서는 SOCKS5 프록시 서버가 트래픽을 허용하는지 확인합니다.
- 패스스루 부하 분산기(L4 TCP/UDP ILB): PSC 서비스 연결의 NAT IP 요청이 SOCKS5 프록시 서버에 도달할 수 있어야 합니다. 이러한 NAT IP는 자동으로 생성됩니다. 따라서 서비스 연결이 있는 전체 NAT 서브넷의 IP 범위를 허용해야 합니다. 자세한 내용은 Private Service Connect 서브넷을 참조하세요.
- 프록시 기반/HTTP(S4) 부하 분산기(L4 프록시 ILB, L7 ILB): 모든 새 요청은 부하 분산기에서 시작됩니다. 따라서 SOCKS5 프록시 서버에서 VPC 네트워크의 프록시 서브넷에서 들어오는 요청을 수락해야 합니다. 자세한 내용은 Envoy 기반 부하 분산기용 프록시 전용 서브넷을 참조하세요.
Cloud SQL 인스턴스의 PSC 설정
Integration Connectors는 Cloud SQL 인증 프록시를 사용하여 Cloud SQL 인스턴스에 연결합니다. Cloud SQL 인증 프록시는 SOCKS5 프록시를 통한 연결 기능을 지원하므로 암호화된 트래픽을 Cloud SQL 인증 프록시에서 대상 Cloud SQL 인스턴스로 전달할 수 있습니다. 따라서 비공개 Cloud SQL 인스턴스에 연결하려면 SOCKS5 프록시 서버가 필요합니다.
다음 다이어그램에서는 샘플 Cloud SQL 인스턴스 설정에 PSC 서비스 연결이 구성된 후에 Google Cloud 프로젝트가 어떻게 표시되는지를 보여줍니다.
이 예시에서는 PSC가 Cloud SQL 인스턴스에 안전하게 연결할 수 있도록 SOCKS5 프록시 서버가 서비스 연결을 통해 노출됩니다. SOCKS 프록시 서버는 비공개 서비스 액세스를 통해 Cloud SQL 인스턴스에 액세스할 수 있습니다. SOCKS5 프록시 서버는 비관리형 Compute Engine 인스턴스 그룹에 있으며 예상 인그레스 트래픽을 기준으로 프록시 인스턴스 수를 결정할 수 있습니다.
예시에서 트래픽이 어떻게 흐르나요?
- Integration Connectors는 서비스 연결에 요청을 보냅니다.
- 서비스 연결은 요청을 L4 ILB로 전달합니다.
- L4 ILB는 요청을 SOCKS5 프록시 서버로 보냅니다.
ILB는 전달 규칙을 갖추고 있으며 포트 전달을 실행합니다. 기본적으로 SOCKS5 프록시는 1080 포트에서 리슨합니다. 그러나 SOCKS5 프록시 서버가 다른 포트에서 리슨하는 경우 ILB에서 리슨할 수 있도록 해당 포트도 열어야 합니다.
- SOCKS5 프록시 서버는 요청을 Cloud SQL 인스턴스로 전달합니다.
시작하기 전에
샘플 시나리오용 PSC 서비스 연결을 만들기 전에 다음 태스크를 수행하세요.
- gcloud CLI를 설치합니다.
- Google Cloud 프로젝트에 Compute Engine API 및 Service Networking 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를 SOCKS5 프록시 서버가 실행되는 기본 포트인 1080으로 바꿉니다.
- 이 샘플 시나리오를 시도할 때 새 VPC 네트워크를 만들어 사용하는 것이 좋습니다. 시나리오를 테스트한 후에는 VPC 네트워크와 기타 리소스를 삭제할 수 있습니다.
- 생성된 기존 연결이 최소 하나 이상 있어야 합니다. 모든 유형의 연결이 허용됩니다. 기존 연결이 있으면 Integration Connectors 런타임에서 서비스 디렉터리의 프로젝트 ID를 가져올 수 있습니다. 이 프로젝트 ID는 PSC 서비스 연결을 만드는 데 필요합니다.
PSC 서비스 연결 만들기
샘플 시나리오에 대해 PSC 서비스 연결을 만들려면 다음 태스크를 수행하세요.
- VPC 네트워크 및 필수 서브넷을 만듭니다.
- VPC 네트워크를 만드세요.
gcloud compute networks create VPC_NETWORK \ --project=PROJECT_ID --subnet-mode=custom --mtu=1460 \ --bgp-routing-mode=regional
- 서브넷 1을 추가합니다.
gcloud compute networks subnets create SUBNET_NAME_1 \ --network=VPC_NETWORK --range=SUBNET_RANGE_1 \ --purpose=PRIVATE_SERVICE_CONNECT
이 명령어는
Subnet-1
을 PSC 서비스 연결을 호스팅하는 데만 사용되는 NAT 서브넷으로 만듭니다. 이 NAT 서브넷에서는 다른 서비스를 호스팅할 수 없습니다. - 서브넷 2를 추가합니다.
gcloud compute networks subnets create SUBNET_NAME_2 \ --network=VPC_NETWORK --range=SUBNET_RANGE_2
- VPC 네트워크를 만드세요.
- 비공개 Cloud SQL 인스턴스를 만듭니다.
- 비공개 서비스 액세스를 구성합니다.
- IP 주소 범위를 할당합니다.
gcloud compute addresses create google-managed-services-VPC_NETWORK \ --global --purpose=VPC_PEERING --prefix-length=16 \ --network=projects/PROJECT_ID/global/networks/VPC_NETWORK
- 비공개 연결을 만듭니다.
gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=google-managed-services-VPC_NETWORK \ --network=VPC_NETWORK \ --project=PROJECT_ID
- IP 주소 범위를 할당합니다.
- 비공개 IP로 Cloud SQL 인스턴스를 만듭니다.
gcloud beta sql instances create \ INSTANCE_NAME \ --database-version=DATABASE_VERSION \ --cpu=NUMBER_OF_CPUs \ --memory=MEMORY \ --zone=ZONE \ --root-password=ROOT_PASSWORD \ --network=projects/PROJECT_ID/global/networks/VPC_NETWORK \ --no-assign-ip \ --allocated-ip-range-name=google-managed-services-VPC_NETWORK
만들려는 인스턴스 유형에 따라
DATABASE_VERSION
을 지정합니다. MySQL, PostgreSQL 또는 SQL Server 유형의 인스턴스를 만들 수 있습니다. 지원되는 모든 데이터베이스 버전 목록은 SQL 데이터베이스 버전을 참조하세요.이 명령어는 Cloud SQL 인스턴스의 기본 사용자를 만듭니다. 다음은 다양한 Cloud SQL * 인스턴스에 대해 생성되는 기본 사용자입니다.
- MySQL용 Cloud SQL -
root
- SQL Server용 Cloud SQL -
sqlserver
- PostgreSQL용 Cloud SQL -
postgres
- MySQL용 Cloud SQL -
- (선택사항) 기본 사용자를 사용하지 않으려면 새로 만든 Cloud SQL 인스턴스의 새 사용자를 만듭니다.
gcloud sql users create USER --host=% --instance=INSTANCE_NAME \ --password=PASSWORD
다음 단계에서 만들 데이터베이스에 액세스하는 데 필요한 모든 권한이 사용자에게 있는지 확인하세요.
- 새로 만든 Cloud SQL 인스턴스에서 데이터베이스를 만듭니다.
gcloud sql databases create DATABASE_NAME \ --instance=INSTANCE_NAME
- 비공개 서비스 액세스를 구성합니다.
- Cloud NAT를 구성합니다.
- 간단한 라우터를 만듭니다.
gcloud compute routers create NAT_ROUTER_NAME \ --network=VPC_NETWORK
- 네트워크 주소 변환을 구성합니다.
gcloud compute routers nats create NAT_GATEWAY_NAME \ --router=NAT_ROUTER_NAME \ --auto-allocate-nat-external-ips \ --nat-all-subnet-ip-ranges
- 간단한 라우터를 만듭니다.
- SOCKS5 프록시 서버를 실행하는 데 필요한 Compute Engine VM 인스턴스를 만듭니다.
- 프록시 인스턴스 1을 만듭니다.
gcloud compute instances create PROXY_INSTANCE_1 \ --project=PROJECT_ID \ --network-interface=network-tier=PREMIUM,subnet=SUBNET_NAME_2,no-address
요구사항에 따라 필요한 만큼 VM 인스턴스를 만들 수 있습니다.
- 프록시 인스턴스 1을 만듭니다.
- VM 인스턴스에 SSH를 허용하는 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create FIREWALL_RULE_NAME_SSH \ --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:22
- SOCKS5 프록시를 설치합니다.
SOCKS5 프록시 서버를 설치하고 구성하는 자세한 단계는 이 문서에서 다루지 않으며, 원하는 SOCKS5 프록시를 설치할 수 있습니다. 다음 단계에서는 Dante SOCKS5 프록시 서버를 설치하고 구성하는 방법을 보여줍니다.
- SSH를 통해 VM 인스턴스에 연결합니다.
gcloud compute ssh \ --tunnel-through-iap \ PROXY_INSTANCE_1
- Dante SOCKS5 프록시 서버를 설치합니다.
sudo apt update sudo apt install dante-server
- 서버 인터페이스를 확인합니다.
sudo ip a
- Dante 구성의 백업을 만듭니다.
sudo mv /etc/danted.conf /etc/danted.conf.bak
- 새 Dante 구성 파일을 만듭니다.
sudo nano /etc/danted.conf
- 다음 구성을 구성 파일에 복사합니다.
logoutput: /var/log/socks.log # Bind the server to the 0.0.0.0 IP address to allow traffic # traffic from the load balancer and the health check probes. internal: 0.0.0.0 port = 1080 external: ens4 clientmethod: none socksmethod: none user.privileged: root user.notprivileged: nobody client pass { from: 0.0.0.0/0 to: 0.0.0.0/0 log: error connect disconnect } client block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error } socks pass { from: 0.0.0.0/0 to: 0.0.0.0/0 log: error connect disconnect } socks block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error }
- Dante 서버를 다시 시작하고 상태를 확인합니다.
sudo systemctl restart danted sudo systemctl status danted
- VM 인스턴스를 종료합니다.
exit
- SSH를 통해 VM 인스턴스에 연결합니다.
- 비관리형 인스턴스 그룹을 설정합니다.
- 비관리형 인스턴스 그룹을 만듭니다.
gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME
- 3단계에서 만든 VM 인스턴스를 그룹에 추가합니다.
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME \ --instances=PROXY_INSTANCE_1
- 비관리형 인스턴스 그룹을 만듭니다.
- 상태 점검 프로브를 만들고 프로브의 트래픽을 허용합니다.
- 상태 점검 프로브를 만듭니다.
gcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --port BACKEND_SERVER_PORT --region=REGION
이 명령어에서 BACKEND_SERVER_PORT를 SOCKS5 프록시 서버가 실행되는 기본 포트인 1080으로 설정합니다.
- 프로브에서 들어오는 트래픽을 허용하는 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create FIREWALL_RULE_NAME_HEALTHCHECK \ --direction=INGRESS --priority=1000 --network=VPC_NETWORK --allow=tcp:BACKEND_SERVER_PORT \ --source-ranges=35.191.0.0/16,130.211.0.0/22
- 상태 점검 프로브를 만듭니다.
- L4 내부 부하 분산기를 만들고 부하 분산기에서 들어오는 트래픽을 허용합니다.
- 백엔드 서비스를 만듭니다.
gcloud compute backend-services create BACKEND_SERVICE \ --load-balancing-scheme=internal --protocol=tcp --health-checks=HEALTH_CHECK_NAME \ --health-checks-region=REGION
- 인스턴스 그룹을 백엔드 서비스에 추가합니다.
gcloud compute backend-services add-backend BACKEND_SERVICE \ --instance-group=INSTANCE_GROUP_NAME \ --instance-group-zone=ZONE
- 전달 규칙을 만듭니다.
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
-
부하 분산기에서 인스턴스 그룹으로 흐르는 내부 트래픽을 허용하는 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create FIREWALL_RULE_NAME_INTERNAL \ --direction=INGRESS --priority=1000 --network=VPC_NETWORK \ --action=ALLOW --rules=all --source-ranges=SUBNET_RANGE_2
- 백엔드 서비스를 만듭니다.
- PSC 서비스 연결을 만듭니다.
- PSC 서비스 연결에서 이전 단계에서 만든 내부 부하 분산기로 흐르는 트래픽을 허용하는 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create FIREWALL_RULE_NAME_SA \ --direction=INGRESS --priority=1000 --network=VPC_NETWORK \ --allow=tcp:BACKEND_SERVER_PORT --source-ranges=SUBNET_RANGE_1
- 명시적 승인으로 서비스 연결을 만듭니다.
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 가져오기를 참조하세요.
- PSC 서비스 연결에서 이전 단계에서 만든 내부 부하 분산기로 흐르는 트래픽을 허용하는 방화벽 규칙을 만듭니다.
- 엔드포인트 연결을 만듭니다.
엔드포인트 연결은 PSC 서비스 연결의 인터페이스라고 생각하면 됩니다. PSC 서비스 연결을 직접 사용하여 비공개 연결을 구성할 수 없습니다. 엔드포인트 연결을 통해서만 PSC 서비스 연결에 액세스할 수 있습니다. IP 주소 또는 호스트 이름으로 엔드포인트 연결을 만들 수 있습니다. 엔드포인트 연결을 만든 후 비공개 연결용 커넥터를 구성할 때 해당 연결을 사용할 수 있습니다. 자세한 내용은 엔드포인트 연결 만들기를 참조하세요.
- PSC 설정을 확인합니다.
이 튜토리얼에서 볼 수 있듯이 Cloud SQL 연결을 만들고 SOCKS5 프록시 서버를 설정하여 비공개 연결을 확인할 수 있습니다. 연결 만들기에 대한 자세한 단계는 특정(MySQL용 Cloud SQL, PostgreSQL용 Cloud SQL 또는 SQL Server용 Cloud SQL) 커넥터 문서를 참고하세요. 연결을 만들 때
Destinations
섹션(5단계)에서Destination type
을Host address
로 선택한 다음 SOCKS5 프록시 서버 세부정보에서 엔드포인트 연결의 IP 주소 또는 호스트 이름을 입력합니다. SOCKS5 프록시 서버에 다른 포트를 구성하지 않는 한 포트 값을1080
으로 설정합니다. 연결이 성공적으로 생성되면 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
입니다.