필자는 며칠 전에 Spring과 aws 생태계에 입문했다.
spring과 aws 모두 생태계가 방대해서 현재 내 인프라에 맞는 좋은 Best practice에 대해 많은 글을 찾아보고,
삽질한 내역을 적어본다.
AWS에서 RDS 데이터베이스를 생성할 때, 비밀번호의 주기 관리를 secrets manager에 위임할 수 있다.
필자는 보안을 아주 민감하게 여기고, 어떤 서비스를 구축하던 보안을 최우선순위로 여긴다.
그런 면에 있어서 AWS에서 제공하는 secrets manager는 아주 매력적이게 다가왔다.
1. RDS & Secrets manager 연동
이 부분은 AWS가 아주 간편하게 지원해주고 있다.
RDS 자격증명 관리를 Secrets manager에 위임하면 끝이다.
설정 후 Secrets manager에 들어가보면 rds credential이 설정되어있는 키가 생성되어 있을 것이다.
2. Spring boot & Secrets manager & spring data jpa 연동
spring data jpa와 원하는 데이터베이스 커넥터를 설치 후, 아래의 디펜던시를 추가한다.
implementation 'com.amazonaws.secretsmanager:aws-secretsmanager-jdbc:1.0.8'
만약 Spring에서 데이터베이스 credential 외에도 secrets manager를 사용해 별도의 키를 불러오려면 아래의 디펜던시도 같이 설치한다.
implementation "io.awspring.cloud:spring-cloud-starter-aws-secrets-manager-config:2.4.4"
secrets-manager-config 라이브러리에 대한 사용법은 아래의 문서에서 확인 가능하다.
https://repost.aws/ko/articles/ARrbXsydIkSAqKLrWhos7GnQ
application.yml의 datasource를 다음과 같이 작성한다.
spring:
datasource:
driver-class-name: com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver
url: jdbc-secretsmanager:<dialect>://<database endpoint>
username: <secret name>
driver-class-name은 사용할 데이터베이스에 맞게 변경해주자.
secrets manager driver는 username을 통해 secrets manager에서 자동으로 데이터베이스의 크리덴셜을 가져와서 연결해준다.
3. aws credential 설정
spring이 aws의 secrets manager에 액세스하려면 권한이 있는 AWS 액세스키가 필요하다.
IAM 유저를 생성 후, secrets manager에 접근할 수 있는 권한을 부여한다.
보안 자격 증명 -> 액세스 키 에서 새 액세스 키를 발급한다.
로컬 환경에서 빌드 및 구동시에는 AWS SDK를 설치 후,
aws configure 명령어를 통해 Host machine에 aws credential을 주입시켜
secrets manager 라이브러리가 자동으로 해당 값으로 요청을 보내게 할 수 있다.
하지만 Docker에서의 빌드 및 구동시에는 격리된 컨테이너 내부이므로 Host에 설정을 해준다 한들,
적용되지 않는다.
이럴때는 컨테이너의 환경변수로 AWS_ACCESS_KEY_ID와 AWS_SECRET_KEY를 설정하면 된다.
여담으로, 국내의 사례에서는 본 글과 같이 처리한 예를 발견할 수 없었다.
필자의 방법이 제일 좋은 방법이라곤 말할 수 없겠지만..
여타 글들의 방식보단 제일 정석적인 방법이라고 생각한다.
'개발새발 > Spring' 카테고리의 다른 글
[Spring] Server response normalization (0) | 2024.10.27 |
---|---|
[Spring] Session VS JWT (1) | 2024.10.02 |
[Spring] Bean과 DI, IoC (0) | 2024.08.24 |