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:
( 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 呼叫或雲端對照測試。
參考資料: