Azure / Advanced: secure and recoverable architecture / Lesson 17
Azure architecture decisions and defensible tradeoffs
Build an architecture decision record from business constraints, quality attributes, alternatives, and evidence. Make Azure service choices revisable without treating a score or diagram as proof.
On this page
Lesson goals
- Distinguish hard constraints from preferences.
- Record tradeoffs, assumptions, and rejected alternatives.
- Use a decision model without fabricating service support.
A useful architecture starts with consequences
Name the user outcome, data sensitivity, residency, recovery objectives, workload pattern, team capability, and expected change. Azure Well-Architected considerations such as reliability, security, cost optimization, operational excellence, and performance efficiency help expose tradeoffs, not create one universal best service. A requirement that data remain in a defined location differs from a preference for a familiar runtime. Capture the consequence of violating each requirement and identify who owns the decision. Do not begin with a product list and then invent requirements that justify it; that makes later review an exercise in defending an untested choice.
An ADR preserves why the decision was reasonable
Record context, options, chosen direction, assumptions, evidence, consequences, and conditions for reconsideration. Keep accepted history and supersede a decision when the context changes instead of silently rewriting the original rationale. The JSON example records a synthetic HTTP workload whose team prefers managed operations while still needing runtime and network verification. It is not a recommendation to purchase a plan or a declaration that all constraints are met. Explicit uncertainty is useful: it shows which next observation could change the decision. A polished diagram without this reasoning can conceal expensive coupling and unowned recovery obligations.
{
"model": "architecture-decision-record",
"decision": "evaluate-managed-http-hosting",
"context": [
"synthetic-catalog-api",
"team-does-not-need-cluster-control"
],
"alternatives": [
"VM-based-hosting",
"managed-web-hosting",
"managed-containers"
],
"unverified": [
"runtime-support",
"private-dependency-path",
"recovery-test"
],
"revisit_when": "hard-requirement-or-evidence-changes"
}
a candidate decision remains conditional on missing evidence
The record is not a deployment, service capability assertion, or spending authorization.
Reject unsupported candidates before scoring preferences
Use hard constraints to remove candidates that cannot satisfy essential requirements, then compare remaining tradeoffs. The offline model uses invented candidates and Boolean assumptions, selecting only one that meets both modeled private-access and runtime conditions. It is not an Azure service support matrix. A weighted score over subjective labels does not become an exact probability or a proof of fitness. If the support assumption is unverified, mark it unknown rather than converting it to true for convenience. Recheck region, plan, identity, compliance context, and lifecycle before a real service is accepted.
candidates = [{"name": "candidate-a", "private_path": True, "runtime": True}, {"name": "candidate-b", "private_path": True, "runtime": False}]
accepted = [item["name"] for item in candidates if item["private_path"] and item["runtime"]]
print(",".join(accepted))
candidate-a
The candidate names and capabilities are invented. The program does not discover or validate Azure features.
Review hidden coupling and the cost of reversal
Compute, identity, networking, data partitioning, message contracts, recovery location, and operational ownership interact. A simpler hosting choice may reduce cluster work while increasing dependence on a platform-specific feature. A multi-region design can improve some failure coverage while complicating writes, residency, observability, and incident authority. Review the blast radius of shared subscriptions, identities, DNS, caches, and pipelines. Include migration and rollback limits in the decision, especially irreversible schema or data transformations. Compare realistic alternatives at the same workload and quality requirements rather than using an easy single-region baseline to claim a universally cheaper or safer architecture.
A decision remains maintained as evidence changes
Use a review cadence and triggers such as workload growth, service retirement, changed residency rules, new failure evidence, or a team ownership change. Keep current official documentation with version or review date where relevant. A prototype can establish a narrow property but cannot prove every production behavior, and cloud support can vary by option and region. This course makes no Azure selection through an account and runs no deployment or service benchmark. It teaches how to explain a conditional design, name residual risk, and propose the next authorized observation that would make the decision more defensible.
Common errors and fixes
A subjective score is presented as proof of the best architecture
- Why it happens
- Preferences and uncertain assumptions are treated as objective measurements.
- How to fix it
- Separate hard constraints, evidence, and subjective tradeoffs.
- Prevent it next time
- Record uncertainty and decision ownership explicitly.
Accepted history is rewritten after requirements change
- Why it happens
- The original context and consequences disappear.
- How to fix it
- Create a superseding decision and link the old record.
- Prevent it next time
- Maintain reconsideration triggers with each ADR.
A prototype success is called production-wide assurance
- Why it happens
- Narrow evidence is expanded beyond its tested conditions.
- How to fix it
- State the prototype scope and remaining integration risks.
- Prevent it next time
- Plan representative authorized verification before acceptance.
Check your understanding
1. Why filter hard constraints before weighted preferences?
Show worked solution
A candidate that cannot meet an essential residency, runtime, or recovery requirement should not win because it scores well on convenience. Verify the constraint first and mark unknown support explicitly. Preferences can compare viable candidates, but the score still does not prove real workload fitness.
2. When should the synthetic managed-hosting decision be revisited?
Show worked solution
Revisit it when a hard requirement changes or missing evidence contradicts its assumptions, such as unsupported runtime, unusable private access, or failed recovery. Preserve the original rationale and create a linked superseding record. Do not quietly replace the diagram and erase the reason the earlier choice existed.
Key takeaways
- Architecture decisions should explain constraints, alternatives, evidence, and consequences.
- A maintained conditional argument is more useful than an unexplained service diagram.