examlab .net 用最有效率的方法,考取最有價值的認證
Vol. I
本篇導覽 約 30 分鐘

Secrets Manager 與 SSM Parameter Store

5,820 字 · 約 30 分鐘閱讀 ·

全面掌握 AWS Secrets Manager 與 Systems Manager Parameter Store 以備考 DVA-C02 — 包含搭配 Lambda 的機密輪換、staging labels、Lambda extension 快取、階層式路徑、ECS valueFrom 注入,以及每個開發者情境的決策樹。

立即做 20 題練習 → 免費 · 不用註冊 · DVA-C02

AWS Secrets Manager 與 AWS Systems Manager Parameter Store 是每位 DVA-C02 考生都必須能夠清楚區分的兩項服務。兩者都儲存字串、都透過 AWS KMS 在靜態加密,也都能從 Lambda、ECS 或 EC2 以 SDK 呼叫取得。但只有其中一項是具備自動輪換功能的真正機密管理服務,也只有一項在標準層是免費的。如果你在考試當天無法在十秒內於 Secrets Manager 和 Parameter Store 之間做出抉擇,這篇文章就是為了解決這個問題而存在的。

本主題帶你走過開發者必須掌握的每一個操作細節:Secrets Manager 如何搭配 Lambda 輪換範本輪換憑證、staging labels(AWSCURRENT、AWSPREVIOUS、AWSPENDING)如何驅動輪換狀態機、Secrets Manager Lambda extension 如何快取機密以降低冷啟動延遲與成本、Parameter Store 階層式路徑如何組織各環境的設定、SecureString 參數如何使用 KMS,以及 ECS task definition 如何透過 valueFrom 模式注入兩種值。每個章節結尾都附有一個你在 DVA-C02 上可以預期會考到的重點事實。

AWS Secrets Manager 與 Parameter Store 是什麼?

AWS Secrets Manager 是一項專為機密管理而設計的服務。它儲存機密(資料庫密碼、API 金鑰、OAuth token、TLS 私鑰),以 AWS KMS 加密,對每次更新進行版本控制,並按你定義的排程執行 Lambda 輪換函式。Secrets Manager 的計費方式為每個機密每月 0.40 美元,加上每一萬次 API 呼叫 0.05 美元——比多數 AWS 服務都貴,但這個價格換來的是輪換、跨 Region 複寫,以及與 RDS、Redshift、DocumentDB 的一流整合。

AWS Systems Manager Parameter Store 是 Systems Manager 家族中的設定與機密儲存服務。它儲存三種值類型——String、StringList 與 SecureString——並以 /prod/api/db/password 這樣的階層式路徑命名空間加以組織,在 Standard 層(最多 10,000 個參數,每個最大 4 KB)完全免費。Parameter Store 本身不會主動輪換機密。它是存放各環境設定、功能旗標,以及不需要輪換的機密的首選服務。

DVA-C02 為何大量考這兩項服務

DVA-C02 考試指南的 Domain 3(部署)與 Domain 4(安全性)合計約有 15% 的題目涉及設定與機密管理。預計會有多道題目要求你在 Secrets Manager 與 Parameter Store 之間做選擇、找出輪換後正確的 staging label,或者閱讀 ECS task definition 並選擇正確的 valueFrom ARN 格式。由於開發者在實際工作中每週都會接觸這兩項服務,題目傾向以情境為主,而非死記硬背。

Secrets Manager 與 Parameter Store 在開發者工作流程中的定位

在典型的 Serverless 或容器化工作負載中,Parameter Store 存放非敏感設定(日誌等級、功能旗標、第三方端點 URL),而 Secrets Manager 存放會輪換的 RDS 主密碼。在冷啟動時,Lambda 函式呼叫一次 GetSecretValue,將結果快取在記憶體中(或使用 Lambda extension 透過 runtime API 快取),並在快取到期前跨呼叫重複使用該值。ECS 任務則透過容器定義上的 valueFrom 將 Parameter Store SecureString 值與 Secrets Manager 機密兩者注入,讓服務呼叫轉變為應用程式可見的環境變數。

白話文解釋 Secrets Manager and Parameter Store

類比一——開放廚房料架與上鎖香料保險箱(餐廳廚房類比)

想像一間專業餐廳的廚房。Parameter Store 是開放的食材儲藏架——麵粉、砂糖、義大利麵、橄欖油,都以階層式路徑標示在整齊的格子裡(/baking/flour/bread/baking/flour/pastry)。任何值班廚師都能直接取用。有些格子上了共用廚房鑰匙的鎖(SecureString 使用 KMS),但整個儲藏架依路徑組織,進去拿東西完全免費。Secrets Manager 則是存放松露油和番紅花的上鎖香料保險箱——最貴重的材料。每瓶都有輪換排程(主廚在氧化前每三十天更換一次),每瓶都有標籤標示當前版本、前一版本(萬一新瓶有問題可退回),以及待啟用版本(正在準備中的新瓶)。只有主廚和幾位資深廚師知道密碼。保險箱裡每瓶要收月租費,但你永遠不必擔心裡面的材料過期。需要輪換的東西放保險箱,只需要整齊存放又容易找到的東西放儲藏架。

類比二——飯店鑰匙系統(旅館/款待業類比)

想像一家飯店有兩套鑰匙系統。Parameter Store 是房號列表、Wi-Fi SSID、早餐時間和電梯密碼的總表——大多是張貼在前台的公開營運資訊。部分項目在櫃檯後方(SecureString,KMS 加密),但整份清單依樓層與區域(階層式路徑)組織,任何持有前台識別證的人都能查詢。Secrets Manager 是電子鑰匙卡系統。每張員工鑰匙卡都有當前晶片、前一晶片(在寬限期內仍有效,以防新晶片讀卡失敗),以及正為明日班次佈建中的待啟用晶片。當員工請假時,鑰匙卡自動輪換;若新晶片無法啟用,卡片回退至前一晶片。前台服務員從 Lambda 禮賓員口袋裡的快取(Lambda extension 快取)取得有效的鑰匙卡晶片 ID,而不是每次有客人辦理入住就跑下去鑰匙庫一趟。輪換是這套鑰匙卡系統的核心價值;如果你只需要房號,用前台清單就好。

類比三——工具箱與鎖匠服務車(工作台/工具箱類比)

想像一位承包商抵達工地。Parameter Store 是貨車上的工具箱——電鑽、鐵錘、捲尺,螺絲按尺寸分類放在標有路徑的格子裡(階層式路徑)。大多數工具放在外面(String、StringList),少數格子上了掛鎖(SecureString 使用 KMS),工具箱免費——本來就是車子附的。Secrets Manager 是隔壁按排程重新配鎖的鎖匠專屬服務車。它保留上一把鑰匙的備份(AWSPREVIOUS),以防新鑰匙卡住,同時正在準備交接用的下一把鑰匙(AWSPENDING)。鎖匠服務車按每把鎖每月收取固定維護費。日常工作用工具箱,需要不能永久留存的鑰匙時才找鎖匠服務車。

核心運作原則——Secrets Manager 與 Parameter Store 基礎

在比較這兩項服務之前,先內化在每道 DVA-C02 題目中都會出現的共同原則。

兩者都以 AWS KMS 在靜態加密

Secrets Manager 一律以 KMS 金鑰加密機密。你可以使用預設的 aws/secretsmanager AWS 受管金鑰,或使用客戶受管金鑰以取得稽核控制與跨帳號存取能力。Parameter Store 的 String 與 StringList 值以明文儲存;只有 SecureString 值以 KMS 加密。KMS 金鑰的選擇很重要:跨帳號共用需要客戶受管金鑰,因為 AWS 受管金鑰無法跨帳號共用。

兩者都透過 SDK 或 API 取得

應用程式呼叫 secretsmanager:GetSecretValue(Secrets Manager)或 ssm:GetParameter / ssm:GetParameters / ssm:GetParametersByPath(Parameter Store)來取得值。取得操作受 IAM 管控,範圍限定於資源 ARN,並記錄至 CloudTrail。兩項服務都不會主動推送值給客戶端——客戶端採用拉取方式,通常在冷啟動時取得後快取在記憶體中。

兩者都與 ECS、EKS、Lambda 及 CloudFormation 整合

ECS task definition 使用帶有 valueFrom(ARN)的 secrets 區塊,將兩種服務的值注入為環境變數或檔案掛載。Lambda 不會原生將機密注入環境變數——你必須在處理函式內部呼叫 GetSecretValue(或使用 Lambda extension)。CloudFormation 透過 {{resolve:ssm:/path:version}} 參考 Parameter Store,透過 {{resolve:secretsmanager:arn:SecretString:key:version}} 參考 Secrets Manager。

兩者都不是憑證提供者的替代品

Secrets Manager 與 Parameter Store 儲存值。它們無法取代 IAM 角色來存取 AWS 服務。應用程式仍應使用 Lambda、ECS 任務或 EC2 執行個體的 IAM 角色來呼叫 AWS API。Secrets Manager 用於儲存應用程式在連線字串中輸入的資料庫密碼,而非 AWS SDK 憑證。

AWS Secrets Manager——深入探討

機密的外觀

Secrets Manager 中的機密是一個以 ARN 識別的版本化物件。每個版本帶有一個 VersionId(UUID)及零個或多個 staging labels。承載內容可以是 SecretString(JSON 或純文字,最常見)或 SecretBinary(Base64 編碼的位元組)。RDS 機密的典型內容是一個 JSON blob:{"username":"admin","password":"P@ssw0rd!","engine":"mysql","host":"mydb.xxxx.rds.amazonaws.com","port":3306,"dbname":"appdb"}

Staging Labels——AWSCURRENT、AWSPREVIOUS、AWSPENDING

Secrets Manager 機密的每個版本都可以帶有一個或多個 staging labels。三個標籤是保留字:

  • AWSCURRENT——指向應用程式預設取得的版本。不帶 VersionStage 參數的 GetSecretValue 會回傳 AWSCURRENT。
  • AWSPREVIOUS——指向最後一次輪換前的 AWSCURRENT 版本,用於回滾。
  • AWSPENDING——指向輪換 Lambda 剛建立但尚未驗證的版本。只有在 Lambda 成功對目標(RDS、Redshift、DocumentDB)測試新憑證後,輪換才會將 AWSPENDING 提升為 AWSCURRENT。

考試當天請記住這個生命週期:createSecret 以 AWSPENDING 建立新版本 → setSecret 將新值寫入資料庫 → testSecret 驗證資料庫接受新值 → finishSecret 將 AWSCURRENT 從舊版本移至新的 AWSPENDING 版本,將舊的 AWSCURRENT 降級為 AWSPREVIOUS,並移除 AWSPENDING 標籤。這個四步驟狀態機是標準的輪換流程。

Staging label = 指向機密特定版本的可讀指標。Secrets Manager 使用三個保留標籤(AWSCURRENT、AWSPREVIOUS、AWSPENDING)驅動輪換狀態機,你也可以附加自訂標籤以進行應用程式專屬的版本固定。沒有任何 staging label 的版本會在 24 小時後排程刪除。

搭配 Lambda 的自動輪換

Secrets Manager 輪換依排程執行(每 N 天一次,或使用 Secrets Manager 輪換 v2 的 cron 表達式)。排程觸發時,Secrets Manager 會以四個階段調用 Lambda 輪換函式:createSecretsetSecrettestSecretfinishSecret。AWS 為最常見的目標提供預建的輪換 Lambda 範本:

  • RDS——MySQL、MariaDB、PostgreSQL、Oracle、SQL Server、Db2
  • Aurora——MySQL 相容、PostgreSQL 相容
  • Amazon Redshift——叢集管理員與使用者
  • Amazon DocumentDB——叢集主要帳號
  • Amazon ElastiCache——Redis OSS 驗證 token(需要 ElastiCache ≥ 7.0)

你也可以為非 AWS 目標(第三方 SaaS API 金鑰、內部部署 LDAP 帳號)撰寫自訂輪換 Lambda。Lambda 需要 IAM 權限來呼叫 secretsmanager:GetSecretValuesecretsmanager:PutSecretValuesecretsmanager:UpdateSecretVersionStage,以及目標服務所需的任何權限(例如 IAM 驗證 RDS 密碼變更所需的 rds-db:connect)。

單一使用者與交替使用者輪換策略

Secrets Manager 輪換支援兩種策略。單一使用者在每個週期輪換同一個資料庫使用者的密碼——簡單,但每次輪換在密碼更新期間會有短暫的連線失敗窗口。交替使用者保留兩個資料庫使用者(appuser_aappuser_b),每個週期交替輪換——零停機,但資料庫必須能容許兩個具有相同權限的使用者。考試記住:交替使用者是零停機的模式。

版本控制與回滾

每次 PutSecretValue 都會以新的 UUID 建立新版本。沒有 staging labels 的舊版本在 24 小時後移除。若輪換導致正式環境故障,你可以呼叫 UpdateSecretVersionStage 將 AWSCURRENT 移回 AWSPREVIOUS 版本來進行回滾。這就是 AWSPREVIOUS 的重要性——它是你的回滾控制點。

跨帳號共用

若要跨 AWS 帳號共用機密,請在機密上附加資源型政策,授予另一個帳號的主體 secretsmanager:GetSecretValue,並確保加密機密所用的 KMS 金鑰是客戶受管金鑰(非 aws/secretsmanager),因為預設的 AWS 受管金鑰無法跨帳號使用。接收方帳號再以完整 ARN 呼叫 GetSecretValue

跨 Region 複寫

Secrets Manager 複寫將機密複製到一個或多個額外的 Region。複寫保持副本同步——主要端的更新會傳播至副本,你也可以將副本提升為主要端以進行災難復原。每個副本在計費上視為一個獨立的機密。當你的應用程式是多 Region 架構且需要低延遲本地讀取資料庫密碼時,這個功能非常實用。

程式碼中的取得方式

Python 的標準 SDK 模式如下:

import boto3, json
client = boto3.client('secretsmanager')
resp = client.get_secret_value(SecretId='prod/rds/mydb')
secret = json.loads(resp['SecretString'])
conn = psycopg2.connect(host=secret['host'], user=secret['username'], password=secret['password'])

每次 SDK 呼叫都是一次計費的 API 請求。在 Lambda 中,請在處理函式外部(模組層級)呼叫 get_secret_value 一次,讓快取值在同一個容器的暖呼叫之間存活。冷啟動時,這會增加約 50 至 150 毫秒。在 ECS 或 EC2 中,將值快取在記憶體中直到容器或程序的生命週期結束,並在計時器到期或驗證失敗時重新整理。

AWS Secrets Manager Lambda Extension

Secrets Manager Lambda extension 是一個 AWS 受管的 layer,以 sidecar 程序的形式在你的 Lambda 執行環境中運行,並在 http://localhost:2773/secretsmanager/get?secretId=prod/rds/mydb 暴露一個 HTTP 快取端點。你的 Lambda 程式碼向該 localhost 端點發送 HTTP GET,而不是呼叫 AWS SDK。extension 使用 Lambda 的 IAM 角色(透過 AWS_LAMBDA_RUNTIME_API)進行驗證,在第一次請求時取得機密,並將其快取在記憶體中直到 extension 的生命週期結束(預設 TTL 300 秒,可設定)。

Extension 的優點:

  • 更低延遲——記憶體快取命中為次毫秒級,相較於冷 SDK 呼叫的約 50 至 150 毫秒快得多。
  • 更低成本——減少 Secrets Manager API 呼叫次數;extension 對同一容器上的並行呼叫去重複。
  • 無需 SDK 程式碼——你的處理函式只需呼叫 http://localhost:2773 並解析 JSON。
  • 繼承驗證身份——extension 使用 AWS_LAMBDA_RUNTIME_API 取得函式執行角色的憑證。

透過將 AWS-Parameters-and-Secrets-Lambda-Extension layer ARN 附加到你的函式來新增 extension。使用 SECRETS_MANAGER_TTL 環境變數設定快取 TTL。同一個 extension 也會快取 Parameter Store 參數,因此單一 layer 即可涵蓋兩項服務。

當你的函式在每次呼叫都讀取同一個機密時,請使用 Lambda extension。 高並行的 Lambda 若在每次請求都呼叫 GetSecretValue,可能產生驚人的 Secrets Manager API 費用(每一萬次 0.05 美元,在 1,000 RPS 下迅速累積),並對每個請求增加延遲。Extension 每個容器只快取一次,並從 localhost 提供服務——加一個 layer、設一個環境變數,即可大幅節省成本與降低延遲。同時適用於 Secrets Manager 和 Parameter Store。

IAM 政策模式

請將每個 IAM 政策範圍限定在機密 ARN 上,而非 Resource: "*"。一個嚴謹的政策:

{
  "Effect": "Allow",
  "Action": ["secretsmanager:GetSecretValue"],
  "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/rds/mydb-??????"
}

六個問號的後綴是為了應對 Secrets Manager 在刪除並重新建立後附加在每個機密 ARN 上的隨機後綴。若你的程式碼需要檢查 metadata,請授予 secretsmanager:DescribeSecret;若使用客戶受管 KMS 金鑰,請在加密金鑰上授予 kms:Decrypt

刪除與復原窗口

刪除機密是一個兩步驟流程。DeleteSecret 會以 7 至 30 天的復原窗口(預設 30 天)排程刪除機密。在窗口期間,RestoreSecret 可取消刪除。窗口到期後,機密將被永久移除。測試時可以傳入 ForceDeleteWithoutRecovery=true 來跳過窗口(正式環境不建議)。

Secrets Manager 預設強制執行最少 7 天的復原窗口。 在測試迴圈中反覆建立與刪除機密的腳本會遇到配額錯誤,因為「已刪除」的機密名稱仍處於保留狀態。請為每次測試執行使用唯一的機密名稱,或對暫時性測試傳入 ForceDeleteWithoutRecovery=true。正式環境應始終遵守復原窗口以防止意外。

AWS Systems Manager Parameter Store——深入探討

參數類型——String、StringList、SecureString

Parameter Store 接受三種值類型:

  • String——純文字,Standard 層最大 4 KB,Advanced 層最大 8 KB。不加密。
  • StringList——以逗號分隔的清單,以單一字串回傳,由客戶端解析。
  • SecureString——以 KMS 金鑰在靜態加密的純文字值。取得時需要對該金鑰具備 kms:Decrypt 權限。

SecureString 可使用預設的 aws/ssm AWS 受管金鑰(簡單,不支援跨帳號)或客戶受管 KMS 金鑰(支援跨帳號共用與明確金鑰輪換)。

Standard 層與 Advanced 層

Parameter Store 的每個參數有兩個層級:

  • Standard——免費,每個 Region 每個帳號最多 10,000 個參數,值最大 4 KB,無每參數費用,不支援參數政策。
  • Advanced——每個參數每月 0.05 美元,每個 Region 每個帳號最多 100,000 個參數,值最大 8 KB,支援參數政策(到期、到期通知、無變更通知)。

DVA-C02 記住:Standard 免費,足以應付大多數工作負載。Advanced 的使用時機是需要更多參數、更大的值或參數政策時。參數政策會針對到期或長時間無變更觸發 EventBridge 事件,適合用於標記過期的機密。

階層式路徑

參數名稱是以 / 分隔的路徑:/prod/web/api/db/password/dev/web/api/db/password/prod/web/api/feature-flags/new-checkout。這個階層並非檔案系統意義上的目錄——它是一種命名慣例,GetParametersByPath 搭配遞迴旗標加以利用。

aws ssm get-parameters-by-path \
  --path "/prod/web/api" \
  --recursive \
  --with-decryption

這一次呼叫就能取得 /prod/web/api 下的每個參數。在 Lambda 或 ECS 冷啟動時,這是最有效率的模式——一次 API 呼叫取得所有環境設定,而不是每個參數呼叫一次。IAM 政策可以使用 Resource: "arn:aws:ssm:us-east-1:123456789012:parameter/prod/web/api/*" 將權限範圍限定在路徑前綴上,免費實現基於路徑的授權。

參數版本控制

每次 PutParameter 都會建立一個新版本(整數,單調遞增)。你可以用 name:version 語法取得特定版本:/prod/web/api/db/password:3。不指定版本時,取得最新版。Parameter Store 為 Advanced 參數保留完整版本歷史;Standard 至少保留最後 100 個版本。可用於回滾,也可用於以 CloudFormation {{resolve:ssm:/prod/web/api/db/password:3}} 將 Lambda 固定到特定參數版本。

透過 AWS RAM 跨帳號共用

Parameter Store 參數可以使用 AWS Resource Access Manager(RAM)跨 AWS 帳號共用。建立資源共用、將參數 ARN 加入共用,並邀請目標帳號。接收方帳號以完整 ARN(而非僅名稱)呼叫 GetParameter。SecureString 值需要客戶受管 KMS 金鑰,並且該金鑰也需要授予接收方帳號解密權限。RAM 共用僅適用於 Advanced 參數。

AMI ID 與服務端點的公開參數

AWS 在 /aws/service/* 下發布一棵公開參數樹,任何帳號都無需設定驗證即可讀取。兩個高價值的例子:

  • 最新 Amazon Linux 2 AMI——/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
  • 最新 ECS 最佳化 AMI——/aws/service/ecs/optimized-ami/amazon-linux-2/recommended

啟動設定和 CloudFormation 範本參考這些參數,而不是硬編碼 AMI ID,讓執行個體在無需手動更新的情況下自動取用最新 AMI。公開參數免費,且不計入你的參數配額。

/aws/service/* 下的 AWS 公開參數是取得最新 AMI ID 的官方正規做法。 DVA-C02 上你會看到這樣的情境:「啟動範本要如何在不手動更新的情況下始終取用最新的 Amazon Linux 2 AMI?」答案是使用 AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> 類型的 CloudFormation 參數,預設值設為 /aws/service/ami-amazon-linux-latest/...。記住路徑前綴——/aws/service/——這是考試的關鍵線索。

取得模式

Python SDK 取得方式如下:

import boto3
ssm = boto3.client('ssm')
p = ssm.get_parameter(Name='/prod/web/api/db/password', WithDecryption=True)
password = p['Parameter']['Value']

或批次取得:

resp = ssm.get_parameters_by_path(Path='/prod/web/api', Recursive=True, WithDecryption=True)
config = {p['Name']: p['Value'] for p in resp['Parameters']}

SecureString 值必須設定 WithDecryption=True;不設定的話只會得到密文。快取 Secrets Manager 的 Lambda extension 同樣也會快取 Parameter Store——將 HTTP GET 指向 http://localhost:2773/systemsmanager/parameters/get?name=/prod/web/api/db/password&withDecryption=true

Parameter Store 的 IAM 政策模式

IAM 政策以帶路徑萬用字元的參數 ARN 為範圍:

{
  "Effect": "Allow",
  "Action": ["ssm:GetParameter", "ssm:GetParametersByPath"],
  "Resource": "arn:aws:ssm:us-east-1:123456789012:parameter/prod/web/api/*"
}

SecureString 需額外在加密金鑰上加入 kms:Decrypt。這種路徑前綴模式能讓你授予 Lambda 存取自身環境設定的能力,同時不洩漏 dev 或 staging 的參數。

Secrets Manager vs Parameter Store——決策樹

DVA-C02 會給你一段情境描述,要求你選擇一項服務。在腦中跑一遍這個決策樹。

分支一——值是否需要自動輪換?

若情境提到「每 N 天輪換一次」、「排程憑證輪換」或「符合密碼輪換的合規要求」,答案就是 Secrets Manager。Parameter Store 本身不輪換。你可以用 EventBridge + Lambda + Parameter Store 自行實作輪換,但這不是 AWS 推薦的方式,考試中需要輪換時也永遠不是正確答案。

分支二——輪換的成本是否可接受?

Secrets Manager 每個機密每月 0.40 美元。500 個機密的工作負載,光儲存費用就是每月 200 美元。Parameter Store Standard 免費。若情境以成本最佳化為目標且不需要輪換,答案就是 Parameter Store Standard

分支三——值的大小是否超過 4 KB?

Standard Parameter Store 的值上限為 4 KB。Secrets Manager 支援到 64 KB。Parameter Store Advanced 支援到 8 KB。若需要儲存完整的 TLS 私鑰鏈或大型 JSON 設定,請使用 Secrets Manager 或 Parameter Store Advanced。

分支四——你是否需要階層式路徑取得?

若情境說「一次 API 呼叫取得 staging 環境的所有設定」,答案就是搭配 GetParametersByPathParameter Store。Secrets Manager 沒有原生的階層式取得 API;你需要依標籤或名稱前綴列出機密,效率較低。

分支五——你是否需要跨 Region 複寫?

Secrets Manager 內建 ReplicateSecretToRegions。Parameter Store 不會自動複寫——你需要自行撰寫 CloudWatch Events → Lambda 的工作流程。對於多 Region DR,Secrets Manager 是乾淨的答案。

分支六——這是 AWS 公開參數(AMI ID、Region 等)嗎?

若需要最新的 Amazon Linux 2 AMI ID 或 AWS Region 清單,答案一律是 /aws/service/* 下的 Parameter Store 公開參數。Secrets Manager 不發布公開值。

「儲存資料庫密碼」不等於自動就要用 Secrets Manager。 讀完整個情境。若密碼永遠不輪換(開發環境、短期測試資料庫、靜態服務帳號),Parameter Store SecureString 是更便宜的正確答案。Secrets Manager 的使用時機是情境提到輪換、合規驅動的憑證生命週期,或與 RDS、Redshift、DocumentDB 的原生整合。關鍵字是「輪換」——沒有這個字,先考慮 Parameter Store。

將機密注入 ECS 任務——valueFrom 模式

ECS 支援透過容器定義上的 secrets 區塊,以環境變數的形式注入 Parameter Store 和 Secrets Manager 的值。關鍵欄位是 valueFrom,接受 Parameter Store 參數名稱或 ARN,或帶有可選 JSON 金鑰選擇器的 Secrets Manager 機密 ARN。

Parameter Store 注入

{
  "containerDefinitions": [{
    "name": "app",
    "image": "myapp:latest",
    "secrets": [
      { "name": "DB_PASSWORD", "valueFrom": "arn:aws:ssm:us-east-1:123456789012:parameter/prod/app/db-password" },
      { "name": "LOG_LEVEL", "valueFrom": "/prod/app/log-level" }
    ]
  }]
}

當參數與任務在同一帳號和 Region 時,可使用較短的形式(僅參數名稱)。SecureString 值需要授予 ECS task execution role ssm:GetParameters 與 KMS 金鑰上的 kms:Decrypt

Secrets Manager 注入

{
  "secrets": [
    { "name": "DB_PASSWORD", "valueFrom": "arn:aws:secretsmanager:us-east-1:123456789012:secret:prod/rds/mydb-AbCdEf:password::" }
  ]
}

ARN 格式為 arn:...:secret:<name>-<suffix>:<jsonKey>:<versionStage>:<versionId>。結尾的 :password:: 從 AWSCURRENT 版本的 JSON 中選取 password 金鑰。若機密承載是純字串,使用不帶結尾欄位的 arn:...:secret:<name>-<suffix>

Task Execution Role 權限

ECS 使用 task execution role 取得機密,而非 task role。Execution role 是 ECS 在容器啟動前代表你拉取映像檔和取得機密所使用的角色。Task role 是你的應用程式程式碼在執行期間所擔任的角色。請將 secretsmanager:GetSecretValuessm:GetParameters 加上 kms:Decrypt 授予 execution role,注入才能在任務啟動時正常運作。

EKS 與 Kubernetes Secrets

EKS 使用 AWS Secrets and Configuration Provider(ASCP)搭配 Kubernetes Secrets Store CSI Driver。ASCP 將 Secrets Manager 機密和 Parameter Store 參數以檔案的形式掛載到 Pod 中,也可選擇性地同步至原生 Kubernetes Secrets。這超出 DVA-C02 核心範圍,但對實際工作而言值得了解。

Lambda 冷啟動與每次呼叫的取得模式

Lambda 函式可以在三個地方取得機密:冷啟動時(模組層級)、每次呼叫時(處理函式內部),或透過 Lambda extension 快取。選擇哪種模式對成本與延遲都有直接影響。

冷啟動——模組層級

import boto3, json
sm = boto3.client('secretsmanager')
SECRET = json.loads(sm.get_secret_value(SecretId='prod/rds/mydb')['SecretString'])

def lambda_handler(event, context):
    # SECRET 已在記憶體中
    ...

get_secret_value 呼叫每次容器初始化執行一次,結果在容器的生命週期內持續存在(暖函式可達數小時)。優點:API 成本最低,每次呼叫延遲低。缺點:冷啟動延遲增加約 100 毫秒;容器回收前不會取用輪換後的新值。

每次呼叫——處理函式層級

def lambda_handler(event, context):
    SECRET = json.loads(sm.get_secret_value(SecretId='prod/rds/mydb')['SecretString'])
    ...

每次呼叫都執行一次 GetSecretValue。始終取得最新輪換後的值。優點:始終最新。缺點:高 RPS 下成本高昂且對每個請求增加延遲。絕對不是正式環境 Lambda 的正確模式。

Lambda Extension——推薦

新增 AWS-Parameters-and-Secrets-Lambda-Extension layer、設定 SECRETS_MANAGER_TTL=300,並在處理函式中呼叫 http://localhost:2773/secretsmanager/get?secretId=prod/rds/mydb。Extension 將機密快取 300 秒,並在到期時重新整理。這結合了冷啟動快取與輪換回應性的優點。

Lambda extension 快取的 TTL 決定了輪換後的機密傳播速度。SECRETS_MANAGER_TTL 設定為符合應用程式對過期憑證的容忍度。300 秒的 TTL 意味著輪換後最多 5 分鐘的過期讀取。對容忍度低的工作負載,將 TTL 設為 60 秒——代價是更多的 GetSecretValue API 呼叫。對於設定參數,較長的 TTL(1800 秒)通常沒問題。

真實世界情境——DVA-C02 的考題類型

情境一——RDS 主密碼搭配 30 天輪換

DVA-C02 題目:「一位開發者需要儲存 RDS MySQL 資料庫的主密碼,並每 30 天輪換一次。應使用哪項服務?」答案:使用 RDS MySQL 輪換 Lambda 範本和 30 天輪換排程的 Secrets Manager。該範本自動處理 createSecret / setSecret / testSecret / finishSecret

情境二——Beta 推出的功能旗標

「一個 Lambda 函式在每次呼叫時讀取一個布林功能旗標,以決定是否啟用 beta 功能。哪種服務能最小化成本?」答案:Parameter Store Standard,免費層,搭配 Lambda extension 將值快取 60 秒。Secrets Manager 每個旗標每月需花費 0.40 美元;Parameter Store 免費。

情境三——CloudFormation 中的最新 Amazon Linux 2 AMI

「一個團隊希望其啟動範本在不手動更新的情況下始終使用最新的 Amazon Linux 2 AMI。」答案:以 AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> 類型的 CloudFormation 參數參考 AWS 公開參數 /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

情境四——跨帳號資料庫憑證

「帳號 A 執行一個 Aurora 叢集;帳號 B 執行一個需要叢集密碼的 Lambda。」答案:帳號 A 中使用 Secrets Manager,資源型政策授予帳號 B GetSecretValue,並以同樣授予帳號 B 解密權限的客戶受管 KMS 金鑰加密。Parameter Store Advanced 搭配 RAM 是一個替代方案,但 Secrets Manager 是憑證的預設選擇。

情境五——帶有 Stripe API 金鑰的 ECS 任務

「一個 ECS Fargate 任務需要以環境變數注入 Stripe API 金鑰,並每 90 天輪換一次。」答案:儲存於 Secrets Manager,在 task definition 中以 valueFrom 指向機密 ARN 參考,授予 task execution role secretsmanager:GetSecretValuekms:Decrypt,並撰寫自訂輪換 Lambda(因為 Stripe 不在內建輪換範本之列)。

情境六——高頻 Lambda 讀取同一個機密

「一個以 2,000 RPS 執行的 Lambda 在每次呼叫都讀取資料庫密碼,團隊對 Secrets Manager 帳單感到驚訝。」答案:新增 AWS Parameters and Secrets Lambda Extension,將 TTL 設為 300 秒,並將處理函式切換為向 localhost:2773 發送 HTTP GET。API 呼叫次數下降約 99%(每個容器每個 TTL 窗口一次呼叫,而非每次呼叫一次)。

IAM 範圍與最低權限

始終以 ARN 為範圍

正式環境中,絕對不要對 Secrets Manager 或 Parameter Store 授予 Resource: "*"。請範圍限定在特定機密 ARN(帶有 -?????? 後綴萬用字元)或特定參數路徑前綴。這能防止被入侵的 Lambda 讀取帳號中的所有機密。

分離讀取與寫入權限

應用程式角色只應具備 GetSecretValue / GetParameter。管理員角色和輪換 Lambda 具備 PutSecretValueUpdateSecretVersionStagePutParameter。輪換 Lambda 的角色是關鍵的稽核點——必須範圍限定在它所輪換的特定機密上。

KMS Decrypt 權限

若機密或 SecureString 使用客戶受管 KMS 金鑰,讀取方除了 Secrets Manager 或 SSM 讀取權限外,還需要對該金鑰的 kms:Decrypt。缺少 kms:Decrypt 是使用客戶受管金鑰時「AccessDeniedException」最常見的原因。

常見考試陷阱——考生失分的地方

陷阱一——假設 Parameter Store 有輪換功能

Parameter Store 本身不輪換。若情境說「輪換」,答案就是 Secrets Manager——毫無例外。

陷阱二——混淆 ECS 注入的 Task Role 與 Execution Role

Execution role 在容器啟動前取得機密。Task role 是應用程式程式碼在執行期間使用的角色。注入權限要設在 execution role 上。

陷阱三——忽略 -?????? ARN 後綴

Secrets Manager 會在每個 ARN 上附加隨機的六字元後綴。IAM 政策若針對沒有萬用字元後綴的 arn:...:secret:prod/rds/mydb,在刪除並重新建立機密後就會失效。

陷阱四——客戶受管金鑰忘記 KMS Decrypt

對於以客戶受管 KMS 金鑰加密的 SecureString 或 Secrets Manager 機密,必須授予 kms:Decrypt。即使 Secrets Manager 政策正確,沒有此授權的讀取方仍會收到 AccessDenied。

陷阱五——假設 CloudFormation 動態參考會自動更新

{{resolve:ssm:/path}} 在堆疊更新時解析,而非在執行期間。輪換機密不會觸發 CloudFormation 重新解析。請使用 {{resolve:ssm:/path:VERSION}} 固定版本,或在輪換後重新執行堆疊更新。

陷阱六——為功能旗標選擇 Secrets Manager

功能旗標不需輪換。Parameter Store Standard 對這個使用案例免費。Secrets Manager 的輪換功能對一個布林值來說是浪費。

ARN 後綴萬用字元不是可選的。 帶有 Resource: "arn:aws:secretsmanager:...:secret:prod/rds/mydb" 的政策,在機密被刪除並重新建立後就會失效,因為新機密會有不同的六字元後綴。請一律寫成帶有六個問號的 arn:aws:secretsmanager:...:secret:prod/rds/mydb-??????。SSM 的對應寫法較簡單——參數 ARN 沒有隨機後綴,只需完整路徑即可。

關鍵數字與必背事實

這是記憶區塊。預計考試題目會恰好考這些數字。

Secrets Manager 事實

  • 每個機密每月 0.40 美元,每一萬次 API 呼叫 0.05 美元。
  • 機密最大大小:64 KB。
  • 三個保留 staging labels:AWSCURRENT、AWSPREVIOUS、AWSPENDING。
  • 輪換 Lambda 四個階段:createSecret、setSecret、testSecret、finishSecret。
  • 輪換範本支援:RDS(MySQL、MariaDB、PostgreSQL、Oracle、SQL Server、Db2)、Aurora、Redshift、DocumentDB、ElastiCache。
  • 刪除時預設復原窗口:30 天(最少 7 天)。
  • 跨 Region 複寫為原生功能。

Parameter Store 事實

  • Standard 層:免費,每個 Region 每個帳號最多 10,000 個參數,值最大 4 KB。
  • Advanced 層:每個參數每月 0.05 美元,每個 Region 每個帳號最多 100,000 個參數,值最大 8 KB,支援參數政策。
  • 三種值類型:String、StringList、SecureString。
  • / 分隔的階層式路徑;GetParametersByPath 搭配 --recursive 旗標。
  • /aws/service/* 下的公開參數——免費,不計入配額。
  • 透過 AWS RAM 跨帳號共用(僅限 Advanced 層)。

共同事實

  • 兩者都使用 KMS 在靜態加密。
  • 兩者都透過 task execution role 整合 ECS secrets.valueFrom 注入。
  • 兩者都由 AWS Parameters and Secrets Lambda Extension layer 在 http://localhost:2773 快取。
  • 兩者都使用 IAM 資源型政策和 IAM 身份型政策進行存取控制。

比較表——Secrets Manager vs Parameter Store

輪換

Secrets Manager 依排程透過 Lambda 輪換。Parameter Store 本身不輪換。

成本

Secrets Manager 每個機密每月 0.40 美元。Parameter Store Standard 免費,Advanced 每個參數每月 0.05 美元。

最大值大小

Secrets Manager 64 KB。Parameter Store Standard 4 KB,Advanced 8 KB。

版本控制

Secrets Manager 以 UUID 搭配 staging labels 進行版本控制。Parameter Store 以單調遞增整數進行版本控制。

跨 Region

Secrets Manager 原生 ReplicateSecretToRegions。Parameter Store 需要自訂 EventBridge + Lambda 複寫。

跨帳號

Secrets Manager 使用資源型政策加客戶受管 KMS 金鑰。Parameter Store 透過 AWS RAM(Advanced 層)。

階層式取得

Parameter Store 有支援遞迴的 GetParametersByPath。Secrets Manager 沒有。

AWS 發布的公開值

Parameter Store 有 /aws/service/* 公開參數供 AMI 和 Region 資訊使用。Secrets Manager 沒有。

與 RDS/Redshift/DocumentDB 的整合

Secrets Manager 有一流的輪換範本。Parameter Store 僅以純設定形式整合。

典型使用案例

Secrets Manager:輪換 RDS 密碼、API 金鑰、OAuth token、TLS 私鑰。Parameter Store:功能旗標、環境設定、端點 URL、AMI ID。

FAQ——Secrets Manager 與 Parameter Store 熱門問題

Q1——Parameter Store 能像 Secrets Manager 一樣輪換機密嗎?

本身不行。你可以用 EventBridge + Lambda 將新版本寫入 Parameter Store 來自行建構輪換,但沒有預建的輪換範本,也沒有與 RDS、Redshift、DocumentDB 的整合。DVA-C02 考試中,若情境需要輪換,答案一律是 Secrets Manager。

Q2——AWSCURRENT、AWSPREVIOUS 和 AWSPENDING 的差異是什麼?

AWSCURRENT 是 GetSecretValue 預設回傳的有效版本。AWSPREVIOUS 是最後一次輪換前的 AWSCURRENT 版本,用於回滾。AWSPENDING 是輪換 Lambda 剛建立但尚未啟用的版本。輪換成功後,AWSPENDING 被提升為 AWSCURRENT,舊的 AWSCURRENT 移至 AWSPREVIOUS,AWSPENDING 標籤被移除。

Q3——Secrets Manager Lambda extension 如何驗證身份?

Extension 使用 AWS_LAMBDA_RUNTIME_API(Lambda 向 extension 暴露的內部端點)取得函式的 execution role 憑證,然後代表你以這些憑證呼叫 Secrets Manager。你不需要硬編碼憑證——execution role 就足夠,extension 會自動取用。

Q4——ECS 任務能以檔案而非環境變數的形式注入機密嗎?

ECS 原生透過 secrets.valueFrom 支援環境變數注入。若需要以檔案形式注入,可在 EKS 上使用帶有 Kubernetes Secrets Store CSI Driver 的 AWS Secrets and Configuration Provider(ASCP),或在 ECS 上使用 sidecar 模式。考試預設為環境變數注入。

Q5——Parameter Store 中的 SecureString 參數和 Secrets Manager 機密一樣安全嗎?

兩者都以 KMS 在靜態加密,密碼學保護是等效的。差異在於操作面:Secrets Manager 新增了輪換、帶有 staging labels 的版本控制、跨 Region 複寫,以及與資料庫的一流整合。若這些功能對你的值而言不重要,SecureString 同樣安全,且成本顯著更低。

Q6——ECS task execution role 讀取 Secrets Manager 機密需要哪些權限?

機密 ARN 上的 secretsmanager:GetSecretValue,以及若機密使用客戶受管金鑰時 KMS 金鑰上的 kms:Decrypt。Parameter Store SecureString 則需要 ssm:GetParameterskms:Decrypt。這些授予 execution role(容器啟動前使用),而非 task role(應用程式程式碼在執行期間使用)。

Q7——輪換失敗後如何回滾?

呼叫 UpdateSecretVersionStage,將 AWSCURRENT 標籤從壞掉的新版本移回舊版本(現在帶有 AWSPREVIOUS)。這是一個 API 呼叫,幾秒鐘就能執行。若輪換已經更新了目標系統,你可能還需要在目標端還原變更(例如:若輪換已更新了資料庫密碼,需將資料庫密碼重設回前一個值)。

Q8——如何在 Lambda 中快取 Parameter Store 值而不用撰寫額外程式碼?

將 AWS-Parameters-and-Secrets-Lambda-Extension layer ARN 附加到你的函式。設定 SSM_PARAMETER_STORE_TTL 環境變數。在處理函式中向 http://localhost:2773/systemsmanager/parameters/get?name=/prod/app/config&withDecryption=true 發送 HTTP GET。Extension 會自動處理快取、驗證和解密,你的函式中不需要任何 SDK 程式碼。

Q9——Parameter Store 和 Secrets Manager 可以使用同一種 CloudFormation 動態參考嗎?

不行,它們的語法不同。Parameter Store 使用 {{resolve:ssm:/path:version}},SecureString 使用 {{resolve:ssm-secure:/path:version}}。Secrets Manager 使用 {{resolve:secretsmanager:arn:SecretString:jsonKey:versionStage:versionId}}。兩者都在堆疊建立或更新時解析,而非執行期間——輪換不會自動觸發重新解析。

Q10——不小心刪除了 Secrets Manager 機密怎麼辦?

刪除預設是軟刪除,有 7 至 30 天的復原窗口。在窗口期間呼叫 RestoreSecret 即可還原。窗口到期後機密永久消失。若使用了 ForceDeleteWithoutRecovery=true,機密立即無法復原——此旗標僅用於暫時性測試資料。

延伸閱讀——官方 AWS 文件

DVA-C02 備考的權威來源是 AWS Secrets Manager 使用者指南(尤其是「輪換機密」和「從 AWS 服務取得機密」章節)、Systems Manager 使用者指南中的 Systems Manager Parameter Store 章節、Lambda extension 參考文件,以及 ECS 開發者指南的「指定敏感資料」章節。將 docs.aws.amazon.com/secretsmanager/docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html 加入書籤。

AWS 部落格上關於「How to use AWS Secrets Manager Lambda extension」和「Organizing parameters using hierarchies」的文章各值得讀一遍,以鞏固考試中出現的取得模式。

總結——Secrets Manager 與 Parameter Store 備考速查

考試當天,看到設定或機密相關的情境時,跑一遍這個決策路徑:

  1. 值是否需要自動輪換?是 → Secrets Manager。否 → 下一題。
  2. 值是否超過 4 KB?是 → Secrets Manager 或 Parameter Store Advanced。否 → 下一題。
  3. 成本是主要考量且不需要輪換?是 → Parameter Store Standard(免費)。
  4. 是否需要一次呼叫取得多個值的階層式取得?是 → Parameter Store GetParametersByPath
  5. 是否需要跨 Region 複寫?是 → Secrets Manager 原生複寫。
  6. 是否要取得最新 AMI ID 或 AWS 發布的值?是 → Parameter Store 公開參數 /aws/service/*
  7. 注入 ECS 時,使用 secrets.valueFrom 搭配持有 GetSecretValue / GetParameters 加上 kms:Decrypt 的 execution role。
  8. 高 RPS Lambda 讀取時,使用帶有適當 TTL 的 AWS Parameters and Secrets Lambda Extension。
  9. 跨帳號存取時,使用客戶受管 KMS 金鑰加資源型政策(Secrets Manager)或 AWS RAM(Parameter Store Advanced)。

掌握這九個分支,DVA-C02 上的每一道 Secrets Manager 或 Parameter Store 題目都能在十秒內做出決定。考試獎勵的是辨識關鍵字的能力——「輪換」、「免費層」、「階層」、「最新 AMI」、「跨帳號」、「Lambda extension」——而非記憶 API 簽名。閱讀每個情境時找出關鍵字,套用對應分支,選出服務。

官方資料來源

更多 DVA-C02 主題