본문 바로가기
클라우드 아키텍처·전략

Cloud SQL 연결이 실패하는 이유는 무엇인가? | GCP 실습 기반 정리

by joe2026 2026. 3. 21.

 

이 글은 GCP Cloud Storage + Cloud SQL 실습을 진행 중인데, 웹서버에서 데이터베이스 연결이 실패하는 문제를 겪는 수강생을 위한 글입니다.
특히 Database connection failed 오류가 발생한 상황을 해결하려는 분에게 맞춰 작성했습니다.
이 글을 통해 Compute Engine에서 Cloud SQL 연결을 성공시키는 핵심 원인과 해결 절차를 실습 기반으로 이해할 수 있습니다.

이 글이 답하는 질문
왜 Compute Engine에서 Cloud SQL 연결이 실패하는가?
 

실습 환경

 

항목 실습 값
Cloud GCP (Google Cloud Platform)
Region Qwiklabs 지정 Region
Zone Qwiklabs 지정 Zone
VM OS Debian GNU/Linux 12
Web Server Apache2 + PHP
DB Cloud SQL (MySQL)
접속 방식 Public IP + Authorized Network
스토리지 Cloud Storage Bucket

먼저 결론부터

이번 실습에서 Cloud SQL 연결 실패의 핵심 원인은 단순했습니다.

Cloud SQL은 기본적으로 외부 접근이 열려 있지 않기 때문에, VM의 외부 IP를 Authorized Network에 등록하지 않으면 접속이 거부됩니다.

여기에 더해 PHP 코드 안에 Cloud SQL의 공인 IP(Public IP)와 데이터베이스 비밀번호가 정확히 들어가지 않으면 웹페이지에서는 계속 연결 오류만 보이게 됩니다.

 강사 설명

강의 자료에서는 다음 흐름으로 실습을 진행합니다.

  • Compute Engine VM에 Apache2와 PHP를 설치한다.
  • Cloud Storage Bucket을 만들고 이미지를 업로드한다.
  • Cloud SQL 인스턴스를 만든 뒤 MySQL 사용자 계정을 생성한다.
  • 웹서버에서 PHP로 Cloud SQL에 접속하도록 구성한다.
  • Cloud Storage 이미지 URL을 웹페이지에 삽입한다.

실습 목표 자체도 Cloud Storage에 이미지를 두고, Compute Engine의 애플리케이션이 Cloud SQL을 참조하도록 구성하는 것입니다.

 내가 이해한 핵심

Cloud SQL 연결 문제는 애플리케이션 코드 문제가 아니라, 대부분 네트워크 허용 설정접속 정보 입력 문제입니다.

즉, 이 실습은 단순히 PHP를 쓰는 문제가 아니라 “클라우드 서비스끼리는 자동으로 연결되지 않는다”는 점을 이해하는 실습입니다.

 내가 실제로 겪은 문제

처음 http://[VM 외부IP]/index.php로 접속했을 때, 페이지는 열렸지만 아래와 같은 식의 데이터베이스 연결 오류가 나왔습니다.

Database connection failed: SQLSTATE[HY000] [2002] Connection refused

웹서버와 PHP는 이미 설치되어 있었기 때문에 화면 자체는 떴습니다. 하지만 DB 연결 부분에서 바로 실패한 것입니다.

실습 증거 1: VM 생성 시 웹서버 설치

Compute Engine VM 생성 시 Startup Script(시작 스크립트)로 Apache2와 PHP를 설치했습니다.

apt-get update
apt-get install apache2 php php-mysql -y
service apache2 restart

이 단계가 정상이라면 브라우저에서 VM 외부 IP로 접근할 수 있습니다. 즉, 웹서버가 뜨지 않는 문제와 DB 연결 실패 문제는 구분해서 봐야 합니다.

실습 증거 2: PHP 연결 코드

웹 루트 디렉터리인 /var/www/html에서 index.php를 만들고 아래처럼 DB 연결 코드를 넣었습니다.

<?php
$dbserver = "CLOUDSQLIP";
$dbuser = "blogdbuser";
$dbpassword = "DBPASSWORD";

try {
  $conn = new PDO("mysql:host=$dbserver;dbname=mysql", $dbuser, $dbpassword);
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  echo "Connected successfully";
} catch(PDOException $e) {
  echo "Database connection failed:: " . $e->getMessage();
}
?>

처음에는 CLOUDSQLIPDBPASSWORD가 실제 값으로 바뀌지 않은 상태였기 때문에 당연히 연결이 실패했습니다.

실습 증거 3: Authorized Network 설정

Cloud SQL 인스턴스는 Public IP를 사용하더라도 아무 IP에서나 접근하게 두지 않습니다. 따라서 VM의 외부 IP(External IP)를 아래처럼 등록해야 했습니다.

Authorized Network
[VM External IP]/32

실습 자료에서도 Cloud SQL의 Connections 메뉴에서 네트워크를 추가하고, VM의 외부 IP 뒤에 /32를 붙여야 한다고 안내합니다. :contentReference[oaicite:0]{index=0}

중요
여기서는 VM의 내부 IP(Internal IP)가 아니라 외부 IP(External IP)를 사용해야 했습니다. 실습 환경이 Public IP 기반 연결이기 때문입니다.

트러블슈팅

문제 증상

브라우저에서 http://[VM 외부IP]/index.php 접속 시 Database connection failed 메시지가 출력됩니다.

원인 분석

  1. Cloud SQL은 기본적으로 외부 접근을 허용하지 않습니다.
  2. VM의 외부 IP가 Authorized Network에 등록되지 않았습니다.
  3. PHP 파일에 Cloud SQL Public IP와 DB 비밀번호가 실제 값으로 입력되지 않았습니다.

확인 방법

  1. Compute Engine에서 VM의 External IP를 확인합니다.
  2. Cloud SQL > Connections > Networking에서 Authorized Network 설정을 확인합니다.
  3. index.php에서 CLOUDSQLIP, DBPASSWORD가 실제 값으로 바뀌었는지 확인합니다.
  4. 수정 후 Apache를 재시작했는지 확인합니다.

해결 방법

제가 실제로 적용한 해결 절차는 아래와 같습니다.

  1. Cloud SQL에서 Public IP를 확인합니다.
  2. Cloud SQL > Connections > Networking에서 Authorized Network를 추가합니다.
    [VM External IP]/32
  3. index.php에서 아래 부분을 실제 값으로 바꿉니다.
    $dbserver = "34.xxx.xxx.xxx";
    $dbuser = "blogdbuser";
    $dbpassword = "실제_비밀번호";
  4. Apache를 재시작합니다.
    sudo service apache2 restart

해결 결과

브라우저를 다시 열었을 때 페이지에 Connected successfully가 출력되면 연결이 성공한 것입니다.
http://[VM External IP]/index.php
→ Connected successfully

재발 방지 방법

  • Public IP 기반 연결에서는 반드시 Authorized Network를 먼저 확인합니다.
  • 실습 중에는 VM 외부 IP와 Cloud SQL Public IP를 따로 메모해 둡니다.
  • 코드 수정 후 Apache 재시작을 습관처럼 수행합니다.
  • 실무 환경에서는 비밀번호를 소스코드에 직접 넣지 않고 Secret Manager를 사용합니다.

Cloud Storage 이미지 연동까지 확인한 이유

이번 실습은 DB 연결만 보는 것이 아니라, Cloud Storage에 올린 이미지를 웹페이지에서 불러오는 흐름도 함께 확인합니다. 이 부분이 중요한 이유는 웹 애플리케이션에서 정적 파일(이미지)과 데이터베이스를 분리해 다루는 기본 개념을 익힐 수 있기 때문입니다.

실습에서는 Cloud Storage Bucket을 만들고 이미지를 업로드한 뒤, 공개 링크(Public link)를 HTML의 img 태그에 넣습니다. Cloud Storage Bucket 생성과 이미지 업로드는 실습 목표에도 포함되어 있습니다. :contentReference[oaicite:1]{index=1}

<img src='https://storage.googleapis.com/프로젝트ID/my-excellent-blog.png'>

이 구성을 마치면 웹페이지는 다음 두 가지를 동시에 수행하게 됩니다.

  • Cloud SQL에 접속해 DB 연결 상태를 확인한다.
  • Cloud Storage에 저장된 이미지를 불러와 화면에 보여준다.

이번 실습에서 배운 핵심 구조

구성 요소 역할
Compute Engine Apache + PHP가 동작하는 웹서버
Cloud SQL MySQL 관리형 데이터베이스
Authorized Network 어떤 IP가 Cloud SQL에 접속 가능한지 제한
Cloud Storage 이미지 같은 정적 파일 저장

결론

이 문제를 해결하는 핵심 원칙 1줄

Cloud SQL 연결 실패의 가장 흔한 원인은 네트워크 허용 설정과 접속 정보 미입력이다.

실무 적용 시 주의점

이번 실습은 학습 목적이라 Public IP와 Authorized Network 방식으로 빠르게 연결했습니다. 하지만 실제 서비스에서는 더 안전한 구성이 필요합니다.

  • Cloud SQL Private IP 사용
  • VPC 내부 통신 구성
  • Secret Manager로 비밀번호 분리 저장
  • 최소 권한(Least Privilege) 기준으로 접근 통제

다음 학습 단계

  • Cloud SQL Private IP 연결 실습
  • Secret Manager를 이용한 DB 비밀번호 분리
  • 방화벽과 네트워크 ACL 개념 비교
  • 3-Tier 아키텍처에서 Web, App, DB 분리 설계

 

 

 

 

 


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 클라우드학습기