Serverless 환경 변수

Node.js에서는 현재 프로세스의 환경 변수에 접근하기 위해 process.env를 사용합니다. AWS Lambda에서는 process.env 객체를 통해 접근할 수 있는 환경 변수를 설정할 수 있습니다.

이제 이를 어떻게 하는지 간단히 살펴보겠습니다.

환경 변수 정의하기

serverless.yml 파일에서 환경 변수를 두 가지 위치에 정의할 수 있습니다. 첫 번째는 functions 섹션입니다:

service: service-name

provider:
  name: aws
  stage: dev

functions:
  hello:
    handler: handler.hello
    environment:
      SYSTEM_URL: http://example.com/api/v1

여기서 SYSTEM_URL은 정의하려는 환경 변수의 이름이고, http://example.com/api/v1은 그 값입니다. 이 환경 변수는 hello Lambda 함수에서 process.env.SYSTEM_URL을 통해 접근할 수 있습니다:

export function hello(event, context, callback) {
  callback(null, { body: process.env.SYSTEM_URL });
}

또한 환경 변수를 provider 섹션에서 전역적으로 정의할 수도 있습니다:

service: service-name

provider:
  name: aws
  stage: dev
  environment:
    SYSTEM_ID: jdoe

functions:
  hello:
    handler: handler.hello
    environment:
      SYSTEM_URL: http://example.com/api/v1

이전과 마찬가지로 SYSTEM_ID 환경 변수는 hello Lambda 함수에서 process.env.SYSTEM_ID를 통해 접근할 수 있습니다. 차이점은 이 환경 변수가 serverless.yml에 정의된 모든 Lambda 함수에서 사용 가능하다는 점입니다.

provider 섹션과 functions 섹션 모두에 동일한 이름의 환경 변수가 정의된 경우, 함수별로 정의된 환경 변수가 우선 적용됩니다. 즉, provider 섹션에 정의된 환경 변수를 functions 섹션에서 재정의할 수 있습니다.

Serverless Framework에서 커스텀 변수 사용하기

Serverless Framework는 변수 개념을 일반화하여 serverless.yml에서 환경 변수를 정의하고 작업하기 쉽게 만들어 줍니다.

예제를 통해 이 기능이 어떻게 동작하는지 간단히 살펴보겠습니다. 다음과 같은 serverless.yml 파일이 있다고 가정해 봅시다.

service: service-name

provider:
  name: aws
  stage: dev

functions:
  helloA:
    handler: handler.helloA
    environment:
      SYSTEM_URL: http://example.com/api/v1/pathA

  helloB:
    handler: handler.helloB
    environment:
      SYSTEM_URL: http://example.com/api/v1/pathB

위 예제에서 helloAhelloB Lambda 함수 모두 SYSTEM_URL 환경 변수를 정의하고 있습니다. 두 함수의 유일한 차이점은 URL이 pathA 또는 pathB로 끝난다는 점입니다. 이 두 함수를 변수 개념을 사용해 병합할 수 있습니다.

변수를 사용하면 serverless.yml 파일의 값을 동적으로 대체할 수 있습니다. ${variableName} 구문을 사용하며, variableName의 값이 삽입됩니다.

이제 실제로 어떻게 동작하는지 살펴보겠습니다. 예제를 다음과 같이 다시 작성하고 단순화할 수 있습니다.

service: service-name

custom:
  systemUrl: http://example.com/api/v1/

provider:
  name: aws
  stage: dev

functions:
  helloA:
    handler: handler.helloA
    environment:
      SYSTEM_URL: ${self:custom.systemUrl}pathA

  helloB:
    handler: handler.helloB
    environment:
      SYSTEM_URL: ${self:custom.systemUrl}pathB

이 과정은 매우 직관적입니다. 먼저 다음 섹션을 추가했습니다.

custom:
  systemUrl: http://example.com/api/v1/

이 코드는 custom 섹션 아래에 systemUrl이라는 변수를 정의합니다. 그런 다음 ${self:custom.systemUrl} 구문을 사용해 이 변수를 참조할 수 있습니다.

이를 환경 변수 SYSTEM_URL: ${self:custom.systemUrl}pathA에서 사용했습니다. Serverless Framework는 이를 파싱하여 self:custom.systemUrl의 값을 삽입하고, 이 값에 pathA를 결합해 원래 값인 http://example.com/api/v1/pathA를 생성합니다.

변수는 CLI 옵션, 외부 YAML 파일 등 다양한 소스에서 참조할 수 있습니다. serverless.yml에서 변수를 사용하는 방법에 대해 더 자세히 알아보려면 여기를 참조하세요.