AWS CodeDeploy 배포 과정에서 사전에 정의한 환경변수 사용하기
AWS CodeDeploy에서는 코드를 배포할 때 ~/.bashrc
에서 정의한 환경변수를 쓸 수 없다.
그래서 배포 시 로컬에서 기대한 것과 달리 오류가 발생할 수 있다.
필자는 DB 연결을 환경변수로 정의했는데, AWS EC2에서 vi ~/.bashrc
로 정의한 환경변수를 CodeDeploy 배포 과정에서 사용할 수 없어 DB 연결이 제대로 되지 않는 현상이 발생했다.
etc/.profile.d/codedeploy.sh
에 등록한다?
etc/.profile.d/codedeploy.sh에 환경변수를 등록하면 된다는 글이 종종 보이는데, 예전 방법인 건지 적용이 안 된다.
AWS Parameter Store
그래서 AWS Parameter Store에서 직접 파라미터를 등록하고 이를 배포할 때 가져오는 방법으로 해결했다.
https://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/systems-manager-parameter-store.html
암호화만 하지 않으면 무료이고, 변수 설정과 값 지정도 간편해서 사용하기 쉽다.
그전에 AWS 자격증명이 필요한데, 아래 글에서 EC2에서 AWS 자격 증명을 하는 방법을 참고했다.
https://fgh0296.tistory.com/51
이 자격 증명은 CodeDeploy에 관한 자격 증명인데, 기존에 사용하는 key가 있으면 그걸 사용하면 되고, 없거나 잊어버렸으면 새로 하나 만들자.
AWS Access Key 발급하는 방법은 아래 링크에 자세히 나와 있다.
https://lannstark.tistory.com/66
제대로 생성이 되었으면 저렇게 AwsCodeDeployFullAccess가 사용자 권한 정책에 있어야 한다.
먼저 EC2에서 다음 명렁어를 실행한다.
apt-get install awscli
aws configure
이후 자격 증명에 필요한 값을 차례대로 입력한다.
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]: json
그 다음 배포 과정에서 실행하는 코드 중 적절한 곳에 환경 변수를 할당하는 코드를 삽입한다.
필자는 AfterInstall
hook에서 실행되는 after_install.sh
코드에 삽입했다.
이건 케이스마다 다를 것이다.
아래 appspec.yml
은 AWS CodeDeploy를 통해 코드를 배포할 때 hook마다 무엇을 실행할 것인지를 정의하는 코드이다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/server
overwrite: yes
file_exists_behavior: OVERWRITE
permissions:
- object: /home/ubuntu
pattern: '**'
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: scripts/after_install.sh
timeout: 2400
runas: ubuntu
아래와 같은 형식으로 Parameter Store에서 값을 가져와 환경변수를 지정해준다.
export [환경변수명]=$(aws ssm get-parameters --region [AWS region명] --names [Parameter Store에서 정한 변수명] --query Parameters[0].Value | sed 's/"//g')
다음은 RECJOON 프로젝트에서 진행했을 때 Parameter Store를 통해 정의한 환경변수이다.
export RECJOON_RDS_HOST=$(aws ssm get-parameters --region ap-northeast-2 --names RECJOON_RDS_HOST --query Parameters[0].Value | sed 's/"//g')
export RECJOON_RDS_PORT=$(aws ssm get-parameters --region ap-northeast-2 --names RECJOON_RDS_PORT --query Parameters[0].Value | sed 's/"//g')
export RECJOON_RDS_USERNAME=$(aws ssm get-parameters --region ap-northeast-2 --names RECJOON_RDS_USERNAME --query Parameters[0].Value | sed 's/"//g')
export RECJOON_RDS_PASSWORD=$(aws ssm get-parameters --region ap-northeast-2 --names RECJOON_RDS_PASSWORD --query Parameters[0].Value | sed 's/"//g')
export RECJOON_RDS_DATABASE=$(aws ssm get-parameters --region ap-northeast-2 --names RECJOON_RDS_DATABASE --query Parameters[0].Value | sed 's/"//g')
export RECJOON_SERVER_HOST=$(aws ssm get-parameters --region ap-northeast-2 --names RECJOON_SERVER_HOST --query Parameters[0].Value | sed 's/"//g')
export RECJOON_SERVER_PORT=$(aws ssm get-parameters --region ap-northeast-2 --names RECJOON_SERVER_PORT --query Parameters[0].Value | sed 's/"//g')
export RECJOON_RDS_MASTER_HOST=$(aws ssm get-parameters --region ap-northeast-2 --names RECJOON_RDS_MASTER_HOST --query Parameters[0].Value | sed 's/"//g')