환경변수를 관리하는 것은 언제나 귀찮은 보안을 필요로 하는 일이다.
.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,
}
'AWS' 카테고리의 다른 글
[AWS] 서버리스 애플리케이션을 위한 AWS 메시징 서비스와 아키텍처 구현 패턴 (0) | 2021.07.30 |
---|---|
[AWS] 어떤 컨테이너 서비스를 이용해야 하나요? (0) | 2021.07.30 |
[CloudWatch] CloudWatch 경보 설정하기 - 3 (0) | 2021.06.21 |
[CloudWatch] CloudWatch 경보 설정하기 - 2 (0) | 2021.06.17 |
[CloudWatch] CloudWatch 경보 설정하기 - 1 (0) | 2021.06.17 |