1114 字
6 分鐘

AWS Emulator 本機測試:確認端點、憑證與雲端驗收邊界

本文目錄

測試跑完了,怎麼確認請求真的送進 AWS Emulator?把端點、憑證與測試放在同一個隔離 shell,再檢查 health、STS 身分及應用程式實際使用的 client。 只看到一個成功的 API 回應,還無法判定環境正確。

AWS 於 2026-11-11 發布 AWS Emulator,提供本機 AWS API 模擬。它適合開發與回歸測試,無須 AWS 帳號;真實雲端的權限、跨區域行為及部署結果仍要另行驗收。

先啟動實例,再設定測試 shell#

Linux 可使用官方 RPM/Debian 套件;macOS、Windows 走 Docker 流程。官方目前沒有提供預建 Docker image,文件要求自行建立;Apple Silicon 要選 aarch64 套件。

容器啟動時,把 port 綁在 127.0.0.1,並依文件以 bind mount 掛載 ~/.aws/emulator,讓主機能讀取憑證。多實例要同時調整主機 port、容器 port 與 emulator 的 -p,三者保持一致。只把主機改成 9300、容器仍用 9297,會讓不同實例共用同一份憑證資料夾。

以下 Bash 範例的前提是:實例已在 9297 啟動、AWS CLI 已安裝,且會在同一個子 shell 內執行測試。設定取自 AWS SDK 指向 Emulator 文件,本文未實際啟動 emulator:

Terminal window
(
set -eu
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_PROFILE AWS_DEFAULT_PROFILE
export AWS_ENDPOINT_URL='https://127.0.0.1:9297'
export AWS_SHARED_CREDENTIALS_FILE="$HOME/.aws/emulator/9297/emulator_credentials"
export AWS_CONFIG_FILE="$HOME/.aws/emulator/9297/config"
export AWS_CA_BUNDLE="$HOME/.aws/emulator/9297/ca.pem"
export AWS_EC2_METADATA_DISABLED=true
export AWS_DISABLE_HOST_PREFIX_INJECTION=true
export AWS_REGION=us-east-1
export AWS_DEFAULT_REGION=us-east-1
test -r "$AWS_SHARED_CREDENTIALS_FILE"
test -r "$AWS_CONFIG_FILE"
test -r "$AWS_CA_BUNDLE"
curl --fail --silent --show-error --cacert "$AWS_CA_BUNDLE" "$AWS_ENDPOINT_URL/__admin/health"
account=$(aws --endpoint-url "$AWS_ENDPOINT_URL" sts get-caller-identity --query Account --output text)
test "$account" = '000000000000'
aws --endpoint-url "$AWS_ENDPOINT_URL" s3api list-buckets
)

括號讓變數只作用於這次執行。正式測試指令也應放在括號內、身分檢查之後;在外面另開終端機跑測試,會失去這些設定。清掉真實憑證環境變數,是因為它們會優先於 credentials file;保留舊值會讓簽章使用錯誤金鑰。

health 預期回 ok。STS 的 account 應為 000000000000,官方另列 ARN 為 arn:aws:iam::000000000000:user/emulator。若看到自己的 AWS 帳號,先停下來檢查端點與參數。

CLI 通過後,還要看 SDK 有沒有自己的設定#

範例顯式指定 CLI 的 --endpoint-url,避免繼承的服務專用端點蓋過設定。STS 結果只證明那個 CLI 請求的路由。應用程式若在建構 client 時寫死 endpoint、credentials,或使用不同程序環境,仍需另外核對。

Client/行為接續檢查
AWS CLI、Boto3文件使用 AWS_CA_BUNDLE;有 host prefix 的操作需停用 prefix injection。
JavaScript SDK v3,Node.js額外設定 NODE_EXTRA_CA_CERTS 指向同一份 ca.pem;需要時在 client 設 disableHostPrefix: true。
S3保留 IP 形式的 endpoint。改成 localhost,部分 SDK 會把 bucket 放進 hostname,導致路由改變。
Java依文件使用 emulator 產生的 PKCS12 trust store;它會取代預設信任庫,混合呼叫其他 HTTPS 服務時要另處理。

把 prefix injection 設定限定在本機測試環境,避免帶到真實 AWS。若 Docker 裡的程式使用 127.0.0.1,它指向該容器本身;先依網路拓樸處理可達性。

用 operation 清單決定哪些測試留在雲端#

fidelity 檢查文件建議先列出應用實際呼叫的 AWS operations,再查 evaluation suite 的 manifest.jsonl 與使用版本的 release 分數。服務的總分,無法直接證明某個特定 operation 或失敗分支已受測。

建立一份小型驗收清單:列出 operation、正常輸入、預期錯誤、emulator 結果與 AWS 結果。優先比較會改變程式分支的行為,例如找不到資源、重複建立、分頁和錯誤欄位。遇到未實作的操作或 501,先記成模擬缺口;缺乏 fidelity test 的操作也需要自行比對。

安全文件寫得更細:部分服務會評估模擬 IAM 身分的 policy,但方式與 AWS 不同;以 emulator 自身金鑰簽署的請求不會因此遭拒,KMS key policy、S3 bucket policy 及跨帳號/跨 Region 也有邊界。權限拒絕、資安測試與跨區域工作流應保留真實 AWS 驗收。

Emulator 的資源狀態在記憶體中,程序停止就會消失。測試應自行建立資料並可重跑;這也讓「停止後資源不見」和真正的資料持久化缺陷有清楚分界。預設遙測及關閉方式見 官方 README。

本文於 2026-11-12 查核官方文件,命令為文件導向的操作範例;尚未執行 Docker 建置、AWS CLI 呼叫或雲端對照測試。

參考資料:

AWS:Emulator 發布公告

AWS:Pointing your SDK at AWS Emulator

AWS:Docker 啟動與多實例

AWS:檢查專案 fidelity

AWS:Security in AWS Emulator

AWS Emulator 本機測試:確認端點、憑證與雲端驗收邊界
https://laplusda.com/posts/aws-emulator-local-endpoint-verification/
作者
Zero
發佈於
2026-11-12
許可協議
CC BY-NC-SA 4.0