Phase 5: Advanced & Multi-Cloud

Prioritizing risks, tracking improvements & continuous assessment

Advanced ~2 min read
Think of it this way A friendly analogy. Read this if the technical version feels dense. Show Hide

Imagine you’ve just finished building an awesome, super complex LEGO castle. You’ve put a lot of work into it! Now, you take a close look, like a detective inspecting every corner, to make sure it’s strong and ready for anything. You notice a few things: maybe one of the towers is a bit wobbly, there’s a small, ugly gap in a wall far away, and oh no – a big, scary LEGO dragon is heading straight for your main gate! You can't fix everything all at once because you only have so much time and a limited number of extra LEGO pieces.

This is like what grown-ups do when they "prioritize risks and track improvements." It means deciding which problems to fix first. You wouldn't spend all your time trying to fix that tiny, hidden gap in the wall if the dragon is about to smash your main gate, right? You think about two main things: first, how bad would it be if something went wrong (like the dragon breaking the gate, or the wobbly tower falling down completely)? Second, how likely is it that it will go wrong (the dragon is very close, the wobbly tower isn't falling yet but could)? Fixing the wobbly main tower or reinforcing the gate against the dragon are clearly more important than making a tiny, hidden wall perfect. You also think about how much effort it will take – is it a quick fix, or will it need a lot of special pieces and time?

Once you decide what’s most important, you make a list. You tackle the dragon threat or the wobbly tower first. After you fix it, you check it off your list. But the game isn't over! As you keep playing with your castle, you might add new parts, or maybe a new, even bigger monster appears, and suddenly you have to re-evaluate what’s most important now. This constant checking, fixing, and re-checking is how you make sure your LEGO castle is always the best, strongest, and safest it can be, even as things change around it.

So, when you're building anything, whether it's a LEGO castle or even planning a big school project, thinking this way helps you make really smart choices about what to focus on first. It means you can keep things safe and strong, and always make them better in the smartest way possible.

After conducting a thorough Well-Architected Framework (WAF) review, you'll invariably be left with a substantial list of potential improvements and identified risks. The critical next step for a Cloud Architect is to effectively prioritize these. Not all risks carry the same weight, nor can all improvements be tackled simultaneously due to resource constraints, budget, or competing business priorities. Prioritization should be a strategic exercise, typically leveraging a matrix approach that considers the potential business impact (e.g., data loss, downtime, regulatory non-compliance, significant cost overrun), the likelihood of the risk occurring, and the effort/cost required for remediation. High-impact, high-likelihood risks, especially those related to critical security or operational stability, often demand immediate attention, even if remediation is complex. This decision-making must be tightly coupled with the organization's overall risk appetite and strategic objectives.

Key Takeaways

  • Prioritize WAF risks based on a strategic matrix considering impact, likelihood, and remediation effort.
  • Align risk prioritization with organizational risk appetite and business objectives.
  • Track improvements using measurable KPIs relevant to the WAF pillars (e.g., MTTR, uptime, cost savings).
  • Integrate WAF assessments into the SDLC for continuous architectural health, not a one-off event.
  • Leverage cloud-native tools for ongoing assessments and automate where possible.

Code Example

python
# Simulate a WAF finding tracking entry
waf_finding = {
    "id": "WAF-SEC-001",
    "pillar": "Security",
    "riskLevel": "High",
    "description": "Public access enabled on S3 bucket 'my-prod-data'.",
    "recommendation": "Block public access; enforce IAM policies.",
    "priority": "Critical",
    "status": "Open",
    "assignedTo": "Alice",
    "openedDate": "2023-10-26",
    "targetRemediationDate": "2023-11-09",
    "remediationSteps": [
        {"step": "Disable public access setting", "status": "Done"},
        {"step": "Review & apply restricted IAM policy", "status": "In Progress"}
    ],
    "metricsImpact": {
        "securityScore_before": 75, "securityScore_after_expected": 85
    },
    "lastUpdated": "2023-11-01"
}

# Example of updating status after a remediation step
if waf_finding["remediationSteps"][1]["status"] == "In Progress":
    print(f"Finding {waf_finding['id']}: Remediation step is '{waf_finding['remediationSteps'][1]['status']}'.")

waf_finding["remediationSteps"][1]["status"] = "Done"
waf_finding["status"] = "Remediated - Verification Pending"
waf_finding["lastUpdated"] = "2023-11-08"

print(f"Finding {waf_finding['id']} is now '{waf_finding['status']}'.")

How this code works

This code example illustrates how a Well-Architected Framework (WAF) finding, representing a detected cloud risk, is digitally tracked and its progress updated. It simulates a workflow where a security issue, like an exposed S3 bucket detailed in the waf_finding dictionary, progresses through remediation. Initially, the finding contains various attributes, including its riskLevel, priority, and a list of specific remediationSteps required to address the issue. Each step in this list also has its own status, allowing for granular tracking of tasks within the larger finding.

The code then demonstrates updating this finding as work progresses. It first checks the status of a specific remediation task (the second step in the remediationSteps list). Once this individual step is notionally completed, the code explicitly changes its status to "Done". A subtle but important detail is that the waf_finding's overall status is then separately updated to "Remediated - Verification Pending", along with the lastUpdated timestamp. This shows that completing a sub-task doesn't automatically close the main finding; the overall status needs its own deliberate update to reflect the finding's journey from "Open" towards final resolution and verification.