한 줄 답변#

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 FargateEKS Pod
IP 할당태스크당 ENI, IP 변동Pod당 IP, 변동
SG 적용태스크 레벨 SGPod 레벨 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중으로 구성했다.