基礎架構流程簡報
輸出:一份私有的 HTML Artifact,約 8 張投影片,適用於簡報者口頭說明的會議。 圖表傳達主要意義。文字保持精簡。每個區塊、箭頭和主張都來自程式碼;絕不依賴記憶或僅憑文件。
工作順序:步驟 0 設定 → 步驟 1 研究並撰寫紀錄 → 步驟 2 建立 → 步驟 3 檢查直到顯示 0 problem(s) → 步驟 4 發佈並回報。
步驟 0 — 設定
- 將
assets/template.html複製到一個暫存路徑。每次修訂和每次發佈都使用同一路徑,以便 Artifact URL 保持不變。 - 將步驟 1 的紀錄放在與它同目錄的
ledger.txt中。assets/ledger.example.txt展示了格式;其中的 ID 和路徑僅為範例。 - 在佈局 SVG 前載入
artifact-diagramming技能。遵循 Artifact 頁面合約(主題 token、無 doctype、側邊欄)。
模板是一個包含工作範例的簡報:投影片引擎、Play/Step/Reset 邏輯、AWS 風格圖塊、帳戶和區域方塊、虛線次要流程和品牌標誌圖塊。請修改資料和座標;請勿重寫引擎。
引擎事實:
player(svgId, prefix, steps, idleCaption)執行一個 Play 投影片。前綴''使用#play/#back/#next/#reset/#cap;'n'使用#nplay/…/#ncap(網路)、'i'使用#iplay/…/#icap(IAM)、'r'使用#rplay/…/#rcap(發布)。將它的回傳值推入stops。一個步驟是{n:[node ids], a:[arrow ids], c:'caption'};a可以為空。player()會將自身註冊到window.__players;scripts/check.py會讀取它,請務必保留這行程式碼。tile(id,cx,cy,color,glyph,label,sub,side):side為 falsy(標籤在下方)、'l'、't'或 truthy(在右側)。下方的標籤會阻止任何垂直線通過該列。請將其移開。chipRow(cy, items, x0):在角色圖塊旁繪製授權籌碼。每個項目是[text, stripe colour, id, deny?];每個籌碼是一個.node,因此 Play 步驟可以點亮它,deny?會加上紅色邊框。一個籌碼寬 360px;如果文字超出則檢查失敗。- 箭頭標記位於
body頂部一個隱藏但會渲染的 SVG 中。切勿在投影片內使用defs():在display:none投影片中的標記無法在其他投影片上繪製。 - 線條類別:
.arr實線主要流程箭頭(每個都必須在 Play 步驟中);.arr deny紅色虛線,用於明確拒絕或權限邊界;.mon虛線次要流程;.deploy儲存庫 → 帳戶;.uses跨帳戶使用。路徑僅使用絕對M H V L。 G中的字形:核心clock、ecs、lambda、ssm、kms、sqs、rpc、hash、cube、target;網路alb、nat、igw、ep、ec2、db、waf、r53、logs、user;身分role、gcp;發布branch、cloud;AIbrain;品牌github、vercel、discord、pagerduty、slack。品牌字形為白色:為圖塊設定品牌顏色(github#24292f、vercel#000000、discord#5865F2、pagerduty#06AC38;slack為彩色,圖塊 #ffffff)。僅以其實際標誌路徑添加品牌。- 網路、IAM、發布和矩陣投影片在模板中作為註解區段存在。取消註解區段,填寫
#net、#iam、#rel或.mx表格,並使用player()註冊每個 Play。
步驟 1 — 在程式碼中研究系統(強制性,繪圖前)
在部署分支上研究:該分支的合併會套用到生產環境。僅與預設分支比較以找出漂移;繪製生產環境實際運行的內容。如果儲存庫很大,可以委派給一個子代理。要求它提供包含檔案路徑的事實簡報。
- 讀取儲存庫的
AGENTS.md/README文件,然後是 IaC(Terraform、CDK 等)、服務代碼、合約和部署文件。追蹤指向關聯儲存庫的引用。 - 決定圖表必須顯示的內容。 從使用者詢問的主要流程開始。列出它所觸及的元素,從頭到尾,並只保留受眾需要理解的內容。典型的元素種類:
- 執行時期元件:任務、函數、服務、工作者、監控器、作業。
- 觸發器:排程器、佇列、事件、Webhook、使用者。
- 資料和組態:參數儲存、機密、資料庫、佇列。
- 信任和簽章:金鑰儲存、簽署者、跨越邊界的角色。
- 外部參與者:RPC/API 提供者、聊天/警報工具、鏈、第三方服務。
- 邊界:帳戶、區域、網路、鏈上與鏈下。 說明你省略了哪些元素以及原因。
- 對於你保留的每個元素,在程式碼中尋找對圖表重要的內容。 僅限於會成為區塊、箭頭或說明的資訊:啟動它的內容;它讀取的內容;它寫入或傳送的內容;為它簽署或授權的角色及其方式;誰為它付費(費用、gas、成本所有人;尋找例外情況);它位於哪個邊界。
- 所有權。 建立一個帳戶 × 區域的表格,以及儲存庫 → 每個儲存庫在各處部署的內容,僅在系統有多個帳戶或多個區域時才需要。如果沒有,則跳過此表格和所有權投影片。
- 網路。 完整讀取網路 IaC:VPC 和子網(CIDR、AZ 數量、每個資源所在的層級)、路由表、NAT 和網際網路閘道、私有端點(以及是否啟用私有 DNS)、每個安全群組及其每個規則(來源、連接埠、CIDR 或 SG 參考)、負載平衡器(內部或網際網路面向、監聽器預設動作)、CDN 來源類型、服務發現、堡壘主機或其他人工存取方式、流程日誌。記錄位於公有子網中的內容。記錄哪些雲端 API 呼叫通過 NAT 離開(因為沒有端點)。在繪圖前將結果寫成邊緣紀錄:每個安全群組規則配對和每個負載平衡器目標群組一行,格式為
source → destination :port (file:line)。在根目錄及其呼叫的每個模組中搜尋每個規則資源(對於 AWS:aws_vpc_security_group_ingress_rule、aws_vpc_security_group_egress_rule、ingress/egress區塊、aws_lb_target_group、aws_lb_listener、aws_vpc_endpoint)。不要從摘要或記憶中建立紀錄。 - IAM。 在根目錄及其模組中搜尋每個角色、政策、政策附加、政策文件、信任政策和權限邊界。撰寫一個 IAM 紀錄,每個角色一行:
role | 受信任者 + 每個條件 | 主要授予 | 明確拒絕、邊界 | file:line。條件是受眾需要了解的資訊:OIDC 儲存庫 ID、引用、環境、ExternalId、SourceAccount、工作階段名稱。然後選擇:- 主要角色: 跨越邊界(另一個帳戶、CI、客戶)的角色、可以變更基礎架構的角色或接觸客戶資料的角色。僅寫入自己日誌的角色則省略(報告它們)。
- 關鍵政策(0–5 個): 明確拒絕陳述式、權限邊界、
*資源、iam:PassRole、跨帳戶sts:AssumeRole。引用 sid。如果沒有,請說明;不要虛構。
- 發布路徑。 讀取每個 CI 工作流程:觸發器(
pull_request或push、分支、paths)、CI 環境、它假設的角色、Fork PR 保護、套用前的建置步驟以及手動觸發。讀取誰合併發布的儲存庫規則。對於應用程式映像檔,讀取部署者角色(信任引用、它們可以推送和更新的內容)以及 IaC 是否忽略任務定義變更。此儲存庫外部的應用程式儲存庫工作流程是未經確認的,除非你讀取它們。 - 資料儲存。 列出每個儲存客戶、稽核或機密資料的儲存:資料庫、儲存桶、IaC 狀態、日誌群組、機密儲存。對於每個:加密金鑰(客戶 KMS、雲端管理、儲存管理)和 TLS、保留(備份、物件鎖定、版本化、生命週期、日誌天數、刪除保護、機密復原視窗)、可用性(Multi-AZ、另一個區域或帳戶中的副本)、暴露程度、可以讀取資料的對象(包括 CI 在其拒絕之後)以及稽核(資料事件、資料庫日誌)。將每個儲存格評級為強、部分或差距,並附上 file:line。
- 即時狀態。 對於每個計算元素,讀取其期望計數(或副本、排程)及其前方的閘道(WAF 預設動作、監聽器規則、功能旗標)。計數為零或在邊緣被阻擋的服務是暫停狀態;簡報中會說明。
- 公開暴露。 搜尋
public_access_block、principals中的"*"、acl、publicly_accessible、associate_public_ip_address、internal = false、開放的安全群組 CIDR。列出每個公開物件、端點或帳戶範圍的寬鬆設定,以及其代價(例如,失去一層保護的儲存桶)。 - 手動建立。 搜尋信任錨點(DNS 區域、OIDC 提供者、狀態儲存桶、連線、帳戶設定)的資料查詢,以及註解和部署指南中的「console」、「by hand」、「out of band」、「manual apply」。保持一份清單:「手動建立,在 IaC 之外」。
- 將你無法在程式碼中確認的所有內容標記為未經確認。告知使用者。不要將其繪製為事實。
- 從程式碼中獲得步驟順序,而不是從使用者的清單。如果程式碼順序不同,請使用它並說明。
然後為檢查撰寫 ledger.txt,內容基於邊緣和 IAM 紀錄:
arrowId | source -> destination :port | file:line,或 - | left out: reason | file:line。
步驟 2 — 建立簡報
投影片:
- 標題。
- 帶 Play 的主要流程圖。 從第一個觸發器到最終效果的區塊。Play、上一步、下一步和重置按鈕,以及每個步驟一個說明。
- 帶 Play 的網路流程圖。 一個 VPC,繪製一次(不按 AZ 重複;在方塊標題中寫明 AZ 數量和子網 CIDR)。頻段:公有子網、私有子網。VPC 外部:CDN 或用戶端、操作者、網際網路。Play 步驟,按此順序:傳入流量(CDN 來源、負載平衡器 SG、任務 SG)、應用程式到資料(資料庫 SG、內部負載平衡器)、傳出流量(任務出口、路由到 NAT、網際網路閘道)、隔離路徑(沒有網際網路路由的函數、端點)、人工存取(堡壘主機、連接埠轉發)。將連接埠以
.tag文字放在每個箭頭旁(:443、:5432)。流程日誌和其他觀察者使用虛線,且不包含在 Play 中。 如果系統沒有自己的網路(例如,僅受管無伺服器服務),則跳過此投影片,並在報告中說明。 - 帶 Play 的主要 IAM 角色。 三欄:可以假設的角色(儲存庫和分支、雲端服務、另一個帳戶)→ 角色圖塊(Security #DD344C)→ 它觸及的內容(資源圖塊或籌碼)。將信任條件作為
.tag文字放在信任箭頭上(ref: main、ExternalId)。將每個關鍵政策繪製為一條紅色.arr deny線,指向它所阻擋的內容,並將 sid 或動作作為標籤(Deny ssm:*)。每個角色群組(CI、部署者、執行時期、跨帳戶)一個 Play 步驟,然後每個關鍵政策一個步驟。使用與其他投影片相同的名稱。 - 變更如何到達生產環境,帶 Play。 頂行放置分支圖塊(標籤在上方),每個分支套用的帳戶圖塊在其下方,底層放置應用程式儲存庫和部署者角色。箭頭標籤說明閘道(
PR + plan、merge: apply、push to main)。步驟遵循實際順序;說明哪些步驟由人員手動執行。 - 資料所在位置(矩陣)。 一個 HTML 表格(
.mx),而非 SVG。每個儲存一行,欄位:加密、保留、可用性、暴露程度、誰可以讀取資料、稽核。每個儲存格以狀態圖示和標籤開頭(✓ 強、◐ 部分、✕ 差距),並使用狀態 token--good/--warn/--crit,絕不使用系列顏色。每個儲存格帶有title屬性包含其來源。頁尾說明跨領域差距(另一個區域中無副本、可以編輯其自身拒絕的 CI)。矩陣保持其自身的字型大小;它必須在不滾動的情況下適合投影片。 - 帳戶、區域和儲存庫。 一個靜態圖表。僅在步驟 1「所有權」適用時使用。
- 關鍵要點,3–5 行簡短文字。僅使用你在步驟 1 中驗證過的主張。如果屬實,包含一個網路主張(例如,公有子網中的內容)。「手動建立」清單放在此處或帳戶投影片上。
規則(從審查中學到;請遵守所有規則)
準確性
- 繪製程式碼中的每個簽章關係。當金鑰儲存(例如 KMS)執行簽章時,使用它的每個元件都應有自己指向它的箭頭。尋找多個簽署者。
- 在搜尋程式碼中的例外情況之前,不要撰寫絕對主張("X 從不付費"、"Y 不包含機密"、"Z 總是…")。如果存在例外,請說明或放棄該主張。
- 投影片上的每個安全或可靠性屬性必須來自程式碼或組態。不要添加你未找到的聽起來合理的保證(法定人數、重試、冗餘)。
- 為你保留的每個元素繪製每個觸發器和每個讀取/寫入。不要只繪製主要路徑上的那些。
範圍與雜訊
- 不要為每個環境(開發/測試/正式環境並排)複製相同的圖表。顯示一個環境,預設為正式環境,並說明。
- 如果正式環境是多區域的,請顯示它。將區域方塊放在每個帳戶內,並為每個區域標註其角色(主要、複本、待命、備份)。
- 主要流程與次要流程。 Play 步驟僅涵蓋使用者詢問的主要流程。繪製共用相同基礎架構的其他流程(監控、警報、管理或批次作業)作為虛線。將它們排除在 Play 步驟之外,並提供簡短的圖例。
覆蓋範圍(每次發佈前檢查)
- 在跨越環境(發布路徑、帳戶)的投影片上,讀取每個根目錄,而不僅僅是正式環境的。一個由每個根目錄呼叫的模組(部署者角色、管道、信任)建立的部署路徑會觸及每個環境:為每個環境繪製一個箭頭,並附上它們信任的分支或條件。「僅限正式環境」需要證明其他根目錄沒有呼叫它。
- 負載平衡器、代理、閘道、端點或佇列永遠不是箭頭的終點。繪製它以及後端的元件,第二跳作為其自己的箭頭和步驟。