파일의 환경 변수를 실제 값으로 교체해 주는 라이브러리 envsub

modolee
CrocusEnergy
Published in
4 min readOct 30, 2020

--

라이브러리를 찾게 된 계기

- 위에서도 언급했지만, app.yaml 파일에 env_variables 항목이 이미 있는 경우에는 정상적으로 동작하지 않습니다.

- 이미 존재하는 환경변수도 함께 사용할 수 있는 방식으로 보완하면 더 좋을 것 같습니다.

  • Google App Engine으로 작업을 하다가 env_variables 이 외에 또! 유동적으로 추가해줘야 될 부분이 생겼습니다. 그래서 ‘스크립트를 범용적으로 수정해야 되나’ 하고 생각하다가, 혹시나 하고 파일에 있는 변수들을 환경변수에 설정 된 값으로 교체해 주는 라이브러리를 검색해 봤습니다.
  • 유레카! 놀랍게도 해당 라이브러리가 존재했습니다. 스타 30개 정도를 받은 라이브러리로 많은 사람들이 사용하는 것 같진 않지만, 제가 원하는 기능은 충분히 동작했습니다.

라이브러리 소개

  • 제가 찾은 라이브러리는 envsub 이라는 npm 라이브러리입니다.
  • 라이브러리 사용 방법은 여러가지 방법이 있지만 저는 가장 간단한 방법으로 사용했습니다.
출처 : https://www.npmjs.com/package/envsub

사용 방법

  • 글로벌 설치 후 실행 (yarn, npm 중 선택해서 실행)
yarn add global envsub
npm add -g envsub
  • 무설치 실행
npx envsub
  • 설치 후 envsub templateFile outputFile 명령을 실행하면 templateFile에 있던 변수가 환경변수의 값으로 교체가 됩니다.

사용 예시

  • 파일 생성 intro.template.txt
This is ${USER_ID}'s velog.
I'm ${NICK_NAME}.
  • 터미널에서 환경변수 지정
export USER_ID=modolee
export NICK_NAME=ironman
  • envsub 실행 (무설치)
npx envsub intro.template.txt intro.txt
  • 결과 확인 intro.txt
This is modolee's velog.
I'm ironman.

응용 방법

  • 이것을 이용하면 Bitbucket Pipelines에서 Google App Engine으로 배포 할 때, 환경변수를 외부에 노출시키지 않고 Bitbucket에 저장해서 사용할 수 있습니다.
  • 템플릿 파일 app.template.yaml
runtime: custom
env: flex
service: auth

resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10

beta_settings:
cloud_sql_instances: ${DB_CONNECTION_NAME}=tcp:${POSTGRES_PORT}

env_variables:
POSTGRES_HOST: ${POSTGRES_HOST}
POSTGRES_PORT: ${POSTGRES_PORT}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  • Bitbucket Pipeline 정의 파일 bitbucket-pipelines.yml
...

deploy: &deploy
step:
name: Deploy to Google App Engine
deployment: gcp
script:
- npx envsub app.template.yaml app.yaml
- cat ./app.yaml
- pipe: atlassian/google-app-engine-deploy:0.7.3
variables:
KEY_FILE: $KEY_FILE
PROJECT: $PROJECT

...
  • 위 처럼 npx envsub app.template.yaml app.yaml 명령을 배포 전에 추가하여 환경변수 값으로 대체 된 값을 가지고 있는 app.yaml 파일을 유동적으로 만들 수 있습니다.
  • 이렇게 되면 env_variables 뿐만 아니라 cloud_sql_instances와 같이 노출되면 꺼림칙 한 정보들을 숨길 수 있습니다.

참고

--

--