본문 바로가기
AWS

[SSM] Parameter Store로 환경변수 관리하기

by yonikim 2021. 7. 29.
728x90

환경변수를 관리하는 것은 언제나 귀찮은 보안을 필요로 하는 일이다. 

 

.env 와 같이 파일을 이용하여 관리하려면 저장소에 올릴때 .gitignore 처리를 해줘야 하고,

저장소 내부 환경변수 설정을 이용하여 관리하려면 파이프라인을 태울 때나 적용되기 때문에(참조: [ECR] Bitbucket Pipeline 을 이용해 AWS ECR에 이미지 push하기), 어쨌든 환경변수를 저장해 놓은 파일이 필요하다. 

파일로든 문서로든 팀원들이 함께 공유할 수 있는 자료를 만들고 또 싱크를 맞추는 것은 번거로운 작업이다.

 

이러한 번거로움을 덜기 위하여 우리는 AWS 에서 제공하는 리소스 관리 서비스를 이용하기로 했다. 

보통 AWS Systems Manager 는 인프라를 관리하는데 쓰이고, 환경변수와 같이 보안이 필요한 데이터를 관리할 때는 AWS Secrets Managers 를 많이 사용한다고 하지만 Secrets Manager 는 비싸므로...Systems Manager 의 Parameter Store 를 이용하여 환경변수를 가져오기로 했다.

 


AWS Systems Manager vs AWS Secrets Manager


AWS Systems Manager

AWS Systems Manager는 AWS의 운영 허브이다. Systems Manager는 AWS 애플리케이션 및 리소스의 운영 문제를 중앙 위치에서 추적하고 해결할 수 있는 통합 사용자 인터페이스를 제공한다.

Systems Manager를 사용하면 Amazon EC2 인스턴스 또는 Amazon RDS 인스턴스의 운영 태스크를 자동화할 수 있다. 또한 애플리케이션별로 리소스를 그룹화하고, 모니터링 및 문제 해결을 위해 운영 데이터를 보며, 사전 승인된 변경 워크플로를 구현하고, 리소스 그룹의 운영 변경에 대한 감사를 시행할 수 있다.

Systems Manager는 리소스 및 애플리케이션 관리를 간소화하고, 운영 문제를 탐지 및 해결하는 시간을 단축하며, 인프라를 대규모로 간편하게 운영 및 관리할 수 있게 해준다.

 

AWS Secrets Manager

AWS Secrets Manager는 애플리케이션, 서비스, IT 리소스에 액세스할 때 필요한 보안 정보를 보호하는데 도움이 된다.

Secrets Manage를 사용하면 수명 주기에 걸쳐 데이터베이스 자격 증명, API 키 및 다른 보안 정보를 손쉽게 교체, 관리 및 검색할 수 있다. 사용자 및 애플리케이션에서 Secrets Manager API를 호출하여 보안 정보를 검색하므로, 민감한 정보를 평문으로 하드코딩할 필요가 없다.

Secrets Manager는 Amazon RDS, Amazon Redshift 및 Amazon DocumentDB에 기본적으로 통합되어 보안 정보 교체 기능을 제공한다. 이 서비스는 API 키, OAuth 토큰을 비롯한 다른 유형의 보안 정보로도 확대 적용할 수 있다. 또한, Secrets Manager를 사용하면 세분화된 권한을 사용해 보안 정보에 대한 액세스를 제어하고 AWS 클라우드, 타사 서비스 및 온프레미스에 있는 리소스의 보안 정보 교체를 중앙에서 감사할 수 있다.

 

 


AWS Systems Manager 의 Parameter Store 이용하기


 

1. AWS Console 로그인 후 Systems Manager 에 들어간다.

 

2. 애플리케이션 관리 > [Parameter Store] 을 클릭하고, [파라미터 생성] 버튼을 클릭한다.

 

3. 값에 환경변수를 JSON 포맷으로 기재한다.

 

▷ lib/ssm.js

const AWS = require('aws-sdk')
const region = 'ap-northeast-2'

const ssm = new AWS.SSM({ region })
module.exports.getParameter = async (params) => {
  return new Promise((resolve, reject) => {
    ssm.getParameter(params, function (err, data) {
      if (err) {
        reject(err)
      } else {
        const value = data.Parameter.Value
        resolve(value)
      }
    })
  })
}

 

▷ app.js

const params = {
  Name: 'db_env_parameter',
}
const values = await getParameter(params)
const secret = JSON.parse(values)
console.log(`### Systems Manager > Parameter Store > ${params.Name}: ${secret}`)

const { db_host, db_port, db_username, db_password, db_database } = secret
const db_info = {
  host: db_host,
  port: db_port,
  user: db_username,
  password: db_password,
  database: db_database,
}
728x90