본문으로 건너뛰기

클라우드 설정 (CloudConfig)

개요​

CloudConfig는 클라우드 서비스 프로바이더 관련 설정을 관리합니다. GCP(Google Cloud Platform)에 배포된 애플리케이션에 필요한 프로젝트 ID, 리전, 스토리지 버킷 등의 설정을 정의합니다.

구성 요소​

핵심 설정 값​

설정 키환경 변수타입필수 여부기본값설명
providerCLOUD_PROVIDERstring선택'GCP'클라우드 서비스 프로바이더 (현재는 GCP만 지원)
projectIdCLOUD_PROJECT_IDstring필수-GCP 프로젝트 ID
regionCLOUD_REGIONstring선택'asia-northeast3'GCP 리전 (서울: asia-northeast3)
bucketNameGCS_BUCKET_NAMEstring필수(cloudrun)-Google Cloud Storage 버킷 이름

추가 설정 값​

설정 키환경 변수타입필수 여부기본값설명
credentialsGOOGLE_APPLICATION_CREDENTIALSstring선택-GCP 서비스 계정 인증 정보 파일 경로 (로컬 개발 환경용)
useManagedIdentityCLOUD_USE_MANAGED_IDENTITYboolean선택true(cloudrun)관리형 서비스 계정을 사용할지 여부

사용 예시​

구성 정의​

// libs/core/config/src/lib/namespaces/cloud.config.ts
import { registerAs } from '@nestjs/config';

export const cloudConfig = registerAs('cloud', () => ({
provider: process.env.CLOUD_PROVIDER || 'GCP',
projectId: process.env.CLOUD_PROJECT_ID,
region: process.env.CLOUD_REGION || 'asia-northeast3',
bucketName: process.env.GCS_BUCKET_NAME,
credentials: process.env.GOOGLE_APPLICATION_CREDENTIALS,
useManagedIdentity: process.env.CLOUD_USE_MANAGED_IDENTITY === 'true',
}));

유효성 검증 스키마​

// libs/core/config/src/lib/schemas/cloud.schema.ts
import * as Joi from 'joi';

export const cloudConfigSchema = {
CLOUD_PROVIDER: Joi.string().default('GCP'),
CLOUD_PROJECT_ID: Joi.string().required(),
CLOUD_REGION: Joi.string().default('asia-northeast3'),
GCS_BUCKET_NAME: Joi.string().when('RUNTIME_ENV', {
is: 'cloudrun',
then: Joi.string().required(),
otherwise: Joi.string().optional(),
}),
GOOGLE_APPLICATION_CREDENTIALS: Joi.string().optional(),
CLOUD_USE_MANAGED_IDENTITY: Joi.boolean().default(false),
};

서비스에서 사용​

// 클라우드 설정 사용 예시
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@core/config';
import { Storage } from '@google-cloud/storage';

@Injectable()
export class StorageService {
private storage: Storage;
private bucketName: string;

constructor(private readonly configService: ConfigService) {
// 클라우드 설정 로드
const cloudConfig = this.configService.getNamespace<{
projectId: string;
region: string;
bucketName: string;
credentials?: string;
}>('cloud');

// GCS 클라이언트 초기화
this.storage = new Storage({
projectId: cloudConfig.projectId,
keyFilename: cloudConfig.credentials,
});

this.bucketName = cloudConfig.bucketName;
}

async uploadFile(fileName: string, fileBuffer: Buffer): Promise<string> {
const bucket = this.storage.bucket(this.bucketName);
const file = bucket.file(fileName);

await file.save(fileBuffer, {
contentType: 'application/octet-stream',
});

// 공개 URL 반환
return `https://storage.googleapis.com/${this.bucketName}/${fileName}`;
}
}

환경별 설정 가이드​

로컬 개발 환경​

로컬 개발 환경에서는 서비스별 JSON 설정 파일을 통해 클라우드 설정을 구성합니다. 서비스 계정 키 파일은 상대 경로로 지정할 수 있습니다.

// cloudrun-deploy/secret/local/dev/dta-wide-api.json
{
"CLOUD_PROVIDER": "GCP",
"CLOUD_PROJECT_ID": "dta-cloud-de-dev",
"CLOUD_REGION": "europe-west3",
"GCS_BUCKET_NAME": "dtx-llm",
"GOOGLE_APPLICATION_CREDENTIALS": "./credentials/dta-wide-api-credentials.json",
"CLOUD_USE_MANAGED_IDENTITY": "false"
}

클라우드 런 환경​

클라우드 런 환경에서는 관리형 서비스 계정을 사용하여 GCP 서비스에 접근합니다. 설정은 서비스별 JSON 파일에 정의하며, 배포 프로세스에서 Cloud Run 서비스의 환경 변수로 자동 설정됩니다.

// cloudrun-deploy/secret/cloudrun/prod/dta-wide-api.json
{
"CLOUD_PROVIDER": "GCP",
"CLOUD_PROJECT_ID": "dta-cloud-de-prod",
"CLOUD_REGION": "europe-west3",
"GCS_BUCKET_NAME": "dtx-llm-prod",
"CLOUD_USE_MANAGED_IDENTITY": "true"
}

주의 사항​

  • CLOUD_PROJECT_ID는 반드시 설정해야 하며, 실제 GCP 프로젝트 ID와 일치해야 합니다.
  • 로컬 개발 환경에서는 GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정하여 서비스 계정 키 파일을 지정해야 합니다.
  • 클라우드 런 환경에서는 서비스에 적절한 IAM 권한이 부여된 서비스 계정을 연결해야 합니다.
  • 민감한 데이터를 저장하는 경우, 스토리지 버킷에 적절한 액세스 제어가 설정되어 있어야 합니다.