- cloud-securitydevopsenv-filegcp-secret-managergoogle-cloud
GCP Secret Manager로 API Key와 .env 파일 안전하게 관리하는 방법
API_KEY나 HASH 값이 포함된 파일 또는 .env 파일은 절대로 GitHub에 커밋해서는 안 된다. 따라서 인터넷 상의 deployment 환경에서는 환경 변수를 별도로 설정하거나 파일을 생성해야 하는 번거로움이 있다. Google Cloud Platform(GCP)에서 제공하는 Secret Manager를 사용하면 이러한 key-value 값을 클라우드에 안전하게 저장하고, VM 인스턴스에서 명령어를 통해 필요할 때 읽어올 수 있다.
secrets 설정은 로컬, VM은 읽기전용
로컬에서 Secret을 생성·관리하고, VM 인스턴스에서는 접근 권한만 부여해 읽기 전용으로 사용한다.
로컬 gcloud 설정
로컬에 gcloud 를 설치하면 Secret을 생성·관리할 수 있다. OS 별 설치 방법은 Google Cloud CLI 설치 문서를 참조한다. MacOS 경우 Homebrew로 설치 가능하다.
Homebrew 로 설치
Secret Manager를 사용하기 위해 로컬 환경에 gcloud CLI를 설치한다.
brew update && brew install --cask google-cloud-sdkgcloud 초기화 (인증 + 프로젝트 설정)
gcloud 초기화 과정에서 사용자 인증과 기본 프로젝트를 설정한다.
gcloud init
#또는 다음 두 단계를 통해 동일한 설정을 할 수 있다.
# 인증
gcloud auth login
# 프로젝트 설정(GCP 프로젝트 ID)
gcloud config set project <프로젝트 ID>secrets 설정 및 값 저장
# Secret 생성 (이미 존재하면 에러가 발생하므로 무시해도 됨)
gcloud secrets create API_ID --replication-policy="automatic"
# 값 저장 (예시 값)
echo -n "12345678" | gcloud secrets versions add API_ID --data-file=-
# 또는
# 생성 + 저장을 동시에 수행 (모두 예시 값)
gcloud secrets create API_ID --data-file=- <<< "12345678"
gcloud secrets create API_HASH --data-file=- <<< "abcdef1234567890abcdef1234567890"
gcloud secrets create ADMIN_USERNAME --data-file=- <<< "admin_user"
gcloud secrets create ADMIN_PASSWORD_HASH --data-file=- <<< '$2b$10$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
gcloud secrets create TUNNEL_TOKEN --data-file=- <<< 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.XXXX.YYYY'VM 인스턴스에서 secret 값 읽기
VM에서는 Secret을 직접 생성하지 않고, 권한을 통해 읽기만 수행한다.
Secret Manager API 를 활성화
프로젝트 단위로 Secret Manager API를 활성화해야 한다. GCP 콘솔 project > security > secret manager 에서 Enable 한다.
서비스 계정 권한지정
VM에 연결된 서비스 계정에 Secret 접근을 위해 roles/secretmanager.secretAccessor 권한을 추가한다.
VM에서 Secret 읽기
VM에는 gcloud가 기본 설치되어 있으며, CLI로 Secret 값을 조회할 수 있다.
# VM 내부에서 실행
gcloud secrets versions access latest --secret="API_ID"만약 권한이나 설정 문제로 오류가 발생한다면, VM에서 gcloud 캐시를 삭제한 뒤 다시 시도한다.
# gcloud 설정 및 캐시 삭제 (설정값들이 초기화됩니다)
rm -rf ~/.config/gcloudgcloud secrets 을 이용한 .env 파일 생성 스크립트
VM에서 Secret Manager 값을 읽어 자동으로 .env 파일을 생성하는 스크립트 예시이다.
#!/bin/bash
# source로 실행 시 set -e를 적용하지 않음 (터미널 종료 방지)
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
set -e
fi
echo "🔐 GCP Secret Manager에서 .env 파일 생성 중..."
ENV_FILE=".env"
if [ -f "$ENV_FILE" ]; then
BACKUP_FILE="${ENV_FILE}.backup.$(date +%Y%m%d_%H%M%S)"
echo "📦 기존 .env 파일 백업: $BACKUP_FILE"
cp "$ENV_FILE" "$BACKUP_FILE"
fi
{
echo "# Generated from GCP Secret Manager at $(date)"
echo "# DO NOT commit this file to git"
echo ""
echo "# API Credentials"
echo "API_ID='$(gcloud secrets versions access latest --secret="API_ID")'"
echo "API_HASH='$(gcloud secrets versions access latest --secret="API_HASH")'"
echo ""
echo "# Web UI Authentication"
echo "ADMIN_USERNAME='$(gcloud secrets versions access latest --secret="ADMIN_USERNAME")'"
echo "ADMIN_PASSWORD_HASH='$(gcloud secrets versions access latest --secret="ADMIN_PASSWORD_HASH")'"
echo ""
echo "# Cloudflare Tunnel"
echo "TUNNEL_TOKEN='$(gcloud secrets versions access latest --secret="TUNNEL_TOKEN")'"
} > "$ENV_FILE"
chmod 600 "$ENV_FILE"
echo "✅ .env 파일 생성 완료: $ENV_FILE"위 방식을 이용해 GitHub에 비밀 정보를 노출하지 않으면서도, 로컬 개발 환경과 VM 배포 환경을 일관되게 관리할 수 있다.
(끝)