imprun Platform

환경 변수

클라우드 함수에서 환경 변수 사용하기

환경 변수

클라우드 함수에서 환경 변수를 사용하여 설정을 관리하는 방법을 소개합니다.

환경 변수 접근

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
  }
}

환경 변수 변경 후에는 애플리케이션을 재시작해야 적용됩니다.

다음 단계

환경 변수