콘텐츠로 이동

Service CI DB

platform/service-ci-db/는 CI 서비스만 쓰는 PostgreSQL을 관리한다. state key는 platform/service-ci-db/terraform.tfstate이며 platform/service-network 다음에 적용한다. platform/service-network의 VPC와 보안 그룹 출력을 읽는다.

개인정보를 다루는 CI 서비스의 데이터를 Service DB와 물리적으로 분리하려고 인스턴스를 따로 둔다. 마스터 시크릿, 스토리지 암호화 키, 스냅샷, 보안 그룹이 모두 별개다.

관리하는 것 다른 루트에서 관리하는 것
RDS 인스턴스와 파라미터 그룹 VPC, 프라이빗 서브넷, 보안 그룹
DB 서브넷 그룹 CI EC2와 IAM 역할
스토리지 암호화 KMS 키 데이터베이스 사용자
인스턴스 상태 리소스

접속 방식

CI는 ci 사용자의 비밀번호로 접속한다. IAM 데이터베이스 인증은 끄고, CI 인스턴스 롤에 rds-db:connect를 주지 않는다. 비밀번호는 Terraform 코드와 인스턴스 user_data에 없다. service-ci 저장소의 GitHub 시크릿 DB_PASSWORD에 등록하고, 배포 워크플로가 릴리스 아티팩트의 .env에 써서 보낸다. 앱은 run.sh가 .env를 읽어 DB_PASSWORD 환경 변수로 받는다. 같은 값이 Service CI DB Init의 ci_db_password 입력으로 데이터베이스 사용자에 설정된다.

스토리지, 스냅샷, 자동 백업은 이 루트의 KMS 키(alias/<프로젝트>-service-ci-db-storage)로 암호화한다. 키는 자동 회전하고 삭제 대기 기간은 30일이다.

파라미터 그룹에서 rds.force_ssl을 1로 두어 평문 연결을 막는다.

마스터 비밀번호는 manage_master_user_password로 AWS가 Secrets Manager에 보관하고 교체한다. 사용자 생성과 권한 부여에만 쓴다. 시크릿 하나당 월 0.40 USD가 든다.

인스턴스 상태

중지한 RDS는 7일 뒤 AWS가 다시 켠다. aws_rds_instance_state가 db_state 변수를 따르고, 예약 워크플로가 이 루트를 주기적으로 apply해 선언한 상태로 되돌린다. 자세한 내용은 RDS 상태 유지에 있다.

입력

입력 기본값
db_instance_class db.t4g.micro
db_allocated_storage 20
db_max_allocated_storage 100
db_name cidb
db_master_username dbadmin
db_iam_user ci
db_multi_az false
db_backup_retention_days 7
db_state available

출력

출력 용도
db_endpoint, db_port, db_name, db_iam_user CI 환경 변수
db_identifier 예약 워크플로의 상태 조회
db_master_secret_arn 마스터 비밀번호 시크릿
master_secret_read_policy_arn identity/groups.yaml 의 policy_arns 에 등록

적용 후 할 일

데이터베이스 안의 사용자와 권한은 Service CI DB Init이 관리한다. Terraform은 데이터베이스 내부를 인스턴스 루트에서 다루지 않는다.