AWS Lambda를 이용해서 서버리스 어플리케이션을 구성하여 RDS에 접속하려고 하면, 잦은 Lambda 호출로 인한 데이터베이스 커넥션 급증 문제가 발생 할 수 있다. 이러한 문제를 해결하기 위한 방법으로 AWS의 RDS Proxy를 이용 할 수 있다.
Amazon RDS Proxy?
RDS 프록시를 사용하여 예기치 않은 데이터베이스 트래픽 급증을 처리할 수 있습니다. 급증을 처리하지 않으면 연결 초과 구독 또는 빠른 속도의 새 연결 생성으로 인한 문제가 발생할 수 있습니다. RDS 프록시는 데이터베이스 연결 풀을 설정하고 이 풀에서 연결을 재사용합니다. 이 접근 방식은 매번 새 데이터베이스 연결을 여는 데서 오는 메모리 및 CPU 오버헤드 를 방지합니다. 과다 구독으로부터 데이터베이스를 보호하기 위해 생성되는 데이터베이스 연결 수를 제어할 수 있습니다.
(https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/rds-proxy.html)
Network 사전 조건
RDS 프록시 사용을 위해서는 연결하고자 하는 RDS가 배치된 VPC에 IP주소가 여유가 있는 서브넷들이 준비되어 있어야 한다.
아래는 DB인스턴스 용량당 최소 필요 IP 개수 이다.
AWS Secrets Manager에서 데이터베이스 자격 증명 설정
# 시크릿매니저 시크릿 생성
aws secretsmanager create-secret
--name <secret_name>
--description <secret_description>
--region <region>
--secret-string '{"username":<db_user>,"password":<db_user_password>}'
#생성확인
aws secretsmanager list-secrets
IAM Role 생성
아래의 인라인정책과 신뢰정책으로 구성되는 IAM Role을 생성한다.
- Inline policy
생성한 시크릿매니저의 시크릿 리소스 ARN, KMS Secret Manager default ARN 으로 변경한다.
default arn은 AWS KMS 콘솔에 접속하여 Secret Manager의 default ARN을 확인 할 수 있다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": [
"arn:aws:secretsmanager:<region>:<account_id>:secret:<secret_name>"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:<region>:<account_id>:key/<key_id>",
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.<region>.amazonaws.com"
}
}
}
]
}
- Trust Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "rds.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
AWS Console에서 Proxy 생성
Engine family:
프록시가 인식할 데이터베이스 네트워크 프로토콜
Proxy identifier:
프록시 이름 설정
Idle client connection timeout:
client connection 대기 시간
Database:
프록시를 통해 접속할 DB 인스턴스 지정
Connection pool maximum connections:
DB의 max_connections 중 몇 %의 커넥션까지 사용 할 지 설정
DB에 하나의 프록시만 사용하여 접속하는 경우에는 100으로 설정 = DB max_connection을 최대로 쓰겠다는 것
Connection borrow timeout:
커넥션이 모두 사용중인 경우에만 적용됨.
connection timeout 에러 발생시키기 전 대기 시간
IAM role:
위에서 생성한 IAM 역할 선택
Secrets Manager secrets:
생성한 시크릿 매니저 선택
IAM Authentication:
IAM 인증 허용, 필수, 비허용 여부
(허용은 sql server에서만 가능)
IAM 인증 사용하면 사용방식이 다르다.
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html
Subnets:
프록시에 사용할 서브넷 설정
VPC security group:
데이터베이스 접근 가능한 SG
Enable enhanced logging:
클라우드워치 로깅 설정, 트러블 슈팅용으로 사용 가능하며, 성능이슈로 24시간만 유지됨
이제 프록시 생성이 완료되었으면 생성된 프록시의 엔드포인트를 이용해서 데이터베이스에 접속하면 된다.
아래는 Java SDK에서 RDS Proxy를 통해 DB 접속을 하기위해 설정하는 정보이다.
this.jdbcURL: "jdbc:postgresql://<Proxy Endpoint>.rds.amazonaws.com:5432/<Database>"
this.rdsUsername: "db user"
this.rdsPassword: "password"
참고:
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy-setup.html
'Database > RDBMS' 카테고리의 다른 글
AWS RDS 인스턴스 생성 및 외부 접속 설정 (0) | 2022.04.10 |
---|