summary
AWS RDS를 사용하는 환경에서 DB 계정을 Secrets Manager 를 사용해 관리한다.
AWS 도커 오케스트레이션 환경에서 Secrets Manager 리소스를 사용할 수 있도록 한다.
Secrets Manager?
수명 주기 동안 데이터베이스 자격 증명, API 키 및 기타 보안 정보를 손쉽게 교체, 관리 및 검색
AWS Secrets Manager는 보호해야할 정보를 쉽게 관리할 수 있는 서비스이다.
본 포스팅에서는 AWS RDS에서 자격증명(계졍)을 Secrets Manager로 관리하는 방법에 대해 알아본다.
백엔드 서비스를 운영할 때, 서비스 외부 DB에 접근하기 위해 id, password를 서비스에 전달할 필요가 있다.
일반적으로 생각할 수 있는 방법은 다음과 같다.
- 환경변수로 id, password를 벡엔드 서비스에 전달.
- id, password를 저장한 파일로 저장, 서비스 시작 시 해당 파일을 읽어 환경변수로 전달하기.
하지만 위 두 가지 방식은 언제든 해당 정보가 노출 될 수 있다는 단점이 있다.
또한, 보안 강화를 위해 주기적으로 password를 변경한다면, 변경할 때마다 내용을 반영하지 않으면 서비스가 제대로 돌아가지 않을 수 있다.
Secrets Manager를 사용하면, 소스코드 상에서 id, password를 노출하지 않을 수 있으며, lotation 설정을 통해 암호를 자동으로 교체해준다.
Secrets Manager 생성
AWS RDS 접근 계졍을 생성 혹은 RDS 생성시 만든 master 계정을 Secrets Manager에 등록해 보자. (계정은 이미 생성되어 있어야 한다)
AWS 콘솔에서 [Secrets Manager] - [새 보안 암호 저장] 버튼을 클릭하여 암호 생성 페이지로 이동한다.

보안 암호 유형에서 ‘RDS 데이터베이스에 대한 자격 증명’을 선택한다.
이름과 암호에는 기존재하는 접속 이름과 암호를 입력해주고, 암호화 키를 선택해준다.
default key 를 선택해도 되고, KMS에 저장된 키를 이용할 수 도 있다.

접근할 데이터 베이스를 선택하고 다음단계로 이동한다.
다음 페이지에서 암호 이름과 설명을 입력한다. 암호 이름으로 값에 접근하므로 신중하게 결정하도록 하자.
다음 단계에서는 자동 교체를 구성하는 단계인데, 생성이 완료되고 난 후에 설정할 수 있으므로 건너뛴다.
내용을 확인한 후 생성해보자.
Secrets Manager 자동 교체 구성
콘솔에서 생성한 Secrets Manager의 상세페이지로 이동하여 [교체구성] - [교체 편집] 버튼을 클릭하여 교체 구성을 편집해보자.

‘자동 교체 활성화’를 한 뒤 간격을 지정하고 람다 함수를 선택 혹은 생성하는 옵션을 지정한다.

설정을 완료한 뒤 콘솔에서 ‘보안 암호 즉시 교체’ 버튼을 눌러 암호를 바로 교체해 보자.
교체한 뒤에는 교체 전 암호로는 DB 접속이 안되는 것을 확인할 수 있다.
Secrets Manager 벡엔드 서버에서 사용
노드 서버에서 DB 접속시 Secrets Manager를 사용하여 접속한다.
aws-sdk를 통해 credentials 정보를 가져오는 코드를 구현한다.
const awsObject = require('aws-sdk');
const DEFAULT_REGION = 'YOUR_DEFAULT_REGION';
const secretsManager = region => new awsObject.SecretsManager({ region });
const getSecretValue = ({
secretName,
region = DEFAULT_REGION,
}) => {
if (!secretName) throw new Error('secret name is required!');
const params = { SecretId: secretName };
return new Promise((resolve, reject) => secretsManager(region).getSecretValue(params, (err, data) => {
if (err) reject(error);
if (!data || !data.SecretString) reject(new Error('no data'));
resolve(JSON.parse(data.SecretString));
}));
}
module.exports = {
getSecretValue,
};
getSecretValue 함수를 통해 Secrets Value 를 가져온 뒤, 해당 값으로 DB 연결 설정을 진행한다.
const databaseCredentials = await getSecretValue({ secretName: 'YOUR_SECRET_NAME' });
return {
username: databaseCredentials.username,
password: databaseCredentials.password,
host: databaseCredentials.host,
port: databaseCredentials.port,
};
scretName에는 Secrets Manager를 생성할 때 지정한 이름을 전달한다.
AWS 도커 오케스트레이션 환경에서 AWS 리소스를 사용.
ECS를 사용하여 오케스트레이션 환경을 구성한 경우, AWS 정책을 서비스 별로 부여할 수 있다.
Backend service가 sdk를 통해 Secrets Manager 에 접근하려면, 정책을 지정해 줘야한다.
prod 환경에서 사용하는 docker-compose 파일에 backend 서비스에 아래와 같이 정의한다.
services:
backend:
image: YOUR_IAMGE
environment:
- SERVICE_MODE=prod
x-aws-policies:
- "arn:aws:iam::aws:policy/SecretsManagerReadWrite"
x-aws-policies 속성으로 정책을 직접 연결할 수 있다.
role 을 설정하는 방식으로 사용할 수 도 있는데, 이는 공식문서를 참고하자.
위와 같이 정책을 지정해주면 오케스트레이션이 배포 될 때, task-role을 change set에 포함하여 배포하게 된다.
따라서 backend 서비스가 Secrets Manager 의 값을 불러올 수 있다.

end
aws rds를 사용하여 데이트베이스를 구성한 경우, 암호를 자동으로 주기적으로 교체하고 관리할 수 있는 Secrets Manager를 사용하는 방법에 대하 알아보았다.
또한 ECS 도커 오케스트레이션 환경에서 AWS 리소스에 접근할 수 있도록 정책을 연결하는 방식도 알아보았다.
이를 통해 계정 관리를 더 보안이 강화되고 편리한 방식으로 할 수 있다.