| name | aws-wa-cost |
| description | AWS Well-Architected Cost Optimization Pillar review. Checks resource sizing, scaling, storage classes, and cost monitoring configurations in IaC code. |
Cost Optimization Pillar
๋น์ฉ ์ต์ ํ, ํ๋ ฅ์ฑ, ๊ตฌ๋งค ์ต์
๊ด์ ์์ IaC ์ฝ๋๋ฅผ ๊ฒํ ํฉ๋๋ค.
ํต์ฌ ์์น
- ํด๋ผ์ฐ๋ ์ฌ๋ฌด ๊ด๋ฆฌ ๊ตฌํ: Cost Explorer, ์์ฐ
- ์๋น ๋ชจ๋ธ ์ฑํ: ์ฌ์ฉํ ๋งํผ ์ง๋ถ
- ์ ์ฒด ํจ์จ์ฑ ์ธก์ : ๋น์ฉ ๋๋น ๋น์ฆ๋์ค ๊ฐ์น
- ์ฐจ๋ณํ๋์ง ์๋ ๊ณผ์คํ ์์
์ค๋จ: ๊ด๋ฆฌํ ์๋น์ค ํ์ฉ
- ๋น์ฉ ๋ถ์ ๋ฐ ๊ท์: ํ๊ทธ ๊ธฐ๋ฐ ๋น์ฉ ํ ๋น
๊ฒํ ํญ๋ชฉ
COST-01: ๊ณผ๋ํ ์ธ์คํด์ค ํฌ๊ธฐ
| ์ฌ๊ฐ๋ | ํ์ง ์ ํ |
|---|
| Medium | ์๋ ํ์ง |
๊ฒํ ๋ด์ฉ: ๊ฐ๋ฐ/ํ
์คํธ ํ๊ฒฝ์์ ๊ณผ๋ํ ์ธ์คํด์ค ํฌ๊ธฐ ์ฌ์ฉ ์ฌ๋ถ
Terraform ํจํด:
# ๊ฒํ ํ์ - ๊ฐ๋ฐ ํ๊ฒฝ์ ํฐ ์ธ์คํด์ค
resource "aws_instance" "dev" {
instance_type = "m5.4xlarge"
tags = {
Environment = "dev"
}
}
# ๊ถ์ฅ - ํ๊ฒฝ์ ๋ง๋ ํฌ๊ธฐ
resource "aws_instance" "dev" {
instance_type = "t3.medium"
tags = {
Environment = "dev"
}
}
COST-02: S3 ์คํ ๋ฆฌ์ง ํด๋์ค
| ์ฌ๊ฐ๋ | ํ์ง ์ ํ |
|---|
| Low | ์๋ ํ์ง |
๊ฒํ ๋ด์ฉ: Intelligent-Tiering, Glacier ํ์ฉ ์ฌ๋ถ
Terraform ํจํด:
# ๊ถ์ฅ - Intelligent-Tiering
resource "aws_s3_bucket_intelligent_tiering_configuration" "good" {
bucket = aws_s3_bucket.example.id
name = "EntireBucket"
tiering {
access_tier = "DEEP_ARCHIVE_ACCESS"
days = 180
}
}
# ๊ถ์ฅ - ์๋ช
์ฃผ๊ธฐ ์ ์ฑ
resource "aws_s3_bucket_lifecycle_configuration" "good" {
bucket = aws_s3_bucket.example.id
rule {
id = "archive"
status = "Enabled"
transition {
days = 90
storage_class = "GLACIER"
}
}
}
COST-03: ๋ฏธ์ฌ์ฉ ๋ฆฌ์์ค
| ์ฌ๊ฐ๋ | ํ์ง ์ ํ |
|---|
| Medium | ์๋ ํ์ง |
๊ฒํ ๋ด์ฉ: ๋ฏธ์ฌ์ฉ EIP, ๋ณผ๋ฅจ, ์ค๋
์ท ๋ฑ ํ์ธ
์ฃผ์ ํญ๋ชฉ:
- ์ฐ๊ฒฐ๋์ง ์์ Elastic IP (๋น์ฉ ๋ฐ์)
- ์ฐ๊ฒฐ๋์ง ์์ EBS ๋ณผ๋ฅจ
- ์ค๋๋ ์ค๋
์ท
COST-04: ํญ์ ์คํ๋๋ ๊ฐ๋ฐ ํ๊ฒฝ
| ์ฌ๊ฐ๋ | ํ์ง ์ ํ |
|---|
| Medium | ์๋ ํ์ง |
๊ฒํ ๋ด์ฉ: ๊ฐ๋ฐ/ํ
์คํธ ํ๊ฒฝ์ด 24/7 ์คํ๋๊ณ ์๋์ง ํ์ธ
Terraform ํจํด:
# ๊ถ์ฅ - ์์ฝ๋ ์ค์ผ์ผ๋ง
resource "aws_autoscaling_schedule" "scale_down" {
scheduled_action_name = "scale-down-evening"
min_size = 0
max_size = 0
desired_capacity = 0
recurrence = "0 19 * * MON-FRI" # ์ ๋
7์
autoscaling_group_name = aws_autoscaling_group.dev.name
}
COST-05: Reserved Instance / Savings Plan
| ์ฌ๊ฐ๋ | ํ์ง ์ ํ |
|---|
| Medium | ์๋ ํ์ธ ํ์ |
๊ฒํ ๋ด์ฉ: ์์ ์ ์ธ ์ํฌ๋ก๋์ RI/SP ์ ์ฉ ์ฌ๋ถ
์๋ ํ์ธ ํญ๋ชฉ:
COST-06: ๋ฐ์ดํฐ ์ ์ก ๋น์ฉ
| ์ฌ๊ฐ๋ | ํ์ง ์ ํ |
|---|
| Medium | ์๋ ํ์ง |
๊ฒํ ๋ด์ฉ: ๋ฆฌ์ ๊ฐ ๋ฐ์ดํฐ ์ ์ก, NAT Gateway ํธ๋ํฝ ์ต์ ํ
๊ถ์ฅ ์ฌํญ:
- VPC Endpoint ์ฌ์ฉ (S3, DynamoDB ๋ฑ)
- ๊ฐ์ AZ ๋ด ํต์ ์ต๋ํ
- CloudFront ํ์ฉ
Terraform ํจํด:
# ๊ถ์ฅ - VPC Endpoint (NAT Gateway ๋น์ฉ ์ ๊ฐ)
resource "aws_vpc_endpoint" "s3" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.ap-northeast-2.s3"
}
COST-07: ๋น์ฉ ์๋ฆผ
| ์ฌ๊ฐ๋ | ํ์ง ์ ํ |
|---|
| Low | ์๋ ํ์ง |
๊ฒํ ๋ด์ฉ: AWS Budgets, ๋น์ฉ ์๋ฆผ ์ค์ ์ฌ๋ถ
Terraform ํจํด:
# ๊ถ์ฅ - ์์ฐ ์๋ฆผ
resource "aws_budgets_budget" "monthly" {
name = "monthly-budget"
budget_type = "COST"
limit_amount = "1000"
limit_unit = "USD"
time_period_start = "2024-01-01_00:00"
time_unit = "MONTHLY"
notification {
comparison_operator = "GREATER_THAN"
threshold = 80
threshold_type = "PERCENTAGE"
notification_type = "ACTUAL"
subscriber_email_addresses = ["team@example.com"]
}
}
IaC ํ๋ซํผ๋ณ ํจํด
์์ธ ํจํด์ ๋ค์ ์ฐธ์กฐ:
์ ์ ์ฐ์
| ํญ๋ชฉ | ๊ฐ์ค์น |
|---|
| ์ธ์คํด์ค ํฌ๊ธฐ ์ ์ ์ฑ | 25% |
| S3 ์คํ ๋ฆฌ์ง ํด๋์ค | 15% |
| ๋ฏธ์ฌ์ฉ ๋ฆฌ์์ค | 20% |
| ๊ฐ๋ฐ ํ๊ฒฝ ์ต์ ํ | 15% |
| Reserved/Savings | 15% |
| ๋น์ฉ ์๋ฆผ | 10% |