File size: 4,402 Bytes
529b5a7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""Medium task: Mid-size audit — 15 resources, mix of prod (skip) and dev/staging (optimize)."""

from env.models import ActionType
from env.tasks.base_task import BaseTask


class MidSizeAuditTask(BaseTask):
    task_id = "mid-size-audit"
    difficulty = "medium"
    max_steps = 20
    description = (
        "Audit a mid-size company's mixed prod/dev AWS account with 15 resources. "
        "Must identify which resources to optimize and which to leave alone. "
        "Prod resources are critical and should be skipped."
    )
    data_file = "medium_account.json"
    optimal_cost = 1700.0  # approximate after optimizations

    def get_correct_actions(self) -> dict[str, ActionType]:
        return {
            # --- PROD: SKIP (5 resources) ---
            # prod-web-primary: 5% CPU but seasonal spikes, critical -> skip
            "res-med-001": ActionType.skip_resource,
            # prod-db-replica: read replica for failover, critical -> skip
            "res-med-002": ActionType.skip_resource,
            # prod-db-primary: active prod DB, critical -> skip
            "res-med-003": ActionType.skip_resource,
            # prod-api-gateway: in ASG, 65% CPU, critical -> skip
            "res-med-004": ActionType.skip_resource,
            # prod-main-alb: active with 4 targets, critical -> skip
            "res-med-005": ActionType.skip_resource,

            # --- DEV/STAGING: OPTIMIZE (10 resources) ---
            # dev-ml-training: r5.2xlarge @ 3% -> rightsize to t3.medium
            # saves $367.92 - $30.37 = $337.55
            "res-med-006": ActionType.rightsize_resource,
            # staging-batch-worker: m5.2xlarge @ 6% -> rightsize to t3.medium
            # saves $280.32 - $30.37 = $249.95
            "res-med-007": ActionType.rightsize_resource,
            # dev-k8s-cluster: 8 nodes @ 10% util, runs 24/7 -> schedule weekday-only
            # saves ~28% of $633.64 = $177.42
            "res-med-008": ActionType.schedule_uptime,
            # dev-test-db: db.r5.xlarge + 500GB @ 2%, 5GB used -> rightsize to db.t3.micro + 20GB
            # saves $407.90 - ($12.41 + 20*0.10) = $407.90 - $14.41 = $393.49
            "res-med-009": ActionType.rightsize_resource,
            # staging-data-lake: 20TB S3 standard rarely accessed -> lifecycle policy
            # saves ~70% of $460.00 = $322.00
            "res-med-010": ActionType.add_lifecycle_policy,
            # staging-unused-alb: 0 targets -> terminate
            # saves $22.27
            "res-med-011": ActionType.terminate_resource,
            # dev-jenkins-ci: m5.xlarge @ 15% -> rightsize to t3.medium
            # saves $140.16 - $30.37 = $109.79
            "res-med-012": ActionType.rightsize_resource,
            # dev-monitoring: t3.xlarge @ 8% -> rightsize to t3.small
            # saves $121.47 - $15.18 = $106.29
            "res-med-013": ActionType.rightsize_resource,
            # staging-cache-server: RI expiring, still needed -> purchase_reservation
            # saves ~30% of $91.98 = $27.59 (RI discount)
            "res-med-014": ActionType.purchase_reservation,
            # cloudwatch-log-exports: 3TB S3 never accessed -> lifecycle policy
            # saves ~70% of $69.00 = $48.30
            "res-med-015": ActionType.add_lifecycle_policy,
        }

    def get_critical_resources(self) -> set[str]:
        return {"res-med-001", "res-med-002", "res-med-003", "res-med-004", "res-med-005"}

    def get_action_savings(self) -> dict[str, float]:
        return {
            "res-med-001": 0.0,       # skip (prod)
            "res-med-002": 0.0,       # skip (prod)
            "res-med-003": 0.0,       # skip (prod)
            "res-med-004": 0.0,       # skip (prod)
            "res-med-005": 0.0,       # skip (prod)
            "res-med-006": 337.55,    # r5.2xlarge -> t3.medium
            "res-med-007": 249.95,    # m5.2xlarge -> t3.medium
            "res-med-008": 177.42,    # schedule K8s weekday-only
            "res-med-009": 393.49,    # db.r5.xlarge -> db.t3.micro
            "res-med-010": 322.00,    # S3 lifecycle
            "res-med-011": 22.27,     # terminate unused ALB
            "res-med-012": 109.79,    # m5.xlarge -> t3.medium
            "res-med-013": 106.29,    # t3.xlarge -> t3.small
            "res-med-014": 27.59,     # purchase reservation
            "res-med-015": 48.30,     # S3 lifecycle
        }