환경 변수
클라우드 함수에서 환경 변수 사용하기
환경 변수
클라우드 함수에서 환경 변수를 사용하여 설정을 관리하는 방법을 소개합니다.
환경 변수 접근
process.env 또는 cloud.env를 통해 환경 변수에 접근할 수 있습니다:
import cloud from '@imprun/sdk'
import type { FunctionContext } from '@imprun/sdk'
export default async function (ctx: FunctionContext) {
// process.env 사용
const appId = process.env.APPID
const dbUri = process.env.DB_URI
// cloud.env 사용 (동일)
const apiKey = cloud.env.API_KEY
return {
appId,
hasDb: !!dbUri,
hasApiKey: !!apiKey
}
}커스텀 환경 변수
애플리케이션 설정에서 커스텀 환경 변수를 추가할 수 있습니다:
export default async function (ctx: FunctionContext) {
// 외부 API 키
const openaiApiKey = process.env.OPENAI_API_KEY
const slackWebhook = process.env.SLACK_WEBHOOK_URL
// 앱 설정
const appName = process.env.APP_NAME || 'imprun'
const environment = process.env.NODE_ENV || 'development'
return {
appName,
environment,
hasOpenAI: !!openaiApiKey,
hasSlack: !!slackWebhook
}
}환경별 설정
환경에 따라 다른 설정을 사용할 수 있습니다:
export default async function (ctx: FunctionContext) {
const isDev = process.env.NODE_ENV === 'development'
const isProd = process.env.NODE_ENV === 'production'
const config = {
apiUrl: isDev
? 'http://localhost:3000'
: 'https://api.imprun.dev',
debug: isDev,
maxRetries: isProd ? 5 : 1
}
return config
}API 키 관리
외부 서비스 API 키를 안전하게 사용:
export default async function (ctx: FunctionContext) {
const openaiKey = process.env.OPENAI_API_KEY
if (!openaiKey) {
ctx.response.status(500)
return { error: 'OpenAI API 키가 설정되지 않았습니다' }
}
const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${openaiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'gpt-4',
messages: [{ role: 'user', content: ctx.body.prompt }]
})
})
const data = await response.json()
return data
}데이터베이스 연결
MongoDB 연결은 자동으로 환경 변수를 사용합니다:
export default async function (ctx: FunctionContext) {
// DB_URI는 자동으로 설정됨
const dbUri = process.env.DB_URI
console.log('DB 연결 상태:', !!cloud.mongo.db)
return {
connected: !!cloud.mongo.db,
uri: dbUri?.replace(/\/\/(.+):(.+)@/, '//$1:****@') // 비밀번호 숨김
}
}내장 환경 변수
imprun이 자동으로 제공하는 환경 변수들:
APPID
애플리케이션 고유 ID:
export default async function (ctx: FunctionContext) {
const appId = process.env.APPID
return { appId }
}DB_URI
MongoDB 연결 URI:
export default async function (ctx: FunctionContext) {
const dbUri = process.env.DB_URI
console.log('DB URI가 설정됨:', !!dbUri)
return { hasDb: !!dbUri }
}NODE_ENV
실행 환경 (development, production 등):
export default async function (ctx: FunctionContext) {
const env = process.env.NODE_ENV || 'development'
return {
environment: env,
isDevelopment: env === 'development',
isProduction: env === 'production'
}
}비밀 정보 보호
환경 변수에 저장된 비밀 정보는 절대 클라이언트에 노출하지 마세요!
export default async function (ctx: FunctionContext) {
// ❌ 잘못된 예 - 비밀키 노출
return {
secretKey: process.env.SECRET_KEY // 절대 하지 마세요!
}
// ✅ 올바른 예 - 서버에서만 사용
const secretKey = process.env.SECRET_KEY
const signature = generateSignature(ctx.body, secretKey)
return {
data: ctx.body,
signature // 서명만 반환
}
}.env 파일 (로컬 개발)
로컬 개발 시 .env 파일을 사용할 수 있습니다:
# .env
OPENAI_API_KEY=sk-...
SLACK_WEBHOOK_URL=https://hooks.slack.com/...
APP_NAME=imprun-dev
NODE_ENV=development.env 파일은 .gitignore에 추가하여 버전 관리에서 제외해야 합니다.
타입 안전한 환경 변수
TypeScript에서 환경 변수 타입을 정의할 수 있습니다:
// env.d.ts
declare global {
namespace NodeJS {
interface ProcessEnv {
APPID: string
DB_URI?: string
OPENAI_API_KEY?: string
SLACK_WEBHOOK_URL?: string
NODE_ENV: 'development' | 'production' | 'test'
}
}
}
export {}// 이제 타입 체크가 가능합니다
export default async function (ctx: FunctionContext) {
const appId: string = process.env.APPID // ✅ 타입 안전
const apiKey: string | undefined = process.env.OPENAI_API_KEY // ✅ 타입 안전
return { appId, hasApiKey: !!apiKey }
}환경 변수 검증
시작 시 필수 환경 변수를 검증:
function validateEnv() {
const required = [
'APPID',
'DB_URI',
'OPENAI_API_KEY'
]
const missing = required.filter(key => !process.env[key])
if (missing.length > 0) {
throw new Error(`Missing required environment variables: ${missing.join(', ')}`)
}
}
export default async function (ctx: FunctionContext) {
try {
validateEnv()
// 비즈니스 로직...
return { success: true }
} catch (error) {
ctx.response.status(500)
return { error: error.message }
}
}환경 변수 기본값
환경 변수가 없을 때 기본값 사용:
export default async function (ctx: FunctionContext) {
const port = parseInt(process.env.PORT || '3000')
const maxRetries = parseInt(process.env.MAX_RETRIES || '3')
const timeout = parseInt(process.env.TIMEOUT || '30000')
const logLevel = process.env.LOG_LEVEL || 'info'
return {
port,
maxRetries,
timeout,
logLevel
}
}환경 변수 변경 후에는 애플리케이션을 재시작해야 적용됩니다.