103 V1 IaC Input Spec - 100-hours-a-week/KTB4-3rd-CLOUD GitHub Wiki

V1 ์•„ํ‚คํ…์ฒ˜ IaC ์ž…๋ ฅ ๋ช…์„ธ

๊ธฐ์ค€ ๋ฌธ์„œ

1. ๋ชฉ์ ๊ณผ ๊ฐ’์˜ ์ƒํƒœ

์ด ๋ฌธ์„œ๋Š” V1 ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฐ์ •์„ Terraform ๋“ฑ์˜ IaC ์ฝ”๋“œ์— ๋ฐ”๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌ์†Œ์Šค, ๋ณ€์ˆ˜, ๊ถŒํ•œ๊ณผ ๋ฏธ๊ฒฐ์ • ๊ฐ’์„ ๋ถ„๋ฆฌํ•œ๋‹ค. ์•„์ง ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์™€ ์šด์˜ ์ •์ฑ…์œผ๋กœ ํ™•์ •๋˜์ง€ ์•Š์€ ์ˆ˜์น˜๋ฅผ ํ™•์ • ์‚ฌ์–‘์œผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ƒํƒœ ์˜๋ฏธ
ํ™•์ • ๊ธฐ์ค€ ๋ฌธ์„œ์— ์ง์ ‘ ๋ช…์‹œ๋œ ๊ฐ’
์ดˆ๊ธฐ ๊ถŒ์žฅ IaC ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ๊ฐ’. ๋ฐฐํฌ ์ „ ๊ฒ€ํ†  ํ•„์š”
๊ฒฐ์ • ํ•„์š” ์‹ค์ œ ๊ณ„์ •, ๋„คํŠธ์›Œํฌ, ๋„๋ฉ”์ธ ๋˜๋Š” ์šด์˜ ์ •์ฑ… ์ž…๋ ฅ ํ•„์š”

2. IaC๊ฐ€ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ •

๊ตฌ๋ถ„ ๊ฐ’ ์ƒํƒœ
AWS ๋ฆฌ์ „ ap-northeast-2 (์„œ์šธ) ํ™•์ •
ํ™˜๊ฒฝ dev, prod ํ™•์ •
์ปดํ“จํŒ… ํ™˜๊ฒฝ๋ณ„ EC2 1๋Œ€, ์ด 2๋Œ€ ํ™•์ •
ํ™˜๊ฒฝ ๊ฒฉ๋ฆฌ Dev์™€ Prod๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ EC2๋กœ ๋ถ„๋ฆฌ ํ™•์ •
๋ฐฐ์น˜ ๋ฐฉ์‹ ๊ฐ EC2์—์„œ Docker Compose ์‹คํ–‰ ํ™•์ •
์™ธ๋ถ€ ์ง„์ž…์  ๊ฐ EC2์˜ Nginx 80, 443๋งŒ ๊ณต๊ฐœ ํ™•์ •
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ Next.js, Spring Boot, ์„ ํƒ์ ์ธ FastAPI ํ™•์ •
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™˜๊ฒฝ๋ณ„ EC2์˜ MySQL ์ปจํ…Œ์ด๋„ˆ ํ™•์ •
๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ ํ™•์ •
NAT Gateway ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ ํ™•์ •
์„œ๋ธŒ๋„ท ์ธํ„ฐ๋„ท ๊ฒŒ์ดํŠธ์›จ์ด ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” Public Subnet ํ™•์ •
์šด์˜ ์ ‘์† Prod๋Š” SSM, Dev๋Š” SSM ๋ฐ ์ œํ•œ๋œ SSH ํ™•์ •
์ด๋ฏธ์ง€ ์ €์žฅ์†Œ Amazon ECR ํ™•์ •
๋กœ๊ทธ CloudWatch Logs๋กœ ์™ธ๋ถ€ ๋ณด์กด ํ™•์ •
๋ฐฑ์—…ยท์‚ฌ์šฉ์ž ํŒŒ์ผ S3์— ์ €์žฅํ•˜๊ณ  ์šฉ๋„์™€ ํ™˜๊ฒฝ๋ณ„๋กœ ๋ถ„๋ฆฌ ํ™•์ •
๋ฐฐํฌ ์ธ์ฆ GitHub Actions OIDC๋กœ AWS Role ์‚ฌ์šฉ ํ™•์ •
๊ณ ๊ฐ€์šฉ์„ฑ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ. ํ™˜๊ฒฝ๋ณ„ EC2๊ฐ€ ๋‹จ์ผ ์žฅ์• ์  ํ™•์ •

2.1 ๋‹จ์ผ AZ ๊ธฐ์ค€ ์ ์šฉ ์ˆ˜์น˜

์•„๋ž˜ ๊ฐ’์€ V1 Terraform์˜ ๊ธฐ๋ณธ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์‹ค์ œ ๊ฐ’ ์—†์ด๋Š” ์ •ํ•  ์ˆ˜ ์—†๋Š” ํŒ€ ๊ณต์ธ IP์™€ ๋„๋ฉ”์ธ๋งŒ ํ•„์ˆ˜ ๋ณ€์ˆ˜๋กœ ๋‚จ๊ธด๋‹ค.

VPC, Subnet, Route Table

ํ•ญ๋ชฉ ๊ฐ’
Region ap-northeast-2
VPC ์ˆ˜ 1
VPC CIDR 10.20.0.0/16
DNS support / hostname true / true
Instance tenancy default
IPv6 CIDR ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
Availability Zone ์ˆ˜ 1
Availability Zone ap-northeast-2a
Public Subnet ์ˆ˜ 1
Prod Subnet 10.20.10.0/24, ap-northeast-2a
Dev Subnet 10.20.20.0/24, ap-northeast-2a
map_public_ip_on_launch false โ€” EC2๋ณ„ EIP ์‚ฌ์šฉ
Internet Gateway 1๊ฐœ
NAT Gateway 0๊ฐœ
Elastic IP 2๊ฐœ โ€” Dev 1, Prod 1
Route Table 2๊ฐœ โ€” Dev 1, Prod 1
๊ฐ Route Table local route 10.20.0.0/16 -> local
๊ฐ Route Table public route 0.0.0.0/0 -> Internet Gateway
Custom Network ACL 0๊ฐœ โ€” VPC default NACL ์‚ฌ์šฉ

๋‹จ์ผ AZ์ด๋ฏ€๋กœ AZ ์žฅ์•  ์‹œ Dev์™€ Prod๊ฐ€ ๋™์‹œ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. ์ด ๊ตฌ์„ฑ์€ ํ™˜๊ฒฝ๋ณ„ ๋ฐฐํฌ์™€ ๋ฆฌ์†Œ์Šค ๊ฒฝํ•ฉ์€ ๋ถ„๋ฆฌํ•˜์ง€๋งŒ ๊ฐ€์šฉ ์˜์—ญ ์žฅ์• ๋ฅผ ๊ฒฉ๋ฆฌํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

EC2

ํ•ญ๋ชฉ Dev Prod
์ธ์Šคํ„ด์Šค ์ˆ˜ 1 1
Instance type t3.medium t3.medium
vCPU / Memory 2 vCPU / 4 GiB 2 vCPU / 4 GiB
Architecture x86_64 x86_64
AMI Ubuntu 24.04 LTS (Noble) ์ตœ์‹  x86_64 SSM parameter ๋™์ผ
AMI parameter /aws/service/canonical/ubuntu/server/noble/stable/current/amd64/hvm/ebs-gp3/ami-id ๋™์ผ
OS ์ ‘์† ์‚ฌ์šฉ์ž ubuntu ubuntu
Root EBS gp3, 30 GiB, 3,000 IOPS, 125 MiB/s ๋™์ผ
Data EBS gp3, 30 GiB, 3,000 IOPS, 125 MiB/s gp3, 30 GiB, 3,000 IOPS, 125 MiB/s
EBS encryption true true
Root delete on termination true true
Data delete on termination false false
Data mount /mnt/docker-data /mnt/docker-data
Elastic IP 1 1
Detailed monitoring false โ€” ๊ธฐ๋ณธ 5๋ถ„ metric false โ€” ๊ธฐ๋ณธ 5๋ถ„ metric
IMDS endpoint enabled, token required, hop limit 2 ๋™์ผ
EC2 key pair ๊ธฐ์กด Dev ์šด์˜์ž key ์ด๋ฆ„ null
์šด์˜ ์ ‘์† ์ œํ•œ๋œ SSH SSM only

Security Group

ํ™˜๊ฒฝ Ingress ๊ทœ์น™ ์ˆ˜ Egress ๊ทœ์น™ ์ˆ˜ IPv6 ๊ทœ์น™ ์ˆ˜
Prod 2 1 0
Dev 3 1 0

Prod๋Š” 80/443์„ 0.0.0.0/0์— ๊ณต๊ฐœํ•˜๊ณ  SSH ๊ทœ์น™์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. Dev์˜ 80/443์€ dev_qa_cidrs, 22๋Š” admin_cidrs์˜ ์‹ค์ œ ๊ณต์ธ IPv4 /32 ๋ชฉ๋ก๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. ๋‘ ๋ชฉ๋ก์—๋Š” 0.0.0.0/0๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์–‘์ชฝ ํ™˜๊ฒฝ์˜ egress๋Š” tcp/443 -> 0.0.0.0/0 ํ•œ ๊ฐœ๋‹ค.

IAM

ํ•ญ๋ชฉ ์ˆ˜์น˜/๊ฐ’
EC2 IAM role 2๊ฐœ โ€” moyeota-ec2-dev, moyeota-ec2-prod
Instance profile 2๊ฐœ
GitHub Actions role 3๊ฐœ โ€” CI, Dev CD, Prod CD
GitHub OIDC provider 1๊ฐœ
์ด IAM role 5๊ฐœ
Role max session duration 3,600์ดˆ
EC2 managed policy AmazonSSMManagedInstanceCore 1๊ฐœ์”ฉ ์—ฐ๊ฒฐ
EC2 custom policy ํ™˜๊ฒฝ๋ณ„ 1๊ฐœ
GitHub OIDC audience sts.amazonaws.com

EC2 custom policy๋Š” ECR pull 4๊ฐœ action, CloudWatch Logs 3๊ฐœ action๊ณผ ์ž๊ธฐ ํ™˜๊ฒฝ์˜ S3 backup/deployment prefix ์ ‘๊ทผ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. GitHub role trust์˜ sub์—๋Š” ์‹ค์ œ FE, BE, AI, CLOUD repository์™€ branch ๋˜๋Š” GitHub Environment๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

ECR

ํ•ญ๋ชฉ ์ˆ˜์น˜/๊ฐ’
Repository ์ˆ˜ 4๊ฐœ
Repository moyeota/nginx, moyeota/fe, moyeota/be, moyeota/ai
Tag mutability IMMUTABLE
Scan on push true
Encryption AES256
Force delete false
dev-* ๋ณด์กด repository๋ณ„ ์ตœ๊ทผ 20๊ฐœ
rc-* ๋ณด์กด repository๋ณ„ ์ตœ๊ทผ 10๊ฐœ
prod-* ๋ณด์กด repository๋ณ„ ์ตœ๊ทผ 10๊ฐœ
Untagged image 7์ผ ํ›„ ์‚ญ์ œ

๋ฐฐํฌ์—๋Š” tag๊ฐ€ ์•„๋‹Œ @sha256:<digest>๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์งˆ๋ฌธ์—์„œ ์ค‘๋ณต๋œ ECR ํ•ญ๋ชฉ์€ repository ์„ค์ •๊ณผ EC2์˜ ECR pull ๊ถŒํ•œ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ฐ˜์˜ํ•œ๋‹ค.

SSM

ํ•ญ๋ชฉ ์ˆ˜์น˜/๊ฐ’
SSM managed instance 2๋Œ€
SSM VPC endpoint 0๊ฐœ โ€” Public Subnet์˜ HTTPS egress ์‚ฌ์šฉ
Session idle timeout 20๋ถ„
Maximum session duration 60๋ถ„
Run Command document AWS-RunShellScript
Command execution timeout 900์ดˆ
Max concurrency 1
Max errors 0
Prod SSH ingress 0๊ฐœ

Secret์„ Parameter Store์— ๋‘˜ ๊ฒฝ์šฐ ๊ฒฝ๋กœ๋งŒ IaC์—์„œ ๋งŒ๋“ค๊ณ  ์‹ค์ œ SecureString ๊ฐ’์€ Terraform ๋ฐ–์—์„œ ์ฃผ์ž…ํ•œ๋‹ค. V1 ํ•„์ˆ˜ secret์€ ํ™˜๊ฒฝ๋ณ„ MySQL ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ, MySQL root ๋น„๋ฐ€๋ฒˆํ˜ธ, JWT secret์˜ 3๊ฐœ์ด๋ฉฐ Dev/Prod ํ•ฉ๊ณ„ 6๊ฐœ๋‹ค. AI ํ™œ์„ฑํ™” ์‹œ ํ™˜๊ฒฝ๋ณ„ ์™ธ๋ถ€ API key๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

CloudWatch

ํ•ญ๋ชฉ Dev Prod
App log group 5๊ฐœ 5๊ฐœ
SSM session log group 1๊ฐœ 1๊ฐœ
์ด log group 6๊ฐœ 6๊ฐœ
Log retention 14์ผ 30์ผ
CloudWatch Agent metric interval 60์ดˆ 60์ดˆ
EC2 alarm 4๊ฐœ 4๊ฐœ

ํ™˜๊ฒฝ๋ณ„ alarm ์ดˆ๊ธฐ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Alarm Threshold Period / Evaluation
CPU high CPUUtilization >= 80% 300์ดˆ x 3ํšŒ
Instance status failed StatusCheckFailed >= 1 60์ดˆ x 2ํšŒ
Memory high mem_used_percent >= 85% 300์ดˆ x 3ํšŒ
Data disk high disk_used_percent >= 80% 300์ดˆ x 3ํšŒ

์•Œ๋žŒ ์ˆ˜์‹ ์šฉ SNS topic์€ ๊ณต์šฉ 1๊ฐœ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ค์ œ ๊ตฌ๋… ์ด๋ฉ”์ผ ๋˜๋Š” ChatOps endpoint๋Š” ๋ณ„๋„ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค.

Route 53

ํ•ญ๋ชฉ ์ˆ˜์น˜/๊ฐ’
Hosted Zone ๊ธฐ์กด public hosted zone 1๊ฐœ ์‚ฌ์šฉ
A record 2๊ฐœ
Prod record app.<domain> -> Prod EIP
Dev record dev.<domain> -> Dev EIP
TTL 300์ดˆ
Alias record false โ€” EIP ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜ A record
AAAA record 0๊ฐœ
Route 53 health check 0๊ฐœ
Failover/weighted policy ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

์‹ค์ œ <domain>, hosted zone ID, dev_qa_cidrs, admin_cidrs, Dev key pair ์ด๋ฆ„๊ณผ ์•Œ๋žŒ ๊ตฌ๋… ๋Œ€์ƒ์€ apply ์ „ ํ•„์ˆ˜ ์ž…๋ ฅ๊ฐ’์ด๋‹ค.

3. Terraform ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก

์˜์—ญ Terraform ๋ฆฌ์†Œ์Šค ์˜ˆ์‹œ ์ˆ˜๋Ÿ‰/๋ฒ”์œ„ ์ฃผ์š” ์ž…๋ ฅ
Provider aws provider 1 ap-northeast-2, ๊ณตํ†ต ํƒœ๊ทธ
Network aws_vpc 1 VPC CIDR
Network aws_internet_gateway 1 VPC ์—ฐ๊ฒฐ
Network aws_subnet 2 Dev/Prod Public CIDR, AZ
Network aws_route_table, association ํ™˜๊ฒฝ๋ณ„ 1 0.0.0.0/0 -> IGW
Address aws_eip 2 Dev/Prod EC2 ๊ณ ์ • ๊ณต์ธ IP
Security aws_security_group 2 ํ™˜๊ฒฝ๋ณ„ ingress/egress
Compute aws_instance ๋˜๋Š” EC2 module 2 AMI, type, profile, user data
Storage root EBS EC2๋ณ„ 1 encrypted gp3
Storage ๋ณ„๋„ data EBS EC2๋ณ„ 1 ๊ถŒ์žฅ Docker/MySQL ์˜์† ๋ฐ์ดํ„ฐ
IAM EC2 role, instance profile ํ™˜๊ฒฝ๋ณ„ 1 SSM, ECR pull, S3, Logs
Registry aws_ecr_repository 4 nginx, fe, be, ai
Object storage aws_s3_bucket 3 ๊ถŒ์žฅ backup, upload, deployment
Logging aws_cloudwatch_log_group ํ™˜๊ฒฝยท์„œ๋น„์Šค๋ณ„ retention, encryption
DNS aws_route53_record 2 Prod/Dev ๋„๋ฉ”์ธ -> EIP
CI/CD IAM GitHub OIDC provider์™€ roles provider 1, role 3 ๊ถŒ์žฅ CI, Dev CD, Prod CD
Secret path SSM Parameter Store ๋˜๋Š” Secrets Manager ํ™˜๊ฒฝ๋ณ„ ์ด๋ฆ„๋งŒ IaC ๊ด€๋ฆฌ, ๊ฐ’์€ ๋ณ„๋„ ์ฃผ์ž…
State ์›๊ฒฉ state S3์™€ ์ž ๊ธˆ bootstrap 1์‹ workload์™€ ๋ถ„๋ฆฌ

IPv6, ALB, NAT Gateway, RDS, Auto Scaling Group์€ V1 ๋ฒ”์œ„์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

4. ํ™˜๊ฒฝ๋ณ„ ์ดˆ๊ธฐ ์ž…๋ ฅ๊ฐ’

๋‹ค์Œ ๊ฐ’์€ IaC ๊ณจ๊ฒฉ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ ๊ถŒ์žฅ๊ฐ’์ด๋‹ค. ํŠนํžˆ ์ธ์Šคํ„ด์Šค์™€ ๋ณผ๋ฅจ ํฌ๊ธฐ๋Š” ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๋ฐ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ฆ๊ฐ€๋Ÿ‰์œผ๋กœ ์กฐ์ •ํ•œ๋‹ค.

๋ณ€์ˆ˜ Dev Prod ์ƒํƒœ/๊ทผ๊ฑฐ
environment dev prod ํ™•์ •
aws_region ap-northeast-2 ap-northeast-2 ํ™•์ •
vpc_cidr 10.20.0.0/16 ๊ณต์šฉ 10.20.0.0/16 ๊ณต์šฉ ์ดˆ๊ธฐ ๊ถŒ์žฅ, ์‚ฌ๋‚ด/VPN CIDR ์ถฉ๋Œ ํ™•์ธ
subnet_cidr 10.20.20.0/24 10.20.10.0/24 ์ดˆ๊ธฐ ๊ถŒ์žฅ
availability_zone ap-northeast-2a ap-northeast-2a ๋‹จ์ผ AZ ๊ธฐ์ค€, ๊ณ„์ •์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ
public_ip EIP 1๊ฐœ EIP 1๊ฐœ ์ดˆ๊ธฐ ๊ถŒ์žฅ, DNS์™€ stop/start ์•ˆ์ •์„ฑ
ami_architecture x86_64 x86_64 ํ˜„์žฌ ์ด๋ฏธ์ง€ build ๋Œ€์ƒ linux/amd64์™€ ์ผ์น˜
ami ์ตœ์‹  Ubuntu 24.04 LTS SSM parameter ์กฐํšŒ ๋™์ผ ์ดˆ๊ธฐ ๊ถŒ์žฅ, AMI ID ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€
instance_type t3.medium t3.large ์ดˆ๊ธฐ ๊ถŒ์žฅ, AI ๋น„ํ™œ์„ฑ ๊ธฐ์ค€
root_volume_type gp3 gp3 ์ดˆ๊ธฐ ๊ถŒ์žฅ
root_volume_size_gib 30 30 ์ดˆ๊ธฐ ๊ถŒ์žฅ
data_volume_type gp3 gp3 ์ดˆ๊ธฐ ๊ถŒ์žฅ
data_volume_size_gib 30 50 ์ดˆ๊ธฐ ๊ถŒ์žฅ, DBยท์ด๋ฏธ์ง€ ์ฆ๊ฐ€๋Ÿ‰์œผ๋กœ ์กฐ์ •
ebs_encrypted true true ์ดˆ๊ธฐ ๊ถŒ์žฅ
delete_data_volume_on_termination false false ์ดˆ๊ธฐ ๊ถŒ์žฅ
ai_enabled false false V1 ๊ธฐ๋ณธ๊ฐ’
log_retention_days 14 30 ์ดˆ๊ธฐ ๊ถŒ์žฅ
backup_retention_days 7 30 ์ดˆ๊ธฐ ๊ถŒ์žฅ, RPO/RTO ๊ฒฐ์ • ํ›„ ํ™•์ •
stop_when_unused true false Dev ๋น„์šฉ ์ ˆ๊ฐ ๋ฐฉ์นจ

์ปจํ…Œ์ด๋„ˆ ์ œํ•œ์˜ ํ•ฉ๊ณ„๋Š” AI๋ฅผ ์ œ์™ธํ•ด๋„ CPU 2.0, ๋ฉ”๋ชจ๋ฆฌ ์•ฝ 2.125 GiB๋‹ค. OS, Docker daemon, ๋กœ๊ทธ ์ˆ˜์ง‘๊ธฐ, ํŒŒ์ผ ์บ์‹œ์™€ ๋ฐฐํฌ ์ž‘์—…์˜ ์—ฌ์œ ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ Dev๋Š” t3.medium์„ ์‹œ์ž‘์ ์œผ๋กœ, Prod๋Š” t3.large๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ๋‘”๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ ๋ณด์žฅ๊ฐ’์ด ์•„๋‹ˆ๋ฉฐ HTTP p95/p99, WebSocket ๋™์‹œ ์—ฐ๊ฒฐ, JVM GC, MySQL buffer์™€ OOM ๋ฐœ์ƒ ์—ฌ๋ถ€๋กœ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค. FastAPI๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ณ„๋„ ์ธก์ • ํ›„ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ๋‹ค์‹œ ์„ ํƒํ•œ๋‹ค.

4.1 EC2 ๋‚ด๋ถ€ Compose ๊ณ„์•ฝ

IaC๊ฐ€ ์ง์ ‘ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ธ์Šคํ„ด์Šค ํฌ๊ธฐ์™€ Security Group ๊ฒ€์ฆ์—๋Š” ๋‹ค์Œ ์‹คํ–‰ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์„œ๋น„์Šค ๋‚ด๋ถ€ ํฌํŠธ ์™ธ๋ถ€ ๊ณต๊ฐœ CPU Memory Swap ์˜์† ๋ฐ์ดํ„ฐ
Nginx 80/443 Host 80/443 0.25 128 MB ์—†์Œ ์ธ์ฆ์„œ read-only mount
Next.js 3000 ์—†์Œ 0.50 512 MB ์—†์Œ ์—†์Œ
Spring Boot 8080 ์—†์Œ 0.75 768 MB 256 MB ์—†์Œ
MySQL 3306 ์—†์Œ 0.50 768 MB ์—†์Œ named volume -> data EBS
FastAPI 8000 ์—†์Œ ์ธก์ • ํ•„์š” ์ธก์ • ํ•„์š” ์ธก์ • ํ•„์š” V1 ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ
/       -> frontend:3000
/api/*  -> backend:8080
/ws/*   -> backend:8080 (WebSocket Upgrade)
/ai/*   -> ai:8000 (์„ ํƒ ๊ธฐ๋Šฅ)

5. ๋ณด์•ˆ ๊ทธ๋ฃน ๊ทœ์น™

5.1 Prod EC2

๋ฐฉํ–ฅ Protocol Port Source/Destination ์„ค๋ช…
Ingress TCP 80 0.0.0.0/0 HTTPS redirect ๋˜๋Š” ์ธ์ฆ์„œ ๋ฐœ๊ธ‰
Ingress TCP 443 0.0.0.0/0 Nginx HTTPS
Egress TCP 443 0.0.0.0/0 ECR, S3, SSM, CloudWatch, ์™ธ๋ถ€ API

Prod์—๋Š” 22๋ฒˆ ingress๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ์šด์˜ ์ ‘์†๊ณผ ๋ฐฐํฌ๋Š” SSM์„ ์‚ฌ์šฉํ•œ๋‹ค.

5.2 Dev EC2

๋ฐฉํ–ฅ Protocol Port Source/Destination ์„ค๋ช…
Ingress TCP 80 dev_qa_cidrs ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, HTTPS redirect
Ingress TCP 443 dev_qa_cidrs ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ HTTPS
Ingress TCP 22 admin_cidrs ์ž„์‹œ ์šด์˜ SSH
Egress TCP 443 0.0.0.0/0 ECR, S3, SSM, CloudWatch, ์™ธ๋ถ€ API

dev_qa_cidrs์™€ admin_cidrs๋Š” /32 ๋˜๋Š” ์กฐ์ง์˜ ๊ณ ์ • CIDR๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. ๋‘ ๋ณ€์ˆ˜์— 0.0.0.0/0๊ฐ€ ๋“ค์–ด์˜ค๋ฉด plan ๋‹จ๊ณ„์˜ validation์œผ๋กœ ์‹คํŒจ์‹œํ‚จ๋‹ค.

AWS Security Group์˜ ๋ชฉ์ ์ง€๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ CIDR, Security Group ๋˜๋Š” Prefix List๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์„œ์˜ "์™ธ๋ถ€ ์ „์ฒด ๋˜๋Š” ํ—ˆ์šฉ ๋„๋ฉ”์ธ" ์ค‘ V1 IaC๋กœ ์ง์ ‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ tcp/443 -> 0.0.0.0/0์ด๋‹ค. ๋„๋ฉ”์ธ ๋‹จ์œ„ egress ํ†ต์ œ๊ฐ€ ํ•„์ˆ˜๋ผ๋ฉด HTTP proxy, DNS Firewall, Network Firewall ๋“ฑ์˜ ๋ณ„๋„ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ V1 ์ตœ์†Œ ๊ตฌ์„ฑ์—๋Š” ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

6. EC2์™€ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ

6.1 EC2 ๊ณตํ†ต ํƒœ๊ทธ

Project     = moyeota
Environment = dev | prod
ManagedBy   = terraform
Service     = compose-host
Owner       = cloud

6.2 user data ๋˜๋Š” ์ด๋ฏธ์ง€ ๋นŒ๋“œ๊ฐ€ ์ค€๋น„ํ•  ํ•ญ๋ชฉ

  1. Docker Engine๊ณผ Docker Compose v2 ์„ค์น˜
  2. SSM Agent์™€ CloudWatch Agent ์„ค์น˜ยทํ™œ์„ฑํ™”
  3. data EBS format/mount ๋ฐ ์žฌ๋ถ€ํŒ… ํ›„ ์ž๋™ mount
  4. Docker data-root๋ฅผ data EBS๋กœ ์ง€์ •
  5. /opt/moyeota/{deploy,certs,backup} ์ƒ์„ฑ๊ณผ ๊ถŒํ•œ ์„ค์ •
  6. /opt/moyeota/deploy/runtime.env์™€ release.env๋ฅผ 0600์œผ๋กœ ๊ด€๋ฆฌ
  7. CloudWatch ๋กœ๊ทธ ์ „์†ก ์„ค์ •
  8. ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฌ์šฉํ•  AWS region๊ณผ ํ™˜๊ฒฝ๋ช… ์„ค์ •

MySQL named volume์„ root EBS๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณ„๋„ data EBS์— ๋ณด์กดํ•˜๋ ค๋ฉด Docker์˜ data-root๋ฅผ data EBS mount ์•„๋ž˜๋กœ ์ด๋™ํ•œ๋‹ค. ์ด ์„ค์ • ์—†์ด EC2๋ฅผ ๊ต์ฒดํ•˜๋ฉด named volume๋„ ํ•จ๊ป˜ ์žƒ์„ ์ˆ˜ ์žˆ๋‹ค. Prod data volume์€ Terraform์˜ ์‹ค์ˆ˜๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š๋„๋ก ๋ณ„๋„์˜ ๋ณดํ˜ธ ์ •์ฑ…๊ณผ ์‚ญ์ œ ์ „ ์ˆ˜๋™ ์Šน์ธ ์ ˆ์ฐจ๋ฅผ ๋‘”๋‹ค.

์‹ค์ œ ๋น„๋ฐ€๋ฒˆํ˜ธ, JWT Secret, ์™ธ๋ถ€ API key, ์ธ์ฆ์„œ private key๋ฅผ user data, Terraform variable, tfvars, output์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. IaC๋Š” secret์˜ ๊ฒฝ๋กœ์™€ ์ ‘๊ทผ ๊ถŒํ•œ๋งŒ ๋งŒ๋“ค๊ณ , ์‹ค์ œ ๊ฐ’์€ ๋ฐฐํฌ ๊ณผ์ •์—์„œ ๋ณ„๋„๋กœ ์ฃผ์ž…ํ•œ๋‹ค.

7. IAM ๊ถŒํ•œ ๋งคํŠธ๋ฆญ์Šค

7.1 EC2 instance role

Dev์™€ Prod role์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฐ ํ™˜๊ฒฝ์˜ S3 prefix์™€ CloudWatch log group๋งŒ ์ ‘๊ทผํ•˜๊ฒŒ ํ•œ๋‹ค.

๋ชฉ์  ์ตœ์†Œ action ๋ฒ”์œ„
SSM ์ ‘์† AWS managed policy AmazonSSMManagedInstanceCore
ECR ์ธ์ฆ ecr:GetAuthorizationToken (Resource = *)
ECR pull ecr:BatchCheckLayerAvailability, ecr:GetDownloadUrlForLayer, ecr:BatchGetImage๋ฅผ 4๊ฐœ repository ARN์œผ๋กœ ์ œํ•œ
DB ๋ฐฑ์—… ์—…๋กœ๋“œ s3:PutObject, ํ•„์š”ํ•œ multipart action์„ ์ž๊ธฐ ํ™˜๊ฒฝ์˜ backup prefix๋กœ ์ œํ•œ
๋ฐฐํฌ bundle ์กฐํšŒ s3:GetObject๋ฅผ ์ž๊ธฐ ํ™˜๊ฒฝ์˜ deployment prefix๋กœ ์ œํ•œ
๋กœ๊ทธ ์ „์†ก logs:CreateLogStream, logs:DescribeLogStreams, logs:PutLogEvents๋ฅผ ์ž๊ธฐ ํ™˜๊ฒฝ log group์œผ๋กœ ์ œํ•œ

s3:*, ecr:*, logs:*์™€ ๊ฐ™์€ ๊ด‘๋ฒ”์œ„ ๊ถŒํ•œ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

7.2 GitHub Actions OIDC roles

Role ์‚ฌ์šฉ ์ฃผ์ฒด ๊ถŒํ•œ
moyeota-ci-ecr-push FE/BE/AI/CLOUD ์ด๋ฏธ์ง€ workflow ECR ์ธ์ฆ๊ณผ ๋Œ€์ƒ repository push
moyeota-cd-dev CLOUD Dev environment Dev deployment prefix upload, Dev EC2์— SSM command ์‹คํ–‰ยท๊ฒฐ๊ณผ ์กฐํšŒ
moyeota-cd-prod CLOUD Prod environment Prod deployment prefix upload, Prod EC2์— SSM command ์‹คํ–‰ยท๊ฒฐ๊ณผ ์กฐํšŒ

OIDC provider๋Š” https://token.actions.githubusercontent.com, audience๋Š” sts.amazonaws.com์„ ์‚ฌ์šฉํ•œ๋‹ค. Trust policy์˜ sub ์กฐ๊ฑด์„ ์กฐ์ง ์ „์ฒด wildcard๋กœ ๋‘์ง€ ์•Š๊ณ  ์‹ค์ œ repository์™€ branch ๋˜๋Š” GitHub Environment๋กœ ์ œํ•œํ•œ๋‹ค. Prod role์€ GitHub์˜ Prod Environment ์Šน์ธ ์ดํ›„์—๋งŒ assumeํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค.

8. ECR, S3์™€ CloudWatch

8.1 ECR repositories

์ด๋ฆ„ ์„ค์ •
moyeota/nginx tag immutable, scan on push, AES256
moyeota/fe tag immutable, scan on push, AES256
moyeota/be tag immutable, scan on push, AES256
moyeota/ai tag immutable, scan on push, AES256

์ด๋ฏธ์ง€๋Š” dev-<sha7>, rc-v<version>-<sha7>, prod-v<version>-<sha7> tag๋กœ pushํ•˜๋˜ ๋ฐฐํฌ manifest์—๋Š” tag๊ฐ€ ์•„๋‹Œ @sha256:<digest>๋ฅผ ์ €์žฅํ•œ๋‹ค. MySQL๋„ floating tag๊ฐ€ ์•„๋‹Œ digest๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

8.2 S3 buckets

๋ฒ„ํ‚ท ์ด๋ฆ„์€ ์ „์—ญ ์œ ์ผ์„ฑ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ AWS account ID ๋˜๋Š” ๋ณ„๋„ suffix๋ฅผ ํฌํ•จํ•œ๋‹ค.

๋…ผ๋ฆฌ ์ด๋ฆ„ ์ด๋ฆ„ ์˜ˆ์‹œ Prefix ์ดˆ๊ธฐ lifecycle
Deployment moyeota-<account-id>-deployments dev/, prod/ 7์ผ ํ›„ ์‚ญ์ œ
DB backup moyeota-<account-id>-backups dev/mysql/, prod/mysql/ Dev 7์ผ, Prod 30์ผ
User upload moyeota-<account-id>-uploads dev/, prod/ ์ž๋™ ์‚ญ์ œ ์—†์Œ

์„ธ ๋ฒ„ํ‚ท ๋ชจ๋‘ Public Access Block, server-side encryption, versioning์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. ์‚ฌ์šฉ์ž ํŒŒ์ผ ๋ฒ„ํ‚ท์€ public ACL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„œ๋ช… URL ๋˜๋Š” ์ดํ›„ ๋„์ž…ํ•  CloudFront๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•œ๋‹ค. DB backup๊ณผ ์‚ฌ์šฉ์ž ํŒŒ์ผ์€ IAM policy์—์„œ๋„ prefix๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.

8.3 CloudWatch log groups

/moyeota/dev/nginx
/moyeota/dev/frontend
/moyeota/dev/backend
/moyeota/dev/mysql
/moyeota/dev/ai
/moyeota/prod/nginx
/moyeota/prod/frontend
/moyeota/prod/backend
/moyeota/prod/mysql
/moyeota/prod/ai

IaC๋Š” log group๊ณผ retention์„ ๋จผ์ € ์ƒ์„ฑํ•œ๋‹ค. Compose๋Š” ์„œ๋น„์Šค๋ณ„ awslogs driver๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ CloudWatch Agent๊ฐ€ Docker log๋ฅผ ์„œ๋น„์Šค๋ณ„๋กœ ๊ตฌ๋ถ„ํ•ด ์ „์†กํ•˜๋„๋ก ํ›„์† ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค. ํ˜„์žฌ์˜ ๋กœ์ปฌ json-file rotation๋งŒ์œผ๋กœ๋Š” EC2 ์žฅ์•  ํ›„ ๋กœ๊ทธ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์—†๋‹ค.

9. DNS์™€ TLS

๋ณ€์ˆ˜ ์˜ˆ์‹œ ์ƒํƒœ
hosted_zone_name example.com ๊ฒฐ์ • ํ•„์š”
prod_fqdn app.example.com ๊ฒฐ์ • ํ•„์š”
dev_fqdn dev.example.com ๊ฒฐ์ • ํ•„์š”
Prod record A -> Prod EIP ์ดˆ๊ธฐ ๊ถŒ์žฅ
Dev record A -> Dev EIP ์ดˆ๊ธฐ ๊ถŒ์žฅ

ALB ์—†์ด EC2 Nginx์—์„œ TLS๋ฅผ ์ข…๋ฃŒํ•˜๋ฏ€๋กœ Route 53 record๋งŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์ธ์ฆ์„œ๊ฐ€ ์„ค์น˜๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. Certbot/ACME ์‚ฌ์šฉ, ์™ธ๋ถ€์—์„œ ๋ฐœ๊ธ‰ํ•œ ์ธ์ฆ์„œ ๋ฐฐํฌ, ๋˜๋Š” ํ–ฅํ›„ ALB์™€ ACM ์‚ฌ์šฉ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณ„๋„ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ธ์ฆ์„œ private key๋Š” Terraform state์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.

10. Terraform ์ž…๋ ฅ ์˜ˆ์‹œ

์•„๋ž˜ ๊ฐ’์€ ์‹ค์ œ Secret์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” root module ์ž…๋ ฅ์˜ ์˜ˆ์‹œ๋‹ค.

project_name = "moyeota"
aws_region   = "ap-northeast-2"

network = {
  vpc_cidr = "10.20.0.0/16"
  prod = {
    subnet_cidr      = "10.20.10.0/24"
    availability_zone = "ap-northeast-2a"
  }
  dev = {
    subnet_cidr      = "10.20.20.0/24"
    availability_zone = "ap-northeast-2a"
  }
}

environments = {
  dev = {
    instance_type        = "t3.medium"
    root_volume_size_gib = 30
    data_volume_size_gib = 30
    log_retention_days   = 14
    backup_retention_days = 7
    public_ingress_cidrs = ["<DEV_QA_PUBLIC_IP>/32"]
    ssh_ingress_cidrs    = ["<ADMIN_PUBLIC_IP>/32"]
    ssh_enabled          = true
  }
  prod = {
    instance_type        = "t3.large"
    root_volume_size_gib = 30
    data_volume_size_gib = 50
    log_retention_days   = 30
    backup_retention_days = 30
    public_ingress_cidrs = ["0.0.0.0/0"]
    ssh_ingress_cidrs    = []
    ssh_enabled          = false
  }
}

ecr_repositories = ["moyeota/nginx", "moyeota/fe", "moyeota/be", "moyeota/ai"]

<DEV_QA_PUBLIC_IP>์™€ <ADMIN_PUBLIC_IP>๋Š” placeholder์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ applyํ•  ์ˆ˜ ์—†๊ฒŒ validation์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

11. ๊ถŒ์žฅ state์™€ module ๊ฒฝ๊ณ„

infra/
โ”œโ”€โ”€ bootstrap/       # remote state bucket์™€ ์ž ๊ธˆ
โ”œโ”€โ”€ modules/
โ”‚   โ”œโ”€โ”€ network/
โ”‚   โ”œโ”€โ”€ compute/
โ”‚   โ”œโ”€โ”€ iam-ec2/
โ”‚   โ”œโ”€โ”€ ecr/
โ”‚   โ”œโ”€โ”€ s3/
โ”‚   โ”œโ”€โ”€ observability/
โ”‚   โ””โ”€โ”€ github-oidc/
โ””โ”€โ”€ live/
    โ”œโ”€โ”€ shared/      # VPC, ECR, OIDC, ๊ณต์šฉ bucket
    โ”œโ”€โ”€ dev/         # Dev EC2, EIP, SG, IAM, logs
    โ””โ”€โ”€ prod/        # Prod EC2, EIP, SG, IAM, logs

Dev์™€ Prod state๋ฅผ ๋ถ„๋ฆฌํ•ด Dev ๋ณ€๊ฒฝ์ด Prod ๋ฆฌ์†Œ์Šค๋ฅผ ํ•จ๊ป˜ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์œ„ํ—˜์„ ์ค„์ธ๋‹ค. Prod state, S3 backup bucket๊ณผ data EBS์—๋Š” ์‚ญ์ œ ๋ฐฉ์ง€์™€ ๋ณ„๋„ ์Šน์ธ ์ ˆ์ฐจ๋ฅผ ๋‘”๋‹ค.

12. Apply ์ „์— ๋ฐ˜๋“œ์‹œ ํ™•์ •ํ•  ๊ฐ’

  • AWS account ID์™€ Terraform ์‹คํ–‰ role
  • VPC CIDR์ด ํ•™๊ตยทํšŒ์‚ฌยทVPN ๋„คํŠธ์›Œํฌ์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”์ง€
  • ์‚ฌ์šฉํ•  Availability Zone
  • Dev/QA public CIDR๊ณผ ์šด์˜์ž SSH CIDR
  • Dev SSH public key ๋˜๋Š” ๊ธฐ์กด EC2 Key Pair ์ด๋ฆ„
  • ์‹ค์ œ ๋„๋ฉ”์ธ๊ณผ Route 53 hosted zone ID
  • Nginx TLS ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ยท๊ฐฑ์‹  ๋ฐฉ์‹
  • FE, BE, AI, CLOUD์˜ ์ •ํ™•ํ•œ GitHub repository ์ด๋ฆ„๊ณผ ํ—ˆ์šฉ branch/environment
  • ์‹ค์ œ S3 bucket ์ด๋ฆ„ ๋˜๋Š” ์ด๋ฆ„ suffix
  • DB backup ์ฃผ๊ธฐ, RPO, ๋ณด์กด๊ธฐ๊ฐ„๊ณผ ์ •๊ธฐ ๋ณต๊ตฌ ํ›ˆ๋ จ ์ ˆ์ฐจ
  • ์‚ฌ์šฉ์ž ํŒŒ์ผ์˜ ๋ณด์กดยท์‚ญ์ œยทCORS ์ •์ฑ…
  • CloudWatch ๋กœ๊ทธ ๋ณด์กด๊ธฐ๊ฐ„๊ณผ ์•Œ๋žŒ ์ˆ˜์‹  ๋Œ€์ƒ
  • Dev/Prod ์ธ์Šคํ„ด์Šค์™€ data EBS์˜ ์ตœ์ข… ์šฉ๋Ÿ‰
  • FastAPI ํ™œ์„ฑํ™” ์—ฌ๋ถ€์™€ ํ™œ์„ฑํ™” ์‹œ CPUยท๋ฉ”๋ชจ๋ฆฌ ์ธก์ •๊ฐ’
  • EC2 ๊ต์ฒด ์‹œ MySQL data volume์„ ์žฌ์—ฐ๊ฒฐํ•˜๊ณ  ๋ณต๊ตฌํ•˜๋Š” runbook

13. ๊ฒ€์ฆ ๊ธฐ์ค€

  1. terraform fmt, validate์™€ ์ •์  ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ๋‹ค.
  2. plan์— NAT Gateway, ALB, RDS, Prod SSH ingress๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค.
  3. Dev์˜ 80/443/22 source์— 0.0.0.0/0๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค.
  4. Prod์—๋Š” 80/443 ingress๋งŒ ์žˆ๊ณ  ์šด์˜ ์ ‘์†์€ SSM์œผ๋กœ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  5. EC2์—์„œ ECR pull, S3 backup upload, CloudWatch log ์ „์†ก์ด ์ตœ์†Œ ๊ถŒํ•œ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  6. ๋‚ด๋ถ€ ์„œ๋น„์Šค ํฌํŠธ 3000, 8080, 8000, 3306์€ ํ˜ธ์ŠคํŠธ๋‚˜ Security Group์— ๊ณต๊ฐœ๋˜์ง€ ์•Š๋Š”๋‹ค.
  7. EC2๋ฅผ ๊ต์ฒดํ•ด๋„ ๋ณ„๋„ data EBS์™€ S3 backup์„ ์ด์šฉํ•ด MySQL์„ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  8. Dev์™€ Prod์˜ IAM role, S3 prefix, log group, state๊ฐ€ ์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.
  9. ๋ฐฐํฌ manifest์˜ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฏธ์ง€๋Š” ECR digest๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  10. ์ธ์Šคํ„ด์Šค ํƒ€์ž…์€ ์‹ค์ œ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ํ›„ ํ™•์ •ํ•˜๊ณ , AI ํ™œ์„ฑํ™” ์‹œ ๋‹ค์‹œ ๊ฒ€์ฆํ•œ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ