AWS Systems Manager 是 SOA-C02 SysAdmin 的瑞士刀——一個統一主控台,取代了 SSH、取代了 cron、取代了臨時補丁腳本、取代了寫死在 EC2 user-data 裡的密鑰,也取代了跳板機。在 SOA-C02 考試中,Systems Manager 貫穿 Domain 3 Task Statement 3.2(「自動化手動或重複性流程」)和 Domain 1 Task Statement 1.2(「根據監控與可用性指標排解問題」),並且是 AWS Config 自動補救的後端、EventBridge 目標選項(Lambda 的替代方案),也是唯一在不開放 port 22 的情況下對整個機隊執行 Run Command 的官方途徑。如果 CloudWatch 是 SOA-C02 的神經系統,Systems Manager 就是 SOA-C02 的雙手。
本指南從 SysOps 角度走過 Systems Manager 全流程:SSM Agent 如何識別一台 instance 以及什麼讓受管 instance 成為「受管」、Run Command 與 State Manager 的差異(單次執行 vs 持續保持期望狀態)、Patch Manager 基線如何定義哪些補丁被核准以及自動核准延遲的運作方式、Maintenance Windows 如何按排程在機隊中協調補丁作業、Automation runbooks 如何透過 assumeRole 與條件分支串接步驟、Session Manager 如何移除 SSH 跳板機與 port 22、Parameter Store SecureString 與 Secrets Manager 的關係(以及差異),以及 Inventory 和 OpsCenter 如何提供合規與事件工作流程。你也會看到反覆出現的 SOA-C02 情境:agent 未受管診斷、「補丁已核准但未安裝」、Maintenance Window 並發調整、Automation runbook IAM AssumeRole,以及私有子網中 Session Manager 的 VPC endpoint 需求。
為什麼 Systems Manager 是 SOA-C02 Domain 3 的核心
官方 SOA-C02 Exam Guide v2.3 在 Task Statement 3.2 下列出三項技能:「使用 AWS 服務(例如 Systems Manager、CloudFormation)自動化部署流程」、「實作自動化補丁管理」,以及「使用 AWS 服務(例如 EventBridge、AWS Config)排程自動化任務」。Systems Manager 出現在三項中的兩項,而 Patch Manager 是「實作自動化補丁管理」技能中唯一的 AWS 原生答案——沒有其他在考試範圍內的服務能夠按排程對 EC2 機隊執行 OS 補丁。Domain 3 佔全卷 18%,Task Statement 3.2 產生其中絕大多數的題目。
Domain 1 Task Statement 1.2 則從不同角度再次用到 Systems Manager:「使用 AWS Systems Manager Automation runbooks 根據 AWS Config 規則採取行動」。當 AWS Config 偵測到不合規資源時,aws.config 事件上的 EventBridge 規則路由到執行補救的 SSM Automation document——標記缺少標籤的資源、加密未加密的 EBS 磁碟區、限縮開放的 security group。考試期望你能端對端了解完整的 Config -> EventBridge -> SSM Automation 鏈,包括 SSM 所假設的 IAM 補救角色。
在 SysOps 層級,框架是運維而非架構。SAA-C03 問「你應該使用哪個 AWS 服務來管理機隊的補丁?」SOA-C02 問「夜間補丁週期在 12% 的 instance 上失敗——依序列出診斷步驟」。答案永遠涉及同樣三個基礎:SSM Agent 必須正在執行、IAM instance profile 必須包含 AmazonSSMManagedInstanceCore,以及到 SSM endpoint 的網路路徑必須存在(NAT gateway、internet gateway,或 VPC interface endpoint)。三者缺一,Systems Manager 看起來什麼都沒做——靜默地失敗。這種靜默是 SOA-C02 的經典陷阱。
- SSM Agent:輕量級守護程式(Linux 上的
amazon-ssm-agent,Windows 服務名稱AmazonSSMAgent),預裝在多數現代 AWS 官方 AMI 上。Agent 會輪詢 Systems Manager,並在主機上執行 Run Command、State Manager、Automation 及 Session Manager 的工作。 - 受管 instance(managed instance):任何向 Systems Manager 註冊的 EC2 或混合型(on-prem)主機。成為受管 instance 需要三個條件:agent 正在執行、附有
AmazonSSMManagedInstanceCore的 IAM instance profile(on-prem 則需 hybrid activation),以及到 SSM 服務端點的對外網路連線。 - Document(SSM Document):定義在受管 instance 上執行步驟的 JSON 或 YAML 範本。Document 類型包括
Command(用於 Run Command 和 State Manager)、Automation(除了 instance 外也能呼叫 AWS API 的多步驟協調)、Session(Session Manager 偏好設定)及Package。 - Run Command:針對以 instance ID、標籤或資源群組定義的目標集,執行 Command document 的單次、臨時遠端執行。
- State Manager:持續保持期望狀態——
State Manager association按排程對目標集重複執行 Command document,強制執行期望的組態(agent 已安裝、防毒定義已更新、sshd 已強化)。 - Patch Manager:利用 patch baselines、patch groups 及 maintenance windows 對受管 instance 掃描並安裝 OS 補丁的 SSM 能力。
- Patch baseline:定義哪些補丁自動核准(依分類、嚴重性、產品)以及哪些明確核准或拒絕的規則集。每個 OS 系列都有 AWS 管理的預設基線;你可以自訂基線。
- Patch group:以標籤(
Patch Group = prod-rhel9)將 instance 綁定到自訂基線。一台 instance 只能屬於一個 Patch Group。 - Maintenance Window:具有排程的目標 instance 集合,用來執行任務(Run Command、Automation、Lambda、Step Functions)的週期性或一次性排程。大規模補丁作業使用帶有
AWS-RunPatchBaseline任務的 Maintenance Window。 - Automation runbook:具有分支、
assumeRole、aws:executeAwsApi、aws:executeScript、aws:waitForAwsResourceProperty及aws:approve步驟的多步驟 document——用於自助運維和 Config 自動補救。 - Session Manager:不需要 SSH 金鑰、跳板機或開放輸入 port 的瀏覽器或 CLI Shell 存取方式——可審計記錄至 S3 和 CloudWatch Logs。
- Parameter Store:用於組態資料和密鑰的階層式鍵值儲存。Standard 層免費;Advanced 層支援較大的值和策略。SecureString 使用 KMS 在靜止時加密。
- 參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html
白話文解釋 Systems Manager Automation、Patch Manager 與 Run Command
Systems Manager 有許多子服務,名稱容易混淆。三個類比能讓架構印象深刻。
類比一:大樓管理處
Systems Manager 是一棟大型辦公大樓(你的 AWS 帳戶)的大樓管理處。每台 EC2 instance 是一間裝了智慧門鎖的辦公室(SSM Agent),而管理處掌握著萬能鑰匙(IAM instance profile AmazonSSMManagedInstanceCore)。沒有安裝門鎖、也沒有萬能鑰匙備案,管理人員就無法進入——那個房間是「未受管的」。Run Command 是管理人員逐間巡視、執行一次性任務(「替所有標記為 Floor=3 的辦公室換燈泡」)。State Manager 是長期重複指令(「每週檢查每間辦公室的煙霧偵測器是否正常,若電池耗盡則更換」)。Patch Manager 是全棟大樓的窗戶更換計畫——有patch baseline(指定哪些型號的窗戶通過規格)、patch groups(北向辦公室和南向辦公室使用不同的玻璃),以及 Maintenance Window(每週日凌晨兩點到五點,每次只替換十間,確保大樓不會全面停業)。Automation runbooks 是管理處的緊急應變手冊,列有編號步驟供管理人員在火災警報響起時依序執行——步驟一疏散、步驟二通報、步驟三隔離、步驟四勘查——每個步驟都有 assumeRole 條款,說明需要哪個部門的鑰匙。Session Manager 是管理人員的萬用感應卡,不需要各辦公室的個別鑰匙(無需 SSH 金鑰)、也不需要側門(無需跳板機)就能進入任何一間——且每次進入都記錄在防竄改的門禁系統中。Parameter Store 是地下室的資料夾總管,存放標準供應品規格(油漆顏色、燈泡瓦數)——SecureString 抽屜用 KMS 金鑰上鎖。
類比二:IT 部門的作業手冊夾
SysAdmin 的實體作業手冊夾有各種索引頁:「建立新 VPN 使用者」、「輪換資料庫密碼」、「修補 RHEL 機隊」、「調查登入失敗警報」。每個索引頁都有編號步驟:步驟一、步驟二、步驟三,並有條件分支(「若步驟二傳回 RC=4,跳至步驟七」)。SSM Automation runbooks 正是那本手冊夾——但可直接執行。Document 將步驟定義為 aws:executeAwsApi(呼叫 AWS API)、aws:executeScript(在執行器上本機執行 Python 或 PowerShell 腳本)、aws:runCommand(在受管 instance 上執行 Command document)、aws:waitForAwsResourceProperty(輪詢直到條件滿足)及 aws:approve(暫停等待人工核准後繼續)。AWS 管理的 runbooks 如 AWS-RestartEC2Instance、AWS-StopEC2Instance、AWS-CreateSnapshot、AWS-PatchInstanceWithRollback 是每個 IT 部門都有的預印頁面;你的自訂 runbooks 是針對你們公司特定流程撰寫的程序。Runbook 作者指定 AssumeRole,讓 runbook 能以人類使用者沒有的較高權限行動——IT 部門的「深夜萬能鑰匙」由 runbook 引擎取出,而不是交給每位初級技術人員。
類比三:連鎖旅館的全國裝修計畫
修補機隊就像翻新一條連鎖旅館。不能一次關閉所有旅館——住客無處可去。Patch Manager + Maintenance Windows 是全國裝修排程:每間標記 Region=APAC 的旅館在週日凌晨兩點到五點進行翻新,MaxConcurrency = 10%(每次最多一成旅館停業施工),MaxErrors = 5%(若超過 5% 的旅館翻新失敗,立即暫停全國推進)。Patch baseline 是裝修規格書——油漆顏色、底漆品牌、光澤度——而自動核准延遲是廠商保固等待期:新油漆配方上市 7 天後才自動核准,讓工廠瑕疵先行浮現。Patch groups 為旅館貼上基線標籤(「豪華連鎖使用規格 A,平價連鎖使用規格 B」)。補丁合規報告是裝修後的驗收報告——每間旅館對應其基線的現況。整條流水線就是 SOA-C02 考試所謂「實作自動化補丁管理」的意涵。
對 SOA-C02 而言,大樓管理處類比在題目將多項能力串聯時最為實用——Run Command、State Manager、Patch Manager 都是同一支管理團隊使用不同工具,且有相同的 IAM 和網路前提條件。每當題目暗示「agent 沒有回應」或「補丁沒有安裝」,提醒自己:agent + IAM + 網路——三者必須同時具備。參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html
SSM Agent:生命週期、前提條件與疑難排解
SSM Agent 是每項 Systems Manager 能力的基礎。如果 agent 未以受管 instance 形式註冊,該主機上的 Run Command、State Manager、Patch Manager、Session Manager 及 Automation aws:runCommand 步驟全部無效。
Agent 安裝
Agent 自 2017 年起預裝於大多數 AWS 官方 AMI:Amazon Linux 2 / 2023、Ubuntu 16.04+、Windows Server 2008 R2+、RHEL/CentOS 7+、SUSE 12+、macOS,以及用於 EKS 受管節點的 Bottlerocket OS。對於較舊的 AMI、自訂 AMI 或 on-prem 主機,可透過以下方式安裝:
yum install -y amazon-ssm-agent(RHEL/CentOS/Amazon Linux)或snap install amazon-ssm-agent --classic(Ubuntu)。- MSI 安裝程式(Windows Server)。
- Run Command
AWS-ConfigureAWSPackage,參數name=AmazonSSMAgent——僅適用於主機已是受管狀態(先有雞後有蛋:只用於升級)。 - EC2 Image Builder 將最新 agent 版本烘焙進 golden AMI——SOA-C02 首選的機隊一致性做法。
Agent 透過 HTTPS port 443 向外連線至 Systems Manager 的區域端點(ssm.<region>.amazonaws.com、ec2messages.<region>.amazonaws.com 及 ssmmessages.<region>.amazonaws.com)。它從不接受輸入流量——這正是 Session Manager 安全的原因。
成為受管 instance 的三個前提條件
要讓 instance 出現在 Fleet Manager → Managed instances 中,以下三點必須全部成立:
- SSM Agent 已安裝且正在執行(
systemctl status amazon-ssm-agent)。 - IAM instance profile 附有
AmazonSSMManagedInstanceCore政策(或等效自訂政策,授予ssm:UpdateInstanceInformation、ssmmessages:*、ec2messages:*,以及 Inventory/Session Manager 日誌所需的寫入權限)。 - 到三個 SSM 端點的對外網路路徑——透過 internet gateway(公有子網)、NAT gateway(私有子網),或
com.amazonaws.<region>.ssm、com.amazonaws.<region>.ec2messages及com.amazonaws.<region>.ssmmessages的 VPC interface endpoints(無網際網路輸出的私有子網)。
三者缺任一,instance 將靜默地不進行註冊。Fleet Manager 根本不會列出它。以 instance ID 為目標的 Run Command 會傳回「InvalidInstanceId」——不是權限錯誤,不是網路逾時,就只是「不是有效的 SSM instance」。
On-prem 與混合環境
對於 on-prem 伺服器,透過 Systems Manager hybrid activation 註冊主機:建立一個帶有 IAM 服務角色的 activation(因為沒有 EC2,所以不是 instance profile),取得 activation 代碼和 ID,再於主機上執行 amazon-ssm-agent -register -code <code> -id <id> -region <region>。主機現在會以 mi- 前綴(而非 i-)顯示為受管 instance。SOA-C02 可能會問「在同一排程中補丁混合 EC2 和 on-prem 伺服器」——答案是 hybrid activation + 同時涵蓋兩個集合的 Maintenance Window。
Agent 疑難排解清單
當 Fleet Manager 中找不到某個 instance 時:
- Agent 是否正在執行?
sudo systemctl status amazon-ssm-agent——若已停止,執行sudo systemctl restart amazon-ssm-agent並檢查journalctl -u amazon-ssm-agent。 - IAM 角色是否附加且正確? EC2 主控台 → Instance → Security 索引標籤 → IAM Role。確認角色包含
AmazonSSMManagedInstanceCore。若角色在啟動後才附加,請重啟 agent 讓它重新讀取憑證。 - Agent 能否到達端點? 從 instance 執行:
curl -v https://ssm.us-east-1.amazonaws.com/——出現 TLS 握手就是好的。若逾時,檢查路由表(是否有 NAT gateway?)、security group 對外規則(443 是否允許?)、NACL 對外與對內規則(是否允許回應的臨時 port?),以及若 VPC 是隔離網路,是否有三個必要的 interface endpoints。 - Agent 版本不符? 較舊的 agent 對較新的 SSM 功能有已知 bug。Patch Manager 的
AWS-RunPatchBaseline在某些 OS 上需要 agent ≥ 3.0。透過 Run CommandAWS-UpdateSSMAgent更新——但 instance 必須已是受管狀態才能接收指令(這就是為什麼將 agent 烘焙進 AMI 是較佳做法)。 - 資源配額? 每個區域有受管 instance 的預設配額。對於非常大的機隊,透過 Service Quotas 申請增加。
SOA-C02 中測試最頻繁的 SSM 情境是「Run Command 沒有列出 instance」或「10% 的機隊補丁未安裝」。答案幾乎永遠是以下其中之一:agent 未執行(或版本錯誤)、IAM instance profile 缺少 AmazonSSMManagedInstanceCore,或網路路徑不存在(無 NAT gateway、無 internet gateway、無 VPC interface endpoint)。考試測試的是診斷順序——先 agent、再 IAM、再網路。參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-profile.html
- Agent 監聽 port:零個輸入;僅對外 HTTPS 443。
- 三個必要的 SSM 端點網域:
ssm.<region>.amazonaws.com、ec2messages.<region>.amazonaws.com、ssmmessages.<region>.amazonaws.com。 - 純私有子網機隊所需的 VPC interface endpoints:
com.amazonaws.<region>.ssm、com.amazonaws.<region>.ec2messages、com.amazonaws.<region>.ssmmessages。 - 預設 agent 心跳:agent 每 5 分鐘呼叫一次
UpdateInstanceInformation。連續兩次心跳未回報的 instance 會被標記為ConnectionLost。 - 受管 instance 前綴:EC2 為
i-,混合型(on-prem)註冊為mi-。 - 必要受管政策:
AmazonSSMManagedInstanceCore(現代最小權限)。舊版AmazonEC2RoleforSSM已棄用。 - 參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html
Run Command:無需 SSH 的臨時機隊執行
Run Command 是 Systems Manager 中最簡單的能力,也是日常 SysOps 使用頻率最高的工具。它對一組目標執行 Command document,收集 stdout/stderr,並回報每台 instance 的成功或失敗狀態。
Run Command 呼叫流程
- SysOps 工程師選擇一個 Command document——例如
AWS-RunShellScript(Linux)、AWS-RunPowerShellScript(Windows)、AWS-ConfigureAWSPackage(安裝/更新 SSM 分發的套件)、AWS-UpdateSSMAgent、AmazonCloudWatch-ManageAgent,或自訂 document。 - 定義目標:
- 依 instance ID——明確列出清單。
- 依標籤——例如
tag:Environment=prod。機隊規模下最常見的模式。 - 依 Resource Group——已儲存的查詢,解析為一組 instance。
- 設定並發控制:
- MaxConcurrency——同時執行指令的 instance 數(絕對數量或百分比)。
- MaxErrors——何時停止推進。達到
MaxErrors次失敗後,不再啟動更多 instance。
- 選擇性指定 S3 output bucket 和 CloudWatch log group,保留超過主控台 2,500 字元截斷的 stdout 完整輸出。
- 選擇性整合 CloudWatch alarm——若配置的 alarm 在執行期間觸發,停止指令。
每個目標的 agent 透過 SSM 服務接收工作,在本機執行,然後回報結果。沒有 SSH session、沒有輸入 port、沒有共用憑證。
常用 Command documents
AWS-RunShellScript/AWS-RunPowerShellScript——執行任意指令。快速但具風險;若有專用 document 請優先使用。AWS-ConfigureAWSPackage——從 SSM Distributor 安裝或升級套件(CloudWatch agent、Inspector agent、CrowdStrike 等第三方 agent)。AWS-UpdateSSMAgent——升級 agent 本身。AmazonCloudWatch-ManageAgent——使用 Parameter Store 中的組態安裝、設定並啟動 CloudWatch agent。AWS-RunPatchBaseline——依 Patch baseline 掃描或安裝補丁。Patch Manager 在 Maintenance Window 內就是呼叫這個 document。AWS-StartInteractiveCommand/AWS-StartSSHSession——Session Manager 啟動 documents。
Run Command vs State Manager
Run Command 是單次執行:你觸發它,它執行一次,完成。State Manager 是持續保持期望狀態:你建立一個 association,它按排程對目標集重複執行 Command document。兩個 SOA-C02 範例能說清楚差異:
- 「現在立刻將最新的 CloudWatch agent 組態套用到所有
Environment=prodinstance」——Run Command。 - 「確保每台新加入的
Environment=prodinstance 永遠都安裝並設定好 CloudWatch agent」——State Manager association,每 30 分鐘(預設)或任何 cron 排程執行,自動納入加入標籤的新 instance。
State Manager associations 也是 SOA-C02 對「稽核人員要求每台 instance 持續符合強化 Command document」問題的正確答案——Run Command 是一次性的,無法偵測組態偏移。
SOA-C02 的判斷線索是動詞。「執行」、「套用」一次 → Run Command。「確保」、「維持」、「持續」 → State Manager association。兩者使用相同的 Command documents,但 State Manager 按排程重複執行,並記錄每台 instance 的合規狀態。參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-state.html
Patch Manager:基線、Patch Groups 與掃描 vs 安裝
Patch Manager 是 SOA-C02 自動化 OS 補丁的答案。它依 patch baseline 掃描受管 instance,選擇性安裝已核准的補丁,並回報合規狀況。
Patch baselines
Patch baseline 是一組規則,決定哪些補丁對某個 OS 核准。每個 OS 系列都有 AWS 管理的預設基線:
AWS-AmazonLinux2DefaultPatchBaselineAWS-WindowsPredefinedPatchBaseline-OSAWS-UbuntuDefaultPatchBaselineAWS-RedHatDefaultPatchBaselineAWS-SUSEDefaultPatchBaselineAWS-CentOSDefaultPatchBaselineAWS-MacOSDefaultPatchBaseline
每個預設基線以 7 天自動核准延遲核准 Critical 和 Important 安全補丁——意即 OS 廠商發布的補丁在發布 7 天後自動核准。延遲的目的是防止社群發現迴歸問題前就推出有問題的補丁。
以下情況需要自訂基線:
- 需要不同的自動核准延遲(緊急零日修補設為 0 天;超保守的生產環境設為 14 或 30 天)。
- 只需核准部分分類(Security 但不含 Bugfix)。
- 需要在自動核准延遲到期前明確核准單一重大 CVE 補丁。
- 需要明確拒絕已知有問題的補丁。
- 需要超出預設值的 OS 層級補丁來源(例如私有套件倉庫)。
自訂基線透過以 Patch Group=<group-name> 標記 instance,與 patch group 建立關聯。一台 instance 只能屬於一個 Patch Group,因此標籤值的選擇至關重要。
- 預設自動核准延遲:AWS 管理基線的 Critical 和 Important 安全補丁為 7 天。
- Patch Group 標籤鍵:字面上就是
Patch Group(含空格)。標籤值是 Patch Group 名稱。一台 instance 只能屬於一個 Patch Group。 - Patch baseline 涵蓋的 OS:Amazon Linux 2/2023、Windows、Ubuntu、RHEL、SUSE、CentOS、macOS、Oracle Linux、Debian。
- 補丁合規狀態:
COMPLIANT、NON_COMPLIANT、UNSPECIFIED_DATA(instance 尚未掃描)。 - 操作模式:
Scan(僅回報合規,不安裝)、Install(安裝已核准補丁,必要時重新開機)。 - 參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-patch-baselines.html
掃描 vs 安裝
AWS-RunPatchBaseline document 接受 Operation 參數:
Scan——依基線評估 instance 並回報合規狀態。不安裝補丁,不重新開機。用於稽核和視窗前的準備度檢查。Install——安裝所有缺少的已核准補丁,若有補丁需要則重新開機(可設定:RebootIfNeeded或NoReboot)。
常見的運維模式:
- 透過 State Manager association 每日 Scan——每台 instance 每天回報一次合規狀態。CloudWatch dashboard 顯示全組織的合規百分比。
- 透過 Maintenance Window 每週 Install——週日凌晨兩點到五點,帶有
Operation=Install的 Maintenance Window 任務以MaxConcurrency和MaxErrors控制的批次修補機隊。
將 Scan 與 Install 分開,讓你能在排定的補丁視窗之間觀察偏移情況而不強制重新開機,也能讓合規報告驅動非補丁補救(例如,當某台 instance 重複無法補丁時,aws.ssm 合規事件上的 EventBridge 規則會呼叫值班人員)。
SOA-C02 的常見干擾項:團隊需要在 24 小時內推出關鍵零日補丁,但預設基線有 7 天自動核准延遲。選「等 7 天」或「從頭建立新基線」的考生答錯了。正確答案是以下其中之一:(a) 在現有基線中以 KB 編號或 CVE 明確核准該特定補丁(明確清單會覆蓋延遲);(b) 為緊急情況建立自動核准延遲 = 0 的新基線,關聯到受影響的 Patch Group,之後再還原;或 (c) 使用 patch lists 限定緊急推進範圍。7 天延遲是預設值,不是硬性規定——當已知重大漏洞的風險超過迴歸風險時,可以覆蓋。參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-patch-baselines.html
補丁合規回報
Patch Manager 發布每台 instance 的合規狀態,可在以下位置查看:
- Patch Manager 主控台 → Compliance。
- Systems Manager Inventory → Patch compliance。
- EventBridge——
aws.ssm事件的Configuration Compliance State Change詳細類型路由至 SNS 或 Lambda。 - AWS Config——
ec2-managedinstance-patch-compliance-status-check受管規則發出 Config 合規結果,可驅動自動補救鏈。
為了稽核目的,合規資料自然地透過 Config 或直接透過 SSM 整合流入 AWS Security Hub。
Maintenance Windows:排程全機隊作業
Maintenance Window 是帶有三個組成部分的週期性或一次性排程:一個排程、一組已註冊目標,以及一組已註冊任務。Maintenance Windows 是 Patch Manager 在機隊規模下運行的方式,對任何不應在上班時間執行的週期性作業也很有用。
排程
排程接受以下其中之一:
- cron 表達式——
cron(0 2 ? * SUN *)表示「每週日 UTC 凌晨兩點」。 - rate 表達式——
rate(7 days)。 - 一次性排程,指定特定日期。
選擇性的 ScheduleTimezone 將 cron 置於本地時間(例如 Asia/Taipei),避免 UTC 心算換算。選擇性的 Cutoff 指定在視窗結束前多少小時停止啟動新任務(讓已執行的任務有時間完成)。選擇性的 Duration 是視窗總共開放多長時間。
已註冊目標
目標在任務執行時解析,不在註冊時解析:
- 依 instance ID。
- 依標籤(最常見——
tag:Patch Group=prod-rhel9)。 - 依資源群組。
由於目標在執行時解析,符合標籤的新 instance 自動加入下一次視窗的執行。
已註冊任務
任務有四種類型:
RUN_COMMAND——呼叫 Command document(最常見:AWS-RunPatchBaseline)。AUTOMATION——呼叫 Automation runbook。LAMBDA——呼叫 Lambda function。STEP_FUNCTIONS——啟動狀態機執行。
每個任務帶有:
- MaxConcurrency——同時處理的目標數量。
10(絕對數)或10%(目標總數的百分比)。200 台 instance 的機隊在MaxConcurrency=10%下,每次修補 20 台,然後再 20 台,依此類推。 - MaxErrors——停止推進的條件。
5(絕對數)或5%。達到此數量的任務失敗後,不再啟動更多 instance。 - TaskInvocationParameters——document 特定參數(Operation=Install、RebootOption=RebootIfNeeded)。
- ServiceRoleArn——Maintenance Window 執行任務所假設的 IAM 角色(Maintenance Window 服務角色,不是 instance profile——這是兩個不同的 IAM 身分)。
- Priority——當多個任務註冊到同一個視窗時,優先度較低的任務先執行。
- MaxConcurrency:絕對數或百分比(例如
10%)。無預設值——必須指定,否則任務同時對所有目標執行。 - MaxErrors:絕對數或百分比。達到此數量失敗後,推進停止。生產補丁通常設為
5%。 - Cutoff 時間:在視窗結束前 N 小時停止啟動新任務。預設為
0(無截止)。 - 視窗時長:1 到 24 小時。
- 每個視窗的任務數:每個視窗最多 10 個任務。
- 每個視窗的目標數:每個視窗最多 50 組已註冊目標集。
- 參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-maintenance.html
情境模式:數百台 EC2 每週日凌晨兩點補丁
SOA-C02 典型設計:
- 為每台待補丁的 instance 貼標籤
Patch Group=prod-linux(及Environment=prod)。 - 為
prod-linux建立自訂 Patch baseline——Amazon Linux 2、Critical/Important 安全補丁、7 天自動核准延遲,加上所有緊急 CVE 的明確核准清單。 - 建立 Maintenance Window,使用
cron(0 2 ? * SUN *)、ScheduleTimezone=Asia/Taipei,時長 3 小時,截止 30 分鐘。 - 已註冊目標:
tag:Patch Group=prod-linux。 - 已註冊任務:
AWS-RunPatchBaseline,Operation=Install、RebootOption=RebootIfNeeded、MaxConcurrency=10%、MaxErrors=5%,輸出至 S3 bucket 供稽核。 - State Manager association 每日以
Operation=Scan執行AWS-RunPatchBaseline,讓合規狀態在週中也可見。 - EventBridge 規則監聽
aws.ssm合規狀態變更事件,對任何連續兩次未能補丁的 instance 發送 SNS 通知。
這條流水線幾乎是每個「補丁機隊」SOA-C02 情境的答案。
SSM Automation Runbooks:多步驟協調
Run Command 只能針對受管 instance,Automation runbooks 則在單一 document 中協調 AWS API 呼叫、instance 指令和人工核准。Automation runbooks 是將複雜補救和自助運維操作程式化的方式。
Automation document 結構
Automation document 是帶有 parameters、mainSteps 及 assumeRole 的 YAML(或 JSON)。每個步驟有一個來自小型函式庫的 action:
aws:executeAwsApi——執行任意 AWS API 呼叫(DescribeInstances、StopInstances、RestoreDBClusterFromSnapshot等)。最強大的 action。aws:executeScript——在執行器(Systems Manager 服務,不是你的 instance)上執行 Python 或 PowerShell 腳本。用於轉換和複雜邏輯。aws:runCommand——在受管 instance 上執行 Command document。aws:waitForAwsResourceProperty——輪詢 API 直到屬性達到目標值。用於等待 instance 進入running狀態或 stack 達到CREATE_COMPLETE。aws:assertAwsResourceProperty——若屬性不符則使 runbook 失敗。aws:approve——暫停等待一位或多位指定負責人透過主控台核准。用於需要人工判斷的生產影響步驟。aws:branch/aws:choice——根據前一步驟的輸出進行條件分支。aws:sleep——等待固定時間。
AWS 管理的 runbooks
AWS 發布了大量預建 runbooks。SOA-C02 高頻出現的有:
AWS-RestartEC2Instance——停止、等待、啟動一台 instance。簡單但在情境中出乎意料地常見。AWS-StopEC2Instance/AWS-StartEC2Instance。AWS-CreateSnapshot/AWS-DeleteSnapshot。AWS-PatchInstanceWithRollback——安裝補丁,若重新開機失敗則回滾。AWS-UpdateCloudFormationStack。AWS-RunPatchBaseline(也可作為 Run Command 的 Command document)。AWSConfigRemediation-*——一系列用於連接 AWS Config 規則的補救 runbooks。
Automation 的 IAM AssumeRole
Runbook 可由使用者、EventBridge、State Manager 或 AWS Config 補救呼叫。Runbook 本身以 document 中指定的 AssumeRole 身分運行——通常是擁有所有步驟所需權限聯集的角色。
角色的信任政策必須信任 ssm.amazonaws.com(Automation 服務主體)。常見錯誤:
- 信任政策缺少
ssm.amazonaws.com——runbook 立即以AssumeRole被拒而失敗。 - 角色權限缺少某個 API 呼叫——runbook 在該特定步驟失敗。
- 跨帳號 runbooks——目標帳號需要信任來源帳號的角色,而來源帳號角色需要對目標帳號角色的
sts:AssumeRole權限。
SOA-C02 情境描述一個連接到 Automation 補救 runbook 的 Config 規則「無法執行」。考生看到規則、EventBridge 目標和 runbook YAML。問題幾乎永遠是以下其中之一:(a) runbook 的 assumeRole 參數為空(runbook 嘗試使用呼叫者的權限,但因為呼叫者是 Config 服務而失敗);(b) IAM 角色的信任政策不包含 ssm.amazonaws.com;或 (c) 角色缺少某個步驟所需的 API 權限。沒有填寫 AssumeRole,runbook 會靜默失敗。參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/automation-permissions.html
情境模式:Config 規則 + EventBridge + SSM Automation
Domain 1.2 + Domain 3.2 的典型鏈:
- AWS Config 規則——例如
s3-bucket-public-read-prohibited。當 bucket 變為公開時,規則移至NON_COMPLIANT。 - AWS Config 補救組態——附加到規則,指定 SSM Automation runbook(例如
AWSConfigRemediation-RemoveS3BucketPolicyStatementForS3PublicAccess)和 IAM 補救角色。 - SSM Automation runbook——對違規的 bucket 執行,移除公開授權聲明,傳回成功。
- EventBridge 規則(選擇性)——同時將
aws.config不合規事件路由至 SNS,讓人員了解發生了什麼。
SOA-C02 陷阱:考生直接將 EventBridge 規則連接到 Lambda function,而非使用 Config 原生補救功能。兩者都行得通;當輸入是 Config 規則時,Config 補救是 AWS 原生答案,具備內建重試和日誌記錄。
Session Manager:取代 SSH 與跳板機
Session Manager 提供不需要 SSH 金鑰、不需要跳板機、不需要開放輸入 port 22 或 3389 的瀏覽器或 AWS CLI Shell 存取受管 instance 的方式。它是 SOA-C02 中測試最頻繁的 SSM 能力,因為它解決了每個 SysOps 團隊都面臨的安全問題。
Session 的運作方式
- 使用者開啟 Systems Manager → Fleet Manager → 選擇 instance → Start session(或從 CLI 執行
aws ssm start-session --target i-0abc123)。 - Session Manager 服務依 IAM 驗證使用者(使用者需要
ssm:StartSession權限)。 - 目標 instance 上的 SSM Agent 透過其現有的對外連線接收請求。
- Agent 產生一個 shell(預設:
ssm-user,帶有 sudo)。stdin 和 stdout 透過 SSM 服務流回使用者的瀏覽器/CLI——不會有輸入流量到 instance。 - Session 被記錄:每個按鍵和指令輸出可串流至 CloudWatch Logs 和/或 S3,可選擇以 KMS 加密。
Session Manager 在考試中的優勢
與跳板機 SSH 相比,Session Manager:
- 完全移除輸入 port 22——security groups 可拒絕所有輸入流量,大幅縮小攻擊面。
- 移除 SSH 金鑰——IAM 身分驗證 session;無需輪換或分發共用金鑰對。
- 移除跳板機 EC2 成本——不需要永遠開著的跳板機主機。
- 將每個 session 記錄至 S3/CloudWatch——可審計供合規使用。
- 在沒有 NAT/IGW 的私有子網中運作,只要 VPC 有三個 SSM interface endpoints。
- 與 IAM session policies 整合,限制使用者可以執行的指令。
Session 偏好設定
SessionManagerRunShell document 類型儲存帳號層級的偏好設定:
shellProfile——要啟動哪個 shell(預設 Linux 為bash,Windows 為cmd)。runAsEnabled——以自訂 OS 使用者而非ssm-user啟動 session。s3BucketName+cloudWatchLogGroupName——記錄 session 的位置。kmsKeyId——用於加密 session 日誌資料的 KMS 金鑰。idleSessionTimeout——在 N 分鐘後自動終止閒置 session。maxSessionDuration——session 長度的硬性上限。
私有子網的 Session Manager VPC endpoint 需求
對於沒有網際網路輸出的私有子網中的 instance,受管 instance 註冊所需的同三個 SSM VPC interface endpoints 也支援 Session Manager:
com.amazonaws.<region>.ssmcom.amazonaws.<region>.ec2messagescom.amazonaws.<region>.ssmmessages
若你還想讓 session 日誌從 instance 直接傳至 S3(而非透過 SSM 服務),可能還需要一個 S3 gateway endpoint。
每當情境提到「在不開放 port 22 的情況下安全存取私有子網中的 EC2」或「稽核每個管理員 session 供合規使用」,SOA-C02 預設答案就是 Session Manager——永遠不是跳板機、不是 SSH 金鑰對、不是開放 port 22。選擇跳板機 + 金鑰輪換的考生錯過了 SysOps 特定的運維模式。參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html
預設情況下,Session Manager 記錄至 CloudWatch Logs 和 S3 是未加密的。對於合規環境,在 session 偏好設定中使用客戶自管金鑰啟用 KMS 加密。考試有時會問「確保 session 日誌在靜止時受到保護」——答案是 session 偏好設定中的 KMS 金鑰,而不是僅靠 S3 儲存桶層級加密(雖然兩者結合是最佳做法)。參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-enable-encryption.html
Parameter Store:組態與密鑰
Parameter Store 是 Systems Manager 的階層式鍵值儲存。參數名稱是路徑(/myapp/prod/db/host),類型為 String、StringList 或 SecureString,存取透過參數 ARN 上的 IAM 政策控制。
層級
- Standard 層——免費,每個區域每個帳號最多 10,000 個參數,參數值最大 4 KB。不支援參數政策。
- Advanced 層——付費(撰寫時每個參數每月 0.05 USD),最多 100,000 個參數,值最大 8 KB,支援參數政策(到期、到期通知、無變更通知)。
SecureString
SecureString 參數以 KMS 在靜止時加密。參數的加密金鑰可以是:
- AWS 管理的金鑰
alias/aws/ssm(預設)。 - 建立時指定的客戶自管 KMS 金鑰。
讀取 SecureString 需要 ssm:GetParameter(s) 權限以及加密金鑰的 kms:Decrypt 權限。寫入需要 ssm:PutParameter 和 kms:Encrypt。
Parameter Store vs Secrets Manager
這個比較幾乎在每次 SOA-C02 考試中都會出現。
| 功能 | Parameter Store SecureString | Secrets Manager |
|---|---|---|
| 靜止加密 | KMS | KMS |
| 費用 | 免費(Standard)/ 每個參數每月 0.05 USD(Advanced) | 每個 secret 每月 0.40 USD + 每次 API 呼叫費用 |
| 原生自動輪換 | 無(需自行連接 Lambda) | 有——RDS、Redshift、DocumentDB 的內建 Lambda 輪換;其他 secret 的自訂輪換 Lambda |
| 跨帳號共享 | Advanced 層的資源政策 | 原生支援資源政策 |
| 版本控制 | 有 | 有 |
| 最大值大小 | Standard 4 KB / Advanced 8 KB | 64 KB |
| 使用情境 | 應用程式組態、簡單密鑰、不需輪換的密鑰 | 資料庫憑證、需要輪換的 API 金鑰 |
SOA-C02 的判斷線索:「自動輪換」→ Secrets Manager。「應用程式組態值,其中部分敏感」→ Parameter Store SecureString。「EC2 user-data 中有寫死的資料庫密碼,必須移除」→ Secrets Manager(因為從運維角度你也需要輪換,即使題目沒有明確說明)。
Public parameters
AWS 以 public Parameter Store 參數形式發布有用的值,路徑在 /aws/service/ 下:
/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64——最新的 Amazon Linux 2023 AMI ID。CloudFormationParameters可以引用這個,讓 stacks 永遠以最新 AMI 啟動。/aws/service/global-infrastructure/regions——所有 region 的清單。/aws/service/eks/optimized-ami/...——EKS 最佳化 AMI ID。
Public parameters 是「永遠啟動最新 AMI」而不需將 AMI ID 寫死在範本中的 SOA-C02 正確答案。
Inventory:軟體與組態目錄
Systems Manager Inventory 按排程收集受管 instance 的中繼資料:
- 已安裝應用程式(含版本)。
- 已安裝的 AWS 元件。
- 網路組態(介面、路由)。
- 已安裝的 Windows 更新。
- 指定路徑的檔案。
- 登錄機碼(Windows)。
- 操作員定義的自訂 Inventory 類型。
Inventory 底層是一個 State Manager association——它按排程(預設每 30 分鐘)執行 AWS-GatherSoftwareInventory document。收集的資料可在 SSM 主控台和 Inventory API 中查詢,也可透過 Resource Data Sync 同步至中央 S3 bucket,供跨帳號、跨 region 以 Athena 或 QuickSight 查詢。
SOA-C02 常見使用情境:
- 「找出所有執行 Apache 版本 < 2.4.55 的 instance」——Inventory 查詢已安裝應用程式。
- 「稽核組織內所有 Windows hotfix 安裝情況」——Resource Data Sync 至 S3 + Athena。
- 「識別具有特定組態檔案的 instance」——自訂 Inventory 類型。
OpsCenter:運維事項聚合
OpsCenter 是 Systems Manager 管理運維問題(稱為 OpsItems)的工作流程工具。OpsItem 是一個受追蹤的運維問題——它有狀態(Open、In Progress、Resolved)、受指派人員、相關資源和類別。
OpsItems 從以下來源自動建立:
- CloudWatch alarm 狀態變更(設定後)。
- AWS Config 不合規事件。
- AWS Health 事件。
- GuardDuty 發現。
- SysOps 工程師手動建立。
OpsCenter 是 SOA-C02「將多個 AWS 服務的運維警報整合到單一分流視圖」的答案。對於完整的事件回應,OpsCenter 與 Incident Manager(獨立子功能)整合,後者增加了 runbooks、值班輪換和聊天頻道整合。
常見陷阱:隔離 VPC 中的 SSM Endpoints
SOA-C02 的典型陷阱:完全私有子網中的 instance(無 NAT、無 IGW、無 Direct Connect、無公有 IP)即使 agent 正在執行且 IAM 角色正確,也無法以受管 instance 形式註冊。Agent 靜默地重試對 ssm.<region>.amazonaws.com 的 DNS 解析和 TLS 握手並逾時。修復方式是三個 SSM VPC interface endpoints(ssm、ec2messages、ssmmessages)。遺漏其中任何一個會產生部分功能問題:
- 缺少
ssmendpoint——instance 永遠無法註冊。 - 缺少
ec2messagesendpoint——Run Command 和 Patch Manager 失敗。 - 缺少
ssmmessagesendpoint——特別是 Session Manager 失敗(session 建立使用此 endpoint),但 Run Command 可能仍然運作。
考試直接測試三個 endpoint 的需求——只配置 ssm endpoint 並假設其他也能用的考生答錯了。
常見陷阱:Patch Manager 在上班時間重啟生產環境
如果你在 Maintenance Window 之外執行 AWS-RunPatchBaseline 並設定 Operation=Install 和 RebootOption=RebootIfNeeded——例如作為臨時的 Run Command——目標 instance 會在補丁需要時立即重新開機,不管你是在午餐時間還是正在處理 SEV1 事件。Maintenance Window 才是強制排程和並發的機制。SOA-C02 的教訓:Run Command 用於緊急情況或僅掃描;生產補丁應放在帶有 MaxConcurrency 和 MaxErrors 控制的 Maintenance Window 中。
常見陷阱:Hybrid Activation 代碼重複使用
Hybrid activation 代碼是短期的(預設 24 小時,最長 30 天),且受限於 instance 數量上限。操作員有時嘗試對數百台 on-prem 主機重複使用同一個 activation 代碼,發現超過上限後註冊失敗。正確的模式是在佈建時透過基礎設施即程式碼(CloudFormation、Terraform 透過 Systems Manager API)為每批次鑄造帶有適當 instance 數量上限的 activation 代碼,並定期輪換代碼。
常見陷阱:Run Command 沒有輸出
如果你在 Run Command 呼叫中沒有設定 S3 output bucket 或 CloudWatch Log Group,指令的 stdout 在 Run Command 主控台中截斷為前 2,500 個字元。對於任何產生有意義輸出的指令(多行腳本、組態轉儲、合規報告),請務必在呼叫時指定 S3 輸出位置——這是 SOA-C02 常見干擾項,考生以為 Run Command 壞了,但實際上只是輸出被截斷了。
SOA-C02 vs SAA-C03:運維視角
| 問題風格 | SAA-C03 視角 | SOA-C02 視角 |
|---|---|---|
| 補丁管理 | 「哪個 AWS 服務可自動化 OS 補丁?」 | 「Patch Manager 上週日跳過了 12% 的 instance——依序列出診斷步驟。」 |
| 跳板機替代 | 「哪個服務可安全取代 SSH 跳板機?」 | 「設定帶有 KMS 加密 CloudWatch Logs 和 30 分鐘閒置逾時的 Session Manager。」 |
| 密鑰管理 | 「在 Parameter Store 和 Secrets Manager 之間選擇。」 | 「RDS 憑證寫死在 EC2 user-data——遷移至 Secrets Manager 並每 30 天輪換一次。」 |
| 自動化 | 「哪個服務執行排程補救?」 | 「建立帶有正確 AssumeRole 的 Config 規則 + EventBridge + SSM Automation 鏈。」 |
| Run Command | 甚少測試。 | 大量測試——並發、輸出至 S3、MaxErrors、Run Command vs State Manager。 |
| Maintenance Windows | 「如何排程機隊補丁?」 | 「設定 cron cron(0 2 ? * SUN *) 並指定 MaxConcurrency=10% 和 MaxErrors=5%。」 |
| SSM Agent | 「SSM Agent 從哪裡來?」 | 「Instance 在 Fleet Manager 中不可見——列出每個需要驗證的前提條件。」 |
SAA 考生選擇服務;SOA 考生正確設定它、在不註冊時進行疑難排解,並在事件中操作補丁週期、自動化流水線和 session 日誌稽核。
考試信號:如何辨識 Domain 3.2 題目
- 「補丁未安裝」——診斷 agent + IAM + 網路,然後檢查基線自動核准延遲,再檢查 Maintenance Window MaxErrors 停止。
- 「無法 SSH 進入私有子網 instance」——Session Manager + SSM VPC endpoints。永遠不是跳板機 + SSH 金鑰。
- 「寫死的憑證必須移除」——Secrets Manager(帶輪換)或 Parameter Store SecureString(不需輪換)。
- 「Config 規則必須自動補救」——Config 補救組態 → SSM Automation runbook,帶有正確的 AssumeRole 和對
ssm.amazonaws.com的信任。 - 「持續合規,而非單次」——State Manager association,不是 Run Command。
- 「按排程補丁」——帶有 cron 的 Maintenance Window、已註冊標籤、
AWS-RunPatchBaseline任務、MaxConcurrency 和 MaxErrors。 - 「永遠啟動最新 AMI」——
/aws/service/下的 Public Parameter Store 參數。 - 「來自多個來源的運維警報需要分流」——OpsCenter OpsItems。
- 「稽核每個管理員 session」——Session Manager + S3/CloudWatch Logs + KMS 加密。
- 「在同一排程中補丁 on-prem 主機和 EC2」——SSM hybrid activation + 同時涵蓋兩者的 Maintenance Window。
Domain 3 佔 18%,Task Statement 3.2 涵蓋 Systems Manager 驅動的自動化和補丁,預計在這個確切領域會有 8 到 10 題,加上來自 Domain 1.2(Config + EventBridge + SSM Automation 鏈)的 2–3 題。掌握本節的模式是 SOA-C02 中效益最高的備考活動之一。參考:https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html
決策矩陣——每個 SysOps 目標對應的 Systems Manager 能力
考試時使用此查詢表。
| 運維目標 | 主要能力 | 備註 |
|---|---|---|
| 對機隊執行單次指令 | Run Command | 機隊規模依標籤指定目標;指定 S3 輸出以獲取完整 stdout。 |
| 持續維持組態 | State Manager association | 按排程重複執行 Command document;透過標籤自動納入新 instance。 |
| 按排程補丁機隊 | Patch Manager + Maintenance Window | Patch baseline + Patch Group 標籤 + cron + MaxConcurrency + MaxErrors。 |
| 在視窗外執行緊急補丁 | Run Command 搭配 AWS-RunPatchBaseline |
或將基線自動核准延遲改為 0 以應對緊急 CVE。 |
| 取代 SSH 跳板機 | Session Manager | + S3/CloudWatch Logs、KMS 加密、IAM session policy。 |
| 存取私有子網中的 EC2 | Session Manager + SSM VPC endpoints | 全部三個:ssm、ec2messages、ssmmessages。 |
| 儲存帶輪換的 DB 憑證 | Secrets Manager | 內建 RDS/Redshift/DocumentDB Lambda 輪換。 |
| 儲存部分敏感的組態值 | Parameter Store SecureString | 不需輪換時比 Secrets Manager 更便宜。 |
| 永遠啟動最新的 Amazon Linux AMI | Public Parameter Store parameter | /aws/service/ami-amazon-linux-latest/...。 |
| 自動補救 Config 規則 | Config 補救 → SSM Automation runbook | 或 EventBridge → SSM Automation。AssumeRole 必須信任 ssm.amazonaws.com。 |
| 帶分支的多步驟協調 | Automation runbook | aws:executeAwsApi、aws:branch、aws:approve 用於人工關卡。 |
| 目錄化機隊的已安裝軟體 | Inventory + Resource Data Sync | 同步至 S3,以 Athena 查詢。 |
| 分流運維警報 | OpsCenter OpsItems | 聚合 CloudWatch、Config、Health、GuardDuty 發現。 |
| 補丁 on-prem 伺服器 | SSM Hybrid Activation + Patch Manager | 同一個 Maintenance Window 同時涵蓋 EC2 和 on-prem。 |
| 太多失敗時停止補丁推進 | MaintenanceWindow MaxErrors | 生產環境通常設為 5%。 |
| 限制管理員 shell session 長度 | Session Preferences maxSessionDuration |
加上 idleSessionTimeout 控制閒置。 |
| 對機隊更新 SSM Agent | Run Command AWS-UpdateSSMAgent |
或透過 Image Builder 將較新 agent 烘焙進 golden AMI。 |
常見陷阱總整理——Systems Manager Automation、Patch Manager 與 Run Command
陷阱一:補丁「已核准」但未安裝
補丁可以被基線核准,但仍未安裝——因為 instance 不在任何帶有 Operation=Install 的 Maintenance Window 任務範圍內,或因為 Maintenance Window 因 MaxErrors 停止,或因為 instance 在與預期不同的 Patch Group 中。檢查 Maintenance Window 歷程記錄和每台 instance 的合規狀態。
陷阱二:預設 7 天自動核准延遲拖慢緊急補丁
以明確核准清單或 auto-approval delay = 0 的自訂基線覆蓋。不要等 7 天。
陷阱三:SSM Agent 在缺少 IAM 或網路時靜默失敗
AmazonSSMManagedInstanceCore 加上到三個 SSM 端點的連線能力。缺少任一都是靜默失敗——Fleet Manager 根本不會列出該 instance。
陷阱四:Session Manager 日誌未加密
預設 session 日誌未加密。對於合規環境,在 session 偏好設定中使用客戶自管 KMS 金鑰設定 kmsKeyId。
陷阱五:Automation runbook 的 AssumeRole 為空
沒有 AssumeRole,runbook 嘗試使用呼叫者的身分。有線配置的 Config 補救無法提供這個——runbook 必須指定 AssumeRole,且角色的信任政策必須包含 ssm.amazonaws.com。
陷阱六:Run Command 輸出截斷為 2,500 字元
對任何非簡單的指令輸出,在呼叫時務必指定 S3 output bucket 和/或 CloudWatch Log Group。
陷阱七:Parameter Store SecureString 缺少 kms:Decrypt
讀取 SecureString 需要 ssm:GetParameter 以及加密金鑰的 kms:Decrypt。缺少後者會在解密時產生 AccessDeniedException,考生常誤診為參數存取問題。
陷阱八:Maintenance Window 任務應使用 Maintenance Window 服務角色而非 instance profile
Maintenance Window 本身以服務角色(AWS-SystemsManager-MaintenanceWindowRole 或類似)執行,與目標 instance 的 instance profile 不同。協調 Run Command 的權限來自服務角色;document 在主機上執行的動作的權限來自 instance profile。混淆兩者會導致難以追蹤的權限錯誤。
陷阱九:Patch Group 標籤鍵有空格
字面標籤鍵是 Patch Group(含空格)——不是 PatchGroup(駝峰式)也不是 patch_group。拼錯鍵名會讓 instance 靜默地退回預設基線。
陷阱十:一台 instance,一個 Patch Group
一台 instance 每次只能屬於一個 Patch Group。以 Patch Group=foo 和 Patch Group=bar 同時標記一台 instance(第二個標籤覆蓋第一個)不會讓它進入兩個基線——它只採用最後套用的標籤值。
FAQ — Systems Manager Automation、Patch Manager 與 Run Command
Q1:為什麼 Run Command 沒有列出我的 EC2 instance?
三個前提條件必須全部滿足:(a) SSM Agent 正在 instance 上執行——檢查 systemctl status amazon-ssm-agent;(b) IAM instance profile 附有 AmazonSSMManagedInstanceCore(或等效政策);以及 (c) instance 透過 HTTPS port 443 有到 ssm.<region>.amazonaws.com、ec2messages.<region>.amazonaws.com 和 ssmmessages.<region>.amazonaws.com 的對外網路連線——透過 internet gateway、NAT gateway 或 VPC interface endpoints。如果 instance 在完全私有的子網中,你必須建立全部三個 VPC interface endpoints。SOA-C02 考試的診斷順序確實是:先 agent、再 IAM、再網路。
Q2:Run Command 和 State Manager 有什麼差異?
Run Command 是單次執行:你觸發它,它執行一次,完成。State Manager 是持續保持期望狀態:一個 State Manager association 按排程對目標集重複執行 Command document,自動納入符合目標標籤的新 instance。兩者底層使用相同的 Command documents。SOA-C02 的判斷線索是動詞:「現在執行」或「套用一次」→ Run Command;「確保」、「維持」或「持續強制執行」→ State Manager。State Manager 也為每個 association 記錄每台 instance 的合規狀態,而 Run Command 不會。
Q3:當預設基線有 7 天自動核准延遲時,如何在 24 小時內推出緊急安全補丁?
三個選項。(a) 以 KB 編號或 CVE 將特定補丁加入基線的明確核准清單——這僅對該補丁覆蓋自動核准延遲。(b) 為緊急情況建立 auto-approval delay = 0 的新 Patch baseline,關聯到受影響的 Patch Group,之後再還原。(c) 使用 Run Command 搭配 AWS-RunPatchBaseline 和指向一次性緊急基線的 BaselineOverride 參數。預設 7 天延遲不是硬性限制——它是保護免受問題補丁影響的預設值,當已知重大漏洞的風險超過迴歸風險時可以覆蓋。
Q4:什麼時候應選擇 Parameter Store SecureString vs Secrets Manager?
在以下情況使用 Secrets Manager:(a) 密鑰需要自動輪換——Secrets Manager 對 RDS、Redshift、DocumentDB 憑證有內建 Lambda 輪換,對其他密鑰有自訂輪換;(b) 密鑰值較大(Secrets Manager 允許 64 KB,而 SecureString 的 Advanced 層為 8 KB,Standard 層為 4 KB);或 (c) 你需要透過資源政策進行細粒度的跨帳號共享。在以下情況使用 Parameter Store SecureString:(a) 值是組態資料,可能敏感,但不需要輪換;(b) 大量使用時成本較重要——Parameter Store Standard 免費;(c) 你想要階層組織(/myapp/prod/db/host)。對於 SOA-C02 考試,「輪換」或「RDS 憑證」→ Secrets Manager;「應用程式組態值,部分敏感」→ Parameter Store SecureString。
Q5:為什麼我的 SSM Automation runbook 因「AssumeRole 被拒」而失敗?
Runbook 的 assumeRole 參數指向一個 IAM 角色,該角色的信任政策必須包含 ssm.amazonaws.com 作為受信任主體。沒有它,Systems Manager Automation 服務就無法假設該角色,需要該角色權限的每個步驟都會失敗。此外,角色必須擁有任何步驟所執行的每個 API 呼叫的權限——aws:executeAwsApi 呼叫需要被呼叫 API 的明確 IAM 權限。常見模式:呼叫 s3:PutBucketPolicy 的補救 runbook 若角色不包含該權限,即使 AssumeRole 本身成功,也會在該步驟失敗。排解 Automation runbook 失敗時,務必同時檢查信任政策和權限。
Q6:如何在同一個排程中補丁 on-prem 伺服器和 EC2 instance?
透過 SSM Hybrid Activation 註冊 on-prem 伺服器:在 Systems Manager 主控台中,建立帶有 IAM 服務角色的 activation,取得 activation 代碼和 ID,並在每台 on-prem 主機上以 amazon-ssm-agent -register -code <code> -id <id> -region <region> 執行 agent。主機現在會以 mi- 前綴(相對於 EC2 的 i-)顯示為受管 instance。以和你的 EC2 機隊相同的 Patch Group 標籤標記 on-prem instance。設定帶有匹配標籤的目標集的 Maintenance Window,同樣的 AWS-RunPatchBaseline 任務會在同一個視窗中補丁 EC2 和 on-prem instance。這是 SOA-C02 跨雲和 on-prem 統一補丁的典範答案。
Q7:Maintenance Window 中的 MaxConcurrency 和 MaxErrors 有什麼差異?
MaxConcurrency 控制並行度——同時執行任務的目標 instance 數量。10 表示同時 10 台;10% 表示目標集的 10%。第一批完成後,下一批開始。MaxErrors 控制失敗容忍度——整個推進停止前的任務失敗數量。5 表示 5 次失敗後停止;5% 表示目標集的 5% 失敗後停止。兩者配合使用:在 200 台 instance 的機隊上,MaxConcurrency=10% 和 MaxErrors=5% 意味著視窗以 20 台一批進行,若 200 台中有 10 台失敗則永久停止。生產補丁通常使用較小的並發(5–20%)和較小的錯誤容忍(1–5%),避免有問題的補丁導致整個機隊下線。
Q8:能否從另一個帳號執行 SSM Automation runbook?
可以,透過 Automation 跨帳號、跨 region 執行。Runbook 在來源帳號中呼叫,但透過假設的角色在目標帳號中執行 API 呼叫。設定方式:(a) 在每個目標帳號中,建立由來源帳號信任且帶有 runbook 所需權限的 IAM 角色;(b) 在來源帳號中,建立能對目標帳號角色執行 sts:AssumeRole 的 AWS-SystemsManager-AutomationExecutionRole;(c) 以列出目標帳號和 region 的 TargetLocations 參數呼叫 runbook。Runbook 引擎為每個位置假設目標帳號角色並在該處執行。SOA-C02 可能問「從中央安全帳號補丁多帳號機隊」——Automation 跨帳號執行 + Systems Manager StackSets 式扇出是答案。
Q9:Session Manager session 日誌如何運作,日誌存放在哪裡?
Session 可記錄至 CloudWatch Logs、S3 或兩者,在 session 偏好設定(SessionManagerRunShell SSM document)中設定。每個按鍵和指令輸出都串流至配置的目的地。KMS 加密透過偏好設定中的 kmsKeyId 選擇性啟用。啟動 session 的 IAM 主體需要配置目的地的 s3:PutObject 和 logs:CreateLogStream / logs:PutLogEvents(SSM 服務代表使用者身分串流資料)。Session 日誌是 SSH 替代使用情境的主要稽核軌跡,SOA-C02 預期你在合規情境中以 KMS 加密啟用它們。不設定 session 偏好設定,sessions 完全不會記錄——只有中繼資料(誰、何時、哪個 instance)會出現在 CloudTrail 中。
Q10:Maintenance Window 任務在視窗時長結束時仍在執行會怎樣?
Maintenance Windows 有一個 Cutoff 值(以小時計),指定在視窗結束前多少時間停止啟動新任務。已執行的任務在視窗結束後若主機在合理時間內完成則繼續進行,但截止後不再納入新 instance。例如,Duration=4 小時、Cutoff=1 小時,視窗從凌晨兩點開始,五點停止啟動新任務,六點結束。這保護了在最後時刻啟動的任務不會在維護時間內無法完成。SOA-C02 考試可能問「補丁只部分套用到機隊,超過某個時間點後新 instance 未被納入」——答案是 Cutoff,不是失敗。調整 Cutoff 至少等於最長預期的每台 instance 任務時長,確保推進在視窗內乾淨完成。
延伸閱讀與相關運維模式
- What is AWS Systems Manager
- Working with SSM Agent
- Troubleshooting SSM Agent
- AWS Systems Manager Run Command
- AWS Systems Manager State Manager
- AWS Systems Manager Patch Manager
- About Patch Baselines
- About Patch Groups
- AWS Systems Manager Maintenance Windows
- AWS Systems Manager Automation
- Automation Runbook Reference
- AWS Systems Manager Session Manager
- Setting Up Session Manager
- AWS Systems Manager Parameter Store
- AWS Systems Manager Inventory
- AWS Systems Manager OpsCenter
- Create an IAM Instance Profile for Systems Manager
- Create VPC Endpoints for Systems Manager
- Systems Manager Compliance
- AWS SOA-C02 Exam Guide v2.3 (PDF)
Systems Manager 就位後,接下來的運維層包括:CloudFormation Stacks 和 StackSets,用於部署 SSM 資源本身的基礎設施即程式碼佈建,為可重複環境補充 Systems Manager;排程任務與 Config 自動補救,用於驅動 Systems Manager Automation 的 EventBridge cron 規則和 Config 補救設定;EventBridge 規則和 SNS 通知,用於將 alarms 和 Health 事件路由進同一條 SSM Automation 流水線;以及 IAM 政策、MFA、SCPs 和存取疑難排解,用於每項 Systems Manager 能力所依賴的 IAM 身分(instance profiles、automation 角色、Maintenance Window 服務角色)。