이 글은 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 연결 실패의 핵심 원인은 단순했습니다.
여기에 더해 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을 참조하도록 구성하는 것입니다.
내가 이해한 핵심
즉, 이 실습은 단순히 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();
}
?>
처음에는 CLOUDSQLIP와 DBPASSWORD가 실제 값으로 바뀌지 않은 상태였기 때문에 당연히 연결이 실패했습니다.
실습 증거 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 메시지가 출력됩니다.
원인 분석
- Cloud SQL은 기본적으로 외부 접근을 허용하지 않습니다.
- VM의 외부 IP가 Authorized Network에 등록되지 않았습니다.
- PHP 파일에 Cloud SQL Public IP와 DB 비밀번호가 실제 값으로 입력되지 않았습니다.
확인 방법
- Compute Engine에서 VM의 External IP를 확인합니다.
- Cloud SQL > Connections > Networking에서 Authorized Network 설정을 확인합니다.
index.php에서CLOUDSQLIP,DBPASSWORD가 실제 값으로 바뀌었는지 확인합니다.- 수정 후 Apache를 재시작했는지 확인합니다.
해결 방법
제가 실제로 적용한 해결 절차는 아래와 같습니다.
- Cloud SQL에서 Public IP를 확인합니다.
- Cloud SQL > Connections > Networking에서 Authorized Network를 추가합니다.
[VM External IP]/32 index.php에서 아래 부분을 실제 값으로 바꿉니다.$dbserver = "34.xxx.xxx.xxx"; $dbuser = "blogdbuser"; $dbpassword = "실제_비밀번호";- Apache를 재시작합니다.
sudo service apache2 restart
해결 결과
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줄
실무 적용 시 주의점
이번 실습은 학습 목적이라 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 분리 설계

'클라우드 아키텍처·전략' 카테고리의 다른 글
| Azure PaaS로 구축하는 3-Tier 이미지 업로드 웹 서비스 — 엔터프라이즈 아키텍처 완전 가이드 (0) | 2026.03.18 |
|---|---|
| Azure에서 FE/BE VM 분리했을 때 외부 접속이 안 되는 이유와 Reverse Proxy 설정법 (0) | 2026.03.02 |
| 프라이빗 EC2에 SSH 없이 접속하는 법 — NAT Gateway 끊고 SSM으로 바꾼 이유 (0) | 2026.02.23 |
| 멀티클라우드 아키텍처가 머릿속에 안 그려질 때 — AWS 실습으로 직접 부딪혀봤다 (0) | 2026.02.19 |
| AWS 배우면서 Azure 시작한 멀티클라우드 입문자의 현실 기록 (0) | 2026.02.19 |