파일의 환경 변수를 실제 값으로 교체해 주는 라이브러리 envsub
Published in
4 min readOct 30, 2020
라이브러리를 찾게 된 계기
- 얼마 전 Bitbucket Pipelines로 Google App Engine에 자동 배포 시 안전하게 환경변수 추가하기 라는 글을 올렸었는데, 해당 글 마지막에 아래와 같은 글을 적어놨습니다.
- 위에서도 언급했지만, app.yaml 파일에 env_variables 항목이 이미 있는 경우에는 정상적으로 동작하지 않습니다.
- 이미 존재하는 환경변수도 함께 사용할 수 있는 방식으로 보완하면 더 좋을 것 같습니다.
- Google App Engine으로 작업을 하다가 env_variables 이 외에 또! 유동적으로 추가해줘야 될 부분이 생겼습니다. 그래서 ‘스크립트를 범용적으로 수정해야 되나’ 하고 생각하다가, 혹시나 하고 파일에 있는 변수들을 환경변수에 설정 된 값으로 교체해 주는 라이브러리를 검색해 봤습니다.
- 유레카! 놀랍게도 해당 라이브러리가 존재했습니다. 스타 30개 정도를 받은 라이브러리로 많은 사람들이 사용하는 것 같진 않지만, 제가 원하는 기능은 충분히 동작했습니다.
라이브러리 소개
- 제가 찾은 라이브러리는 envsub 이라는 npm 라이브러리입니다.
- 라이브러리 사용 방법은 여러가지 방법이 있지만 저는 가장 간단한 방법으로 사용했습니다.
사용 방법
- 글로벌 설치 후 실행 (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
와 같이 노출되면 꺼림칙 한 정보들을 숨길 수 있습니다.