Stateless 서비스(ECS)가 Private DB에 접근하는 방법
한 줄 답변#
ECS 태스크의 Security Group을 RDS Security Group의 인바운드에 소스로 등록하면 된다. IP가 아니라 SG 참조 방식.
왜 IP로 못 하나#
ECS Fargate는 태스크가 뜰 때마다 IP가 바뀐다:
태스크 A: 10.0.1.23 → 종료
태스크 B: 10.0.2.87 → 새로 생성 (다른 IP)
태스크 C: 10.0.1.45 → 스케일 아웃 (또 다른 IP)
오토스케일링으로 태스크 수도 변하기 때문에, IP를 SG에 등록하는 건 불가능하다.
Security Group 참조 방식#
IP 대신 SG 자체를 소스로 지정한다:
ECS Task Security Group: sg-ecs-app
아웃바운드: 5432 → sg-rds (PostgreSQL)
RDS Security Group: sg-rds
인바운드: 5432 ← sg-ecs-app ← SG를 소스로 지정!
이렇게 하면 sg-ecs-app에 속한 모든 리소스는 IP에 관계없이 RDS에 접근할 수 있다. 태스크가 100개로 스케일되어도 SG 규칙은 1줄.
Terraform 예시#
# ECS Task SG
resource "aws_security_group" "ecs_app" {
name = "ecs-app"
vpc_id = var.vpc_id
}
# RDS SG
resource "aws_security_group" "rds" {
name = "rds"
vpc_id = var.vpc_id
ingress {
from_port = 5432
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.ecs_app.id] # IP가 아닌 SG 참조
}
}
전체 네트워크 흐름#
[Public Subnet]
ALB (sg-alb)
↓ 포트 80/443
[Private Subnet - App]
ECS Fargate Task (sg-ecs-app)
↓ 포트 5432
[Private Subnet - Data]
RDS (sg-rds)
인바운드: 5432 ← sg-ecs-app
- ALB → ECS:
sg-ecs-app인바운드에sg-alb등록 - ECS → RDS:
sg-rds인바운드에sg-ecs-app등록 - 각 계층이 SG 참조로 연결되어 있어서 IP 변동에 영향 없음
ECS vs EKS에서의 차이#
| 항목 | ECS Fargate | EKS Pod |
|---|---|---|
| IP 할당 | 태스크당 ENI, IP 변동 | Pod당 IP, 변동 |
| SG 적용 | 태스크 레벨 SG | Pod 레벨 SG (Security Groups for Pods) |
| DB 접근 | SG 참조 | SG 참조 또는 IRSA + IAM Auth |
EKS에서도 동일하게 SG 참조 방식으로 RDS 접근을 제어할 수 있다.
실무 경험#
PlayBall 프로젝트에서 EKS Pod → RDS 접근 시:
EKS Pod SG → RDS SG 인바운드에 등록
+ IRSA로 IAM 인증 (정적 비밀번호 X)
+ Secrets Manager에서 크리덴셜 주입 (External Secrets)
SG는 네트워크 접근 제어, IRSA는 인증, Secrets Manager는 크리덴셜 관리 — 3중으로 구성했다.