개념

왜 Secrets Manager를 쓰는지?

지금 방식의 문제
  terraform.tfvars → db_password 평문 저장
  secret.yaml      → base64 인코딩 (사실상 평문)
  둘 다 실수로 git에 올라가면 자격증명 유출

Secrets Manager 방식
  민감한 값을 AWS에서 중앙 관리
  Terraform → Secrets Manager에서 값을 가져와서 사용
  K8s Pod  → External Secrets Operator가 자동으로 주입

이 가이드에서 다루는 것
  1. Secrets Manager에 값 등록
  2. Terraform에서 db_password 가져오기
  3. K8s Pod에 DB 접속정보 / JWT 시크릿 자동 주입

저장할 값 목록

/team3/foldy/dev/db_password    → RDS 마스터 비밀번호
/team3/foldy/dev/db_url         → RDS 엔드포인트 (terraform apply 후 등록)
/team3/foldy/dev/db_username    → RDS 마스터 계정 이름
/team3/foldy/dev/jwt_secret     → JWT 서명 시크릿

/team3/foldy/prod/db_password
/team3/foldy/prod/db_url
/team3/foldy/prod/db_username
/team3/foldy/prod/jwt_secret

네이밍 규칙: /team3/foldy/{env}/{key}

1단계 — Secrets Manager에 값 등록

AWS 콘솔에서 등록하거나 CLI로 등록

CLI 방법:
aws secretsmanager create-secret \
  --name /team3/foldy/dev/db_password \
  --secret-string "실제패스워드값" \
  --region ap-northeast-2

⚠️ db_url은 terraform apply로 RDS 생성 후 등록
   terraform output rds_endpoint 값을 사용

2단계 — Terraform에서 db_password 가져오기

기존 방식 (tfvars 평문)
  db_password = "직접입력한값"

변경 방식 (Secrets Manager 참조)
  terraform apply 전에 Secrets Manager에 값이 있어야 함

infra/envs/dev/main.tf에 data 블록 추가
  data "aws_secretsmanager_secret_version" 사용
  찾아볼 것: "terraform aws_secretsmanager_secret_version"

연결 방법:
  module "rds" {
    db_password = data.aws_secretsmanager_secret_version.db_password.secret_string
  }

이러면 terraform.tfvars에서 db_password 변수 삭제 가능
dev/variables.tf에서도 db_password 변수 삭제 가능

3단계 — External Secrets Operator 설치

K8s Pod에 Secrets Manager 값을 자동 주입해주는 도구

설치 방법 (Helm):
  찾아볼 것: "external secrets operator helm install"

설치 후 확인:
  kubectl get pods -n external-secrets

⚠️ IRSA 설정이 필요함
   ESO Pod가 Secrets Manager에 접근하려면
   IAM 권한이 있어야 함
   Terraform IAM 모듈에 ESO용 Role 추가 필요
   찾아볼 것: "external secrets operator IRSA EKS"

4단계 — IAM 권한 추가 (Terraform)

iam/main.tf에 ESO용 IRSA Role 추가 필요

허용해야 할 액션:
  secretsmanager:GetSecretValue
  secretsmanager:DescribeSecret

Resource는 /team3/foldy/* 경로로 제한
  arn:aws:secretsmanager:ap-northeast-2:<계정ID>:secret:/team3/foldy/*

terraform output으로 eso_irsa_role_arn 출력 추가
→ ServiceAccount annotation에 사용

5단계 — K8s 매니페스트 수정

기존 secret.yaml 방식 (base64 직접 입력) 대신
ExternalSecret 리소스로 교체

team3-config/base/ 에 추가할 파일:
  externalsecret.yaml  → Secrets Manager 값을 K8s Secret으로 변환
  secretstore.yaml     → Secrets Manager 연결 설정

흐름:
  SecretStore → "어느 Secrets Manager에 접근할지"
  ExternalSecret → "어떤 값을 가져와서 어떤 K8s Secret으로 만들지"

결과:
  ESO가 자동으로 foldy-secret 을 생성
  기존 secret.yaml 삭제 가능
  .gitignore에서 secret.yaml 제거 가능

찾아볼 것: "external secrets operator SecretStore ExternalSecret"