서버에 설정값 전달하기
이 글에서는 운영 환경의 서버에서 실행되는 프로그램에 패스워드를 포함한 민감한 설정값을 어떻게 전달하면 좋을지에 대해 알아보고자 한다. 서버에 프로그램을 배포한 경험이 있는 개발자라면 한번 쯤은 고민했을 내용을 담고 있다. 또한 AWS EC2와 Parameter Store를 이용하는 방법에 대해서도 알아본다.
설정값이란?
설정값이란 프로그램에서 사용되는 키와 값의 쌍으로 이루어진 정보를 말한다. 예를 들어 데이터베이스 접속에 필요한 호스트, 포트, 사용자 이름, 패스워드와 같은 정보를 설정값으로 사용할 수 있다. 이를 다음과 같이 JSON 형식으로 나타낼 수 있다. 이 글에서는 다음 설정값을 계속 사용한다.
설정값을 하드 코딩
코드에 설정값을 직접 하드 코딩 하는 것은 가장 간편하고 직관적이다. Node.js에서 PostgreSQL로 접속하려면 다음과 같이 사용할 수 있다.
먼저 npm install pg 명령으로 모듈을 설치한다.
소스 코드에 액세스할 수 있으면 데이터베이스에 연결할 때 사용하는 설정값도 알 수 있다. 따라서 서버에서 프로그램을 실행할 때 별도로 설정할 필요 없이 소스를 실행하면 데이터베이스에 접속할 수 있다.
하지만 서버가 개발, 테스트, 스테이지, 운영 등으로 나누어지면 각 환경에 따라 설정값을 변경하는 코드를 추가해야 한다. 또한 설정값을 알 필요가 없는 개발자도 소스를 받으면 모든 설정값을 알게 된다.
설정값을 저장하는 파일 사용
설정값을 파일에 저장하고 프로그램을 시작할 때 파일에서 로드한다. 예를 들어, .env라는 설정 파일을 만들고 다음과 같이 데이터베이스 설정값을 저장한다.
Node.js에서 다음과 같이 설정 파일을 로드하고 사용할 수 있다.
먼저 npm install pg dotenv명령으로 모듈을 설치한다.
이렇게 하면 코드와 설정값을 분리할 수 있다. 서버 환경에 따라 각기 다른 설정 파일을 배포하면 되므로 조건에 따라 다른 설정값을 적용하도록 하는 코드를 추가하지 않아도 된다.
하지만 프로그램을 실행하는 서버에 접속해서 파일을 직접 배포해야 한다.
설정값을 EC2 인스턴스의 User Data에 저장
AWS EC2 인스턴스를 생성할 때 User Data에 셸 스크립트를 입력하면 인스턴스가 시작될 때 스크립트를 실행한다. 다음과 같이 스크립트에 환경 변수를 입력한다.
EC2 인스턴스가 시작되면 환경 변수에 설정값을 입력하게 되므로 dotenv를 사용할 때와 동일하게 설정값에 엑세스 할 수 있다.
설정값을 AWS Parameter Store에 저장
앞서 사용한 방법은 서버에 설정값을 저장한다. 따라서 서버에 접속할 수 있으면 쉽게 설정값을 찾을 수 있다. 이를 해결하기 위해서 AWS Systems Manager Parameter Store를 사용한다. 다음과 같이 Parameter Store에 설정값을 저장할 수 있다.
- Systems Manager 콘솔에 접속한다.
- Parameter Store, Create parameter를 차례로 선택한다.
- Name에 config를 입력한다.
- Type은 String을 선택한다.
- Value에 설정값을 JSON 형식으로 입력한다.
- Create parameter를 선택한다.
프로그램에서는 다음과 같이 AWS SDK에서 제공하는 getParameter API를 사용해 Parameter Store에 저장된 데이터베이스 설정값을 가져올 수 있다.
먼저 npm install aws-sdk pg 명령으로 모듈을 설치한다.
사용 사례
우리는 CloudFormation 템플릿을 사용해 서버 인프라를 생성한다. CloudFormation 템플릿은 파라미터로 데이터베이스 설정값을 입력 받는다. 입력 받은 설정값을 사용해 데이터베이스를 생성한 후 설정값을 Parameter Store에 저장한다.
EC2 인스턴스는 Auto Scaling 그룹에 의해 자동으로 생성된다. 따라서 EC2 인스턴스에 시작 스크립트를 설정하기 위해 Launch Configurations에서 User Data를 설정한다. User Data에는 데이터베이스 설정값을 저장하고 있는 Parameter Store 이름을 환경 변수로 저장한다.
EC2 인스턴스가 시작되면 인스턴스는 데이터베이스 설정값을 저장하는 Parameter Store 항목의 이름만 갖게 된다. 프로그램에서 AWS SDK를 사용해 Paramete Store에 있는 데이터베이스 설정값을 가져온다.
다음은 CloudFormation 템플릿의 일부이다.