{"id":4245,"date":"2026-06-05T11:11:55","date_gmt":"2026-06-05T11:11:55","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/06\/05\/risk-based-review-for-infrastructure-as-code-pull-requests\/"},"modified":"2026-06-05T11:11:55","modified_gmt":"2026-06-05T11:11:55","slug":"risk-based-review-for-infrastructure-as-code-pull-requests","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/06\/05\/risk-based-review-for-infrastructure-as-code-pull-requests\/","title":{"rendered":"Risk-Based Review for Infrastructure as Code Pull Requests\u00a0"},"content":{"rendered":"<div><img data-opt-id=473738631  fetchpriority=\"high\" decoding=\"async\" width=\"768\" height=\"330\" src=\"https:\/\/devops.com\/wp-content\/uploads\/2020\/10\/infrastructure.jpg\" class=\"attachment-large size-large wp-post-image\" alt=\"infrastructure, Terraform, IaC immutable infrastructure Pulumi GitOps\" \/><\/div>\n<p><img data-opt-id=649700627  fetchpriority=\"high\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/devops.com\/wp-content\/uploads\/2020\/10\/infrastructure-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"infrastructure, Terraform, IaC immutable infrastructure Pulumi GitOps\" \/><\/p>\n<p><span data-contrast=\"auto\">Not every infrastructure pull request deserves the same review path. A tag change in a development account and a network-policy change in production should not create identical reviewer load. When every change is treated as high risk, reviewers stop trusting the signal.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">In\u00a0IaC review, I have seen reviewers spend too much attention on low-risk changes while subtle production changes move through with weak context. Risk scoring is useful when it redirects human judgment instead of pretending to replace it.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Risk-based review gives platform teams a more useful pattern. The system <a href=\"https:\/\/devops.com\/common-iac-security-issues-and-how-to-fix-them\/\" target=\"_blank\" rel=\"noopener\">scores an IaC<\/a> change using evidence from the diff, environment, resource type, dependency criticality, recent incidents, ownership and rollout plan. The score does not replace reviewers. It decides how much review the change deserves.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">What the Score Should Consider<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">A good score is boring and explainable. It should include blast radius, production exposure, stateful resource impact, identity or network changes, rollback difficulty, missing evidence and whether the affected service has recent incidents. The goal is not machine judgment. The goal is consistent triage.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"none\">risk_inputs<\/span><b><span data-contrast=\"none\">:<\/span><\/b><br \/>\n<span data-contrast=\"none\">\u00a0\u00a0<\/span><span data-contrast=\"none\">environment<\/span><b><span data-contrast=\"none\">:<\/span><\/b><span data-contrast=\"none\">\u00a0production<\/span><br \/>\n<span data-contrast=\"none\">\u00a0\u00a0<\/span><span data-contrast=\"none\">resource_type<\/span><b><span data-contrast=\"none\">:<\/span><\/b><span data-contrast=\"none\">\u00a0iam_policy<\/span><br \/>\n<span data-contrast=\"none\">\u00a0\u00a0<\/span><span data-contrast=\"none\">blast_radius<\/span><b><span data-contrast=\"none\">:<\/span><\/b><span data-contrast=\"none\">\u00a0account-wide<\/span><br \/>\n<span data-contrast=\"none\">\u00a0\u00a0<\/span><span data-contrast=\"none\">rollback<\/span><b><span data-contrast=\"none\">:<\/span><\/b><span data-contrast=\"none\">\u00a0manual<\/span><br \/>\n<span data-contrast=\"none\">\u00a0\u00a0<\/span><span data-contrast=\"none\">owner_present<\/span><b><span data-contrast=\"none\">:<\/span><\/b><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">true<\/span><br \/>\n<span data-contrast=\"none\">\u00a0\u00a0<\/span><span data-contrast=\"none\">recent_incidents<\/span><b><span data-contrast=\"none\">:<\/span><\/b><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">1<\/span><br \/>\n<span data-contrast=\"none\">\u00a0\u00a0<\/span><span data-contrast=\"none\">missing_evidence<\/span><b><span data-contrast=\"none\">:<\/span><\/b><span data-contrast=\"none\">\u00a0<\/span><span data-contrast=\"none\">false<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">The output should be equally clear:\u00a0Fast\u00a0path, owner review, platform review, security review, staged rollout or block until evidence is complete.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Why Pull Requests\u00a0are\u00a0the Right Surface<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">The pull request already has context:\u00a0Author, diff, reviewers, checks, target branch and deployment environment. That makes it the best place to explain risk while the change is still cheap to adjust. A weekly governance report may be useful for leaders, but it is too late for the engineer trying to merge safely.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">The comment should not dump raw policy output. It should say which resources changed, which risk factors mattered, what review path was selected and what would lower the risk.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Implementation Sketch<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><b><span data-contrast=\"none\">def<\/span><\/b><span data-contrast=\"auto\">\u00a0risk(change):<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0 score\u00a0<\/span><span data-contrast=\"none\">=<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"none\">0<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0<\/span><b><span data-contrast=\"none\">if<\/span><\/b><span data-contrast=\"auto\">\u00a0change.environment\u00a0<\/span><span data-contrast=\"none\">==<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"none\">\u201cproduction\u201d<\/span><span data-contrast=\"auto\">:<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 score\u00a0<\/span><span data-contrast=\"none\">+=<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"none\">25<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0<\/span><b><span data-contrast=\"none\">if<\/span><\/b><span data-contrast=\"auto\">\u00a0change.resource\u00a0<\/span><b><span data-contrast=\"none\">in<\/span><\/b><span data-contrast=\"auto\">\u00a0{<\/span><span data-contrast=\"none\">\u201ciam_policy\u201d<\/span><span data-contrast=\"auto\">,\u00a0<\/span><span data-contrast=\"none\">\u201csecurity_group\u201d<\/span><span data-contrast=\"auto\">,\u00a0<\/span><span data-contrast=\"none\">\u201croute_table\u201d<\/span><span data-contrast=\"auto\">}:<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 score\u00a0<\/span><span data-contrast=\"none\">+=<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"none\">25<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0<\/span><b><span data-contrast=\"none\">if<\/span><\/b><span data-contrast=\"auto\">\u00a0<\/span><b><span data-contrast=\"none\">not<\/span><\/b><span data-contrast=\"auto\">\u00a0change.owner:<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 score\u00a0<\/span><span data-contrast=\"none\">+=<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"none\">20<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0<\/span><b><span data-contrast=\"none\">if<\/span><\/b><span data-contrast=\"auto\">\u00a0change.rollback\u00a0<\/span><span data-contrast=\"none\">==<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"none\">\u201cmanual\u201d<\/span><span data-contrast=\"auto\">:<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 score\u00a0<\/span><span data-contrast=\"none\">+=<\/span><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"none\">15<\/span><br \/>\n<span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0<\/span><b><span data-contrast=\"none\">return<\/span><\/b><span data-contrast=\"auto\">\u00a0<\/span><span data-contrast=\"none\">min<\/span><span data-contrast=\"auto\">(score,\u00a0<\/span><span data-contrast=\"none\">100<\/span><span data-contrast=\"auto\">)<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">This example is intentionally simple. Production systems should use tested rules, not mysterious weights. If a score changes, reviewers should know which input changed.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Avoiding Reviewer Fatigue<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">The biggest risk is over-escalation. If every production change goes to a central team, the system becomes a bottleneck. Use thresholds carefully. A production tag change with complete evidence may need only normal owner review. A production identity change with a missing rollback deserves more attention.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Track false positives, false negatives, review latency, override rate and repeated high-risk patterns. If a category repeatedly scores high because the platform lacks a safer workflow, that is roadmap input.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Evidence and Replay<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">Each scored decision should be stored with policy version, inputs, score, selected path, reviewer and final outcome. This matters during incidents. If a change later causes a problem, the team can reconstruct why the review path seemed reasonable at the time.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">The evidence record should not be treated as compliance paperwork. It is operational memory for the delivery system.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Rollout Plan<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">Start in advisory mode for a month. Compare the score with human judgment. Look for missing context and confusing explanations. Then enforce one narrow case, such as production changes with missing owner or missing rollback. Expand only after the system earns trust.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Risk-based review is strongest when it reduces noise. The platform should make safe changes faster and risky changes clearer, not simply add another required check.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Calibrating the Score<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">Risk scoring fails when teams cannot see how the number was produced. Keep the first model simple and publish the scoring table.\u00a0If identity changes add\u00a025\u00a0points and missing rollback adds\u00a015, say that.\u00a0Reviewers do not need a mysterious model; they need a consistent way to decide where to spend attention.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">A monthly calibration review should compare score, reviewer decision, deployment outcome and incident follow-up. If low-score changes repeatedly cause issues, the model is missing a signal. If high-score changes routinely pass without concern, the model may be too sensitive.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Example Workflow Output<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">Risk score: 72 \/ 100<\/span><br \/>\n<span data-contrast=\"auto\">Reason: production IAM policy change, account-wide scope, manual rollback<\/span><br \/>\n<span data-contrast=\"auto\">Decision: platform owner review required<\/span><br \/>\n<span data-contrast=\"auto\">Remediation: add rollback plan or reduce policy scope<\/span><br \/>\n<span data-contrast=\"auto\">Evidence: policy-v4, commit 7a91c2, service owner payments-platform<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">This\u00a0output\u00a0offers\u00a0the engineer something to act on. It also gives reviewers a shared language. The discussion becomes about specific risk factors rather than general discomfort.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Anti-Patterns<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">Avoid scores with too many hidden inputs. Avoid global thresholds that ignore environment. Avoid blocking changes without explaining remediation. Avoid treating the model as finished. Infrastructure platforms change constantly, and the review model should evolve with them.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">The best risk-based review systems become quieter over time because the platform learns which changes are routine and which patterns deserve deeper attention.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Keeping\u00a0it\u00a0Practical<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">The review model should be easy to explain to a new engineer. If a team cannot describe why a change was routed to security review, the scoring system is too opaque. Good risk\u00a0scoring gives engineers a shared vocabulary:\u00a0Production\u00a0exposure, blast radius, rollback difficulty, ownership and missing evidence.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<h3><span data-contrast=\"none\">Final Check<\/span><span data-ccp-props='{\"134245418\":true,\"134245529\":true,\"335559738\":480,\"335559739\":0}'>\u00a0<\/span><\/h3>\n<p><span data-contrast=\"auto\">Before requiring the score, replay it against the last month of infrastructure changes. Ask whether the model would have escalated the changes that engineers actually worried about.<\/span><span data-ccp-props='{\"335559738\":180,\"335559739\":180}'>\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/devops.com\/risk-based-review-for-infrastructure-as-code-pull-requests\/\" target=\"_blank\" class=\"feedzy-rss-link-icon\">Read More<\/a><\/p>\n<p>\u200b<\/p>","protected":false},"excerpt":{"rendered":"<p>Not every infrastructure pull request deserves the same review path. A tag change in a development account and a network-policy [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4246,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[5],"tags":[],"class_list":["post-4245","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/4245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=4245"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/4245\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media\/4246"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=4245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=4245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=4245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}