서버와 데이터베이스 사이의 연결을 효율적으로 사용하기 위한 RDS Proxy에 대해서 사용해보려고 한다.
실습을 진행하기 전 NAT Gateway와 라우팅 테이블을 생성 및 설정해주어야 한다.
RDS Proxy 실습
보안 그룹 생성
VPC 콘솔의 보안 그룹 탭으로 이동해서 새로운 보안 그룹을 만들어줍니다.
private-ec2와 bastion host를 인바운드 규칙으로 등록해 주었다.
RDS 보안 그룹 수정
RDS Proxy가 대상이 되는 RDS 커넥션을 사용하기 위해서 접근이 필요하기 때문에, RDS의 보안 그룹을 인바운드 규칙에 5432 포트를 RDS Proxy보안 그룹에 열어주는 규칙을 추가하여 수정해 준다.
RDS Proxy 생성
RDS 콘솔로 이동해서 왼쪽의 프록시를 생성해 준다. 여러 엔진 중 Postgresql을 선택하고 유효클라이언트 연결 제한 시간을 설정해 준다. 지정한 시간동안 커넥션이 사용되지 않는 상태일 경우 종료해서 불필요한 리소스 낭비를 줄여준다.
트래픽을 전달할 데이터 베이스를 선택하고 연결 풀 최대 비율과 차용 제한 시간을 설정해준다.
연결 차용 제한 시간은 설정한 시간 내에 연결할 수 있는 커넥션이 생기지 않으면 타임아웃 에러를 발생시킨다.
IAM 역할은 Proxy에 RDS를 연결할 수 있는 IAM 규칙을 지정하는 것이다. 역할 생성을 하면 AWS에서 자동으로 연결할 권한을 생성해준다. Secrets Manager 보안 암호는 서비스에 저장된 상태로 관리되는 보안 암호로 키 - 값 형태로 정보를 저장할 수 있다.
Secrets Manager 생성
여러 종류의 보안 암호 유형이 있는데, 아마존 RDS 데이터 베이스에 대한 자격 증명을 설정해준다. 암호화 키는 그대로 두고, 데이터 베이스를 클릭하고 다음으로 넘어간다.
시크릿의 이름과 설명을 입력하고 다음으로 넘어간다.
자동 교체 구성은 주기적으로 인증정보를 로테이션해 설정해 주는데, 설정해 주지 않았다.
private 서브넷 2개를 선택해 주고 보안그룹 선택 후 생성해 주면 된다.
이제 만들어진 프록시를 눌러준다. available가 되는데 시간이 조금 필요하다.
엔드포인트와, 타겟 그룹이 활성화되었는지 확인해 준다.
만약, 상태가 활성화되지 않으면 보안그룹을 확인해줘야 한다.
서버에 RDS Proxy 연결
서버에 RDS Proxy를 연결해 주기 위해 시작 템플릿을 수정해 준다. 우선 앞에서 만든 프락시 엔드 포인트를 복사해서, 템플릿 버전을 만들어 오토스케일링 가디언을 체크해 주고 사용자 데이터의 쓰기 전용 데이터베이스의 HOST(엔드포인트)를 앞서 복사한 엔드 포인트로 변경해 준다.
이후, 오토스케일링 및 인스턴스를 리부트 해준다.
로드 밸런서의 엔드 포인트, 타깃 그룹의 HealthCheck를 확인해 준다.
Django 설정
Django의 settings.py에서 RDS Proxy를 통해 데이터베이스에 연결할 수 있도록 설정을 변경해줘야한다 - Serect Manager에 접근하기 위해서 boto3 라이브러리도 설치해야한다...
import boto3
import json
def get_secret():
secret_name = "your-secret-name" # Secrets Manager에서 설정한 시크릿 이름
region_name = "ap-northeast-2" # AWS 리전
# Secrets Manager 클라이언트 생성
session = boto3.session.Session()
client = session.client(
service_name='secretsmanager',
region_name=region_name
)
# 시크릿 가져오기
get_secret_value_response = client.get_secret_value(SecretId=secret_name)
secret = get_secret_value_response['SecretString']
return json.loads(secret) # 시크릿을 딕셔너리로 반환
# 시크릿 가져오기
secrets = get_secret()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql', # PostgreSQL 엔진 사용
'NAME': secrets['dbname'], # 데이터베이스 이름
'USER': secrets['username'], # 사용자 이름
'PASSWORD': secrets['password'], # 비밀번호
'HOST': 'todo-rds-proxy.proxy-c3ck2es08vyt.ap-northeast-2.rds.amazonaws.com', # RDS Proxy 엔드포인트
'PORT': '5432', # 포트 번호
}
}
pip install boto3
테스트
Failover 시간 단축 확인
RDS 콘솔의 메인 인스턴스를 리부트 해서 데이터베이스가 페일오버되도록 해준다. 그리고 이벤트 탭으로 이동해서 페일 오버된 이벤트를 확인하고 포스트맨으로 요청을 보내본다. 그럼 이전과 다르게 빠르게 정상으로 돌아온 것을 확인할 수 있다.
'인프라 > AWS' 카테고리의 다른 글
[AWS] S3 - 무한 확장 저장소, 버킷 생성, 권한 설정 & 객체 추가 (0) | 2024.10.14 |
---|---|
[AWS] S3란 무엇인가? (0) | 2024.10.14 |
[AWS] RDS 고가용성 확보를 위한 Multi AZ (1) | 2024.10.11 |
[AWS] RDS 읽기 복제본 - 읽기 트래픽 분산 (0) | 2024.10.10 |
[AWS] RDS - 관계형 데이터 베이스 (0) | 2024.10.10 |