[AWS + Spring] RDS + Secrets Manager 연동하기
이번 포스팅은 Spring Application에서의 RDS의 Connection 방법과, Secrets Manager를 활용하여 데이터베이스의 Connection 정보를 관리해보려고 한다.
Amazone Secrets Manager의 필요성
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:3307/wisefee-database?characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 1111
기존에는 환경 변수에 위의 예시처럼 Connection에 필요한 자격 증명 정보들을 설정하여 사용하는 방식을 주로 사용했을 것이다.
하지만 이 방식은 자격 증명이 코드나 환경 변수에 노출될 위험이 있으며, 보안 관리가 어렵다.
이를 해결하기 위해 AWS Secrets Manager를 활용하면 자격 증명을 안전하게 관리하고 자동으로 교체하여 보안을 강화할 수 있다.
<함께 보기> RDS : 자격 증명과 Connection (AWS Secrets Manager & RDS Proxy)
https://sjh9708.tistory.com/264
[AWS] RDS : 자격 증명과 Connection (+ AWS Secrets Manager & RDS Proxy)
이번 포스팅에서는 프로비저닝한 RDS 서비스에 접근하기 위한 인증 방식과, 그것을 활용한 접근 방법에 대해서 살펴보려고 한다. RDS 인증 방식 1. 전통적인 User/Password 기반 인증일반적인 D
sjh9708.tistory.com
1. RDS 프로비저닝
먼저 애플리케이션에서 사용할 RDS 데이터베이스를 프로비저닝 시켜주자.
우리는 Secrets Manager를 활용한 인증 방식을 사용할 것이기 때문에 자격 증명 관리를 Secrets Manager에서 수행하도록 선택해주자.
그 외에는 각자의 프로젝트 성격에 맞게 DB 엔진, VPC, 파라미터 등을 설정시켜주면 된다. 필자는 프로젝트가 MariaDB 드라이버를 사용하였기 때문에 엔진으로 설정해주었다.
RDS를 프로비저닝할 때 설정할 수 있는 다양한 기능들에 대해서는 아래의 포스팅을 참고하자.
https://sjh9708.tistory.com/263
[AWS] RDS : 서비스 개요 및 프로비저닝 설정
이번 포스팅에서는 AWS에서 제공하는 관계형 데이터베이스 서비스인 RDS의 기능 및 프로비저닝 설정 과정에 대해서 포스팅해보려고 한다. 1. DB 엔진 설정2. 가상 머신(EC2) 및 스토리지 설정3. VPC
sjh9708.tistory.com
2. IAM 권한 정책 설정
이제 개발 환경에서, 혹은 프로덕션 환경에서 RDS 및 Secrets Manager와 통신하기 위해서는 자격 증명이 필요하다.
개발 환경에서는 IAM 사용자 기반의 CLI 인증을 통해서 통신하는 방식을 사용할 것이고, 프로덕션 환경에서는 EC2의 IMDS(Instance Metadata Service)를 사용하여 IAM Role 기반으로 자동으로 서비스 인스턴스와 통신하도록 설정할 것이다.
따라서 IAM 사용자 및 역할을 생성해주고 정책을 할당해주었다. (S3는 프로젝트에서 사용하고 있기에 함께 넣어주었다)
가장 간단하게 권한을 할당하기 위해서 모두 FullAccess 권한을 부여해주었지만, 실제 프로젝트라면 세밀한 권한 정책 설정을 권장한다.
- AmazonRDSFullAccess : RDS 인스턴스 및 관련 리소스를 생성, 수정, 삭제할 수 있는 전체 관리 권한.
- AmazonS3FullAccess : S3 버킷과 객체에 대한 읽기/쓰기 및 관리 권한.
- SecretsManagerReadWrite : AWS Secrets Manager에서 보안 정보를 저장, 검색, 수정, 삭제할 수 있는 권한.
3. Secrets Manager 확인
RDS를 프로비저닝 할 때 함께 생성된 Secrets Manager의 보안 암호이다. 자동으로 생성된 Key의 종류로는 DB Connection에 필요한 username과 password가 있으며, 필요한 값들을 필요하다면 더 추가할 수 있다.
rds!db-25664e62-846e-44ec-ad51-ec82073fbabf은 보안 암호의 Name으로서 이후 환경 변수 설정 시 사용될 예정이다.
4. Spring 의존 패키지 추가
▶ build.gradle
//aws secret manager
implementation 'io.awspring.cloud:spring-cloud-starter-aws-secrets-manager-config:2.4.4'
해당 패키지는 AWS Secrets Manager에서 애플리케이션 설정을 자동으로 가져와 Spring Boot 환경 변수로 로드해주는 역할을 수행할 수 있다.
- RDS 데이터베이스 자격 증명, API 키 등의 보안 정보를 Spring Config로 직접 주입 가능
- Secrets Manager 값이 변경되면 애플리케이션이 자동으로 업데이트될 수 있도록 지원
5. Spring 환경 변수 설정
aws:
secretsmanager:
region: ap-northeast-2
spring:
config:
import: 'aws-secretsmanager:rds!db-25664e62-846e-44ec-ad51-ec82073fbabf'
// import: 'aws-secretsmanager: ${YOUR_SECRET_NAME}'
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://my-db.c7q6mc8m8zw5.ap-northeast-2.rds.amazonaws.com:3306/wisefee-database?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
// url: jdbc:mariadb://${RDS_HOST}:${RDS_PORT}/${RDS_DATABASE}?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: ${username}
password: ${password}
// ...
- AWS Secrets Manager의 Name(rds!db-25664e62-846e-44ec-ad51-ec82073fbabf)을 통해 시크릿을 가져와 Spring Boot 설정에 자동으로 로드한다.
- Secret Manager의 정보를 로드하기 위해서는 region을 지정해 주어야 한다.
- Spring Boot는 해당 정보를 spring.config.import를 통해 불러와, username과 password 값을 동적으로 주입한다.
- 이 설정을 통해 애플리케이션이 RDS 데이터베이스(my-db.c7q6mc8m8zw5.ap-northeast-2.rds.amazonaws.com)에 연결할 때 사용한다.
6. 개발 환경 연동 테스트
개발 환경에서는 IAM 사용자 기반의 CLI 인증을 통해서 통신하는 방식을 사용하기도 했기 때문에
이전에 만들었던 IAM 사용자의 자격 증명 Key Pair를 사용하여 (Access Key, Secret Access Key) 프로파일을 등록해주자.
별도의 설정이 없다면, Spring에서는 default 프로퍼티의 자격 증명을 사용하여 Secrets Manager의 정보를 로드하기 때문에 디폴트 프로파일로 등록해주었다.
aws configure
7. 프로덕션 환경 연동
EC2 프로덕션 환경에서 Secrets Manager 및 RDS와 통신하기 위해서 IMDS(Instance Metadata Service)를 사용하여 IAM Role 기반으로 자동으로 서비스 인스턴스와 통신하도록 설정해주었다.
따라서 EC2를 프로덕션 할 때, IAM 인스턴스 프로파일을 위에서 만들었던 Role로 지정해준다.
Docker를 활용하여 EC2 인스턴스에 Spring 프로젝트를 배포하였다. 별다른 문제 없이 DB Connection에 성공하여 21시간동안 백엔드 애플리케이션이 동작하고 있는 것을 확인할 수 있다.
<함께 보기> EC2 인스턴스에 Docker 컨테이너 배포하기
https://sjh9708.tistory.com/100
[AWS] EC2 인스턴스에 Docker 컨테이너 배포하기
이전에 Google Cloud Platform (GCP)를 이용하여 Docker 컨테이너를 배포하는 방법을 포스팅한 적 있다.이번에는 AWS를 사용하여 배포하는 방법을 살펴보도록 하자. AWS 인스턴스에, Docker 컨테이너를 실행
sjh9708.tistory.com
'Backend > AWS' 카테고리의 다른 글
[AWS] CloudWatch : 기타 기능 (Dashboard, Synthetics, Resource Health) (0) | 2025.04.04 |
---|---|
[AWS] CloudWatch : 주요 개념과 구성요소 (로그, 지표, 경보) (0) | 2025.03.23 |
[AWS] RDS : 자격 증명과 Connection (+ AWS Secrets Manager & RDS Proxy) (0) | 2025.03.10 |
[AWS] RDS : 서비스 개요 및 프로비저닝 설정 (0) | 2025.03.10 |
[AWS] Amazone Athena & Amazone Glue : 데이터 소스에 대한 스키마 분석 및 쿼리 수행 기초 (0) | 2025.02.19 |