
AWS Emulator 是 AWS 官方的本機 AWS API 模擬器。它在本機提供 AWS API 端點,預設是 127.0.0.1:9297 的 HTTPS,啟動時產生只在這次執行有效的存取金鑰、SDK 設定檔和自簽憑證。AWS CLI 或 AWS SDK 用 AWS_ENDPOINT_URL、AWS_SHARED_CREDENTIALS_FILE、AWS_CA_BUNDLE 等環境變數改指這個端點,程式碼照常執行,請求就送到模擬器,不送到 AWS。使用者指南說,用它不需要 AWS 帳號,可以在自己的電腦、開發伺服器或持續整合(CI)環境裡測試,也不另收服務費。Linux 上從 RPM 或 Debian 套件安裝(x86_64、aarch64),macOS 和 Windows 則用官方的 Dockerfile 自己建映像,在 Docker 裡執行。用 AWS SDK for Rust 寫的測試還能用嵌入模式(embedded mode):模擬器編進測試程式,在同一個行程裡執行,每個測試各建一份模擬器,彼此不共用資料,因此可以平行跑。
指南列出三種用途:在本機測試程式和 AWS 服務的互動,包括跨服務的呼叫;在 CI 流程裡跑整合測試,不需要 AWS 帳號和資源;搭配 AI 程式代理(AI coding agent)做原型開發。官方另外提供給 AI 程式代理用的 aws-emulator 技能(skill),需要 AWS CLI 2.35.0 以上,用 aws agent-toolkit add-skill 安裝。裝了這個技能,代理可以替使用者安裝並啟動模擬器、把 CLI 或 SDK 指向它、排除連線、憑證和簽章錯誤,並檢查專案預期能不能在模擬器上執行。指南說,代理要在工作目錄以外寫入,例如執行 sudo 或修改 shell 設定檔之前,會先詢問使用者。
AWS 在 2026 年 11 月 11 日宣布推出 AWS Emulator,原始碼放在 GitHub 的 aws/aws-emulator 儲存庫。AWS 資深首席工程師 Matthew Goldberg 同日在 About Amazon 發文說,這個專案起於一個週末的實驗:他要 Amazon 的 AI 開發工具 Kiro 依 AWS CLI 寫測試,反覆修改到測試能通過真正的 AWS,再寫出能通過同樣測試的記憶體內實作。15 分鐘後,Kiro 交出堪用(passable)的 Amazon SQS 初版。他改了提示,要 Kiro 在週末裡把 AWS 其餘的部分也做出來,Kiro 做到了;他說成果顯然有缺口,但隔週一團隊就開始拿它測試自己的軟體。
以下先看程式怎麼從模型產生、沒實作的操作怎麼處理,再看 AWS 怎麼量擬真度(fidelity),也就是模擬器的行為和 AWS 相符的程度;接著是 AI 代理在維護裡的角色、建置成本、規模和發版頻率,最後整理限制,包括哪些說法來自 AWS 自述。內容根據 v1.0.322 版的 commit 7753983(2026-11-10)、AWS Emulator 使用者指南,以及 AWS 的發表文;本文沒有安裝或執行模擬器。
模擬器怎麼從 Smithy 模型產生、怎麼量擬真度?
Smithy 是 AWS 描述 API 的介面定義語言。AWS 的上線公告說,模擬器的服務由 AWS 公開的 API 模型產生,AWS SDK 也出自同一批模型。指南〈Fidelity〉說,凡是在 GitHub 的 aws/api-models-aws 裡有 API 模型的服務,模擬器都支援它的 API;同一頁也說,還沒實作的操作回 HTTP 501。兩句合起來讀,這裡的「支援」是模擬器認得這些 API 的請求,回應和 AWS 有多接近,要看擬真度。
儲存庫的 services/ 底下,每個服務是一個 Rust crate(Rust 的編譯與發行單位),例如 SQS 是 service-com-amazonaws-sqs-amazonsqs。crate 裡的 smithy-model/ 放這個服務的 Smithy 模型 JSON,build.rs 呼叫產生器 emulator_core_build_support::generate(...),在編譯時從模型產生這個服務的定義:服務身分、通訊協定和操作路由表(SQS 的 src/service.rs 註解)。src/ops/ 底下每個操作(operation)一個檔案,state.rs 是這個服務存在記憶體裡的狀態。所有服務共用 vendor/engine/ 裡唯一的記憶體內引擎 InMemoryEngine。儲存庫根目錄的 AGENTS.md 是給編輯這個專案的人和 AI 代理看的工作指南,裡面註明這個引擎不得另外分叉。
core/router/ 是模擬器的執行檔,本身沒有服務邏輯。它的 README 說,router 建立共用的 InMemoryEngine,把每個服務 crate 掛到同一個端點上。每個服務依模型裡的 SigV4 簽章服務名稱認領請求,再依服務自己的協定,例如 SQS 原始碼註解提到的 awsJson 和 query,找出請求要呼叫的操作。router 的 src/lib.rs 每加一個服務就由產生器重寫一次,README 寫明手改的內容會被覆蓋。
沒實作的操作一律回 HTTP 501
產生器替每個操作產生一個空殼(stub)。空殼一律回傳 Scaffolded::not_implemented,框架把它轉成符合該服務協定的 HTTP 501 NotImplemented 錯誤。每個服務 crate 的 src/scaffolded.rs 檔頭都寫明,這些空殼不能改成回傳成功值,例如 SQS 的這一份(本文譯):
不要把空殼改成回傳成功值:用戶端,以及任何只斷言呼叫成功的檢查,都分不出空的成功值和真正的實作。請實作這個操作,否則就留著 501。
指南〈Fidelity〉也說,測試呼叫未實作的操作會收到 501,立刻失敗。
模擬的 Bedrock Runtime 不跑模型
Bedrock Runtime 是 Amazon Bedrock 用來呼叫生成式 AI 模型的 API。Bedrock Runtime crate 的 src/ops/converse.rs 檔頭說,模擬器裡沒有任何語言模型在跑。Converse 會驗證對話的輪次順序,用和 CountTokens 相同的分詞器(tokenizer)計算輸入 token,回一則由對話內容組成的助理訊息,訊息本身就說明沒有模型在執行。這則訊息的長度配合 maxTokens,遇到第一個設定的停止序列(stop sequence)就停。請求以 toolChoice 強制呼叫工具時(any 或 tool),回應是一個 toolUse 區塊,參數依該工具宣告的 inputSchema 產生,停止原因是 tool_use。
同一個 crate 的 src/ops/SKIPPED_STUBS.md 說,兩個串流操作 ConverseStream 和 InvokeModelWithResponseStream 是另外手寫的,回應整段一次產生,只送出一個片段,不模擬逐步生成。InvokeModelWithBidirectionalStream 的輸入是雙向事件串流,產生器做不出它的空殼,目前沒有實作,同樣回 501。所以這個模擬器能測呼叫 Bedrock 的程式怎麼處理回應格式、token 計數和工具呼叫的往返,測不了模型回答的內容。
擬真度怎麼量?
指南〈Fidelity〉說,已實作的操作,目標是有效的呼叫得到和 AWS 相同的結果,無效的呼叫得到相同的錯誤。指南舉的例子是 DynamoDB 的表名至少要 3 個字元,用 ab 建表時,模擬器回的錯誤和 AWS 相同(摘自〈What is AWS Emulator?〉):
$ aws dynamodb create-table --table-name ab \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
An error occurred (ValidationException) when calling the CreateTable operation: 1 validation error detected: Value 'ab' at 'tableName' failed to satisfy constraint: Member must have length greater than or equal to 3
擬真度測試(fidelity test)是用 AWS SDK 跑一段流程的短程式,斷言 AWS 的行為:呼叫的結果、資源最後的狀態,以及無效呼叫的確切錯誤。測試在 us-west-2 建立並驗證,全域服務改在 us-east-1。指南說,測試公開在 aws/aws-emulator-evaluation-suite 儲存庫,模擬器還沒通過的也在裡面;這個儲存庫的 README 說,每個測試都至少在兩個沙盒 AWS 帳號上驗證過。模擬器必須在流程的每一次呼叫都和 AWS 相符,包括狀態碼、建立的資源和其他副作用,才算通過一個測試。每個服務的擬真度分數,就是它通過的測試數除以該服務的測試總數。
個別的缺口記在儲存庫的 issues/ 目錄:還不能用的 API 和行為放在 issues/things-that-do-not-work/,修好之後移到 issues/things-that-now-work/。在 commit 7753983,前者有 6,545 個檔案,後者有 12,709 個(本文以 find 計數,不含 .gitkeep)。
每個 release 附上的分數是 scores.json.gz 檔,release 頁本身沒有彙整表。v1.0.322 的檔案記錄了 commit 7753983、評分時間 2026-11-11 00:09(UTC),以及每個測試的結果。紀錄分成兩類:behavioral 32,402 筆,wire 10,535 筆。評估套件的 README 把它公開的測試稱為行為擬真度測試(behavioral fidelity tests),放在 behavioral/ 目錄。wire 類測什麼,分數檔、指南和評估套件都沒有說明;從紀錄看,每筆是一串 API 呼叫,逐步比對狀態碼、回應內容和標頭,失敗時寫明在第幾步、哪一項和 AWS 不同。全部 42,937 筆紀錄中,通過 24,243 筆、未通過 18,614 筆、略過 80 筆。下表是本文從這個檔案替幾個服務合計的數字,兩類紀錄一起算。一個測試呼叫多個服務時,每個服務各算一次;通過比例不計略過的測試。
| 服務 | 通過 | 未通過 | 略過 | 通過比例 |
|---|---|---|---|---|
| DynamoDB | 1,153 | 533 | 8 | 68.4% |
| SQS | 1,032 | 482 | 9 | 68.2% |
| S3 | 1,763 | 1,035 | 16 | 63.0% |
| Bedrock Runtime | 77 | 105 | 0 | 42.3% |
| CloudFormation | 795 | 3,391 | 20 | 19.0% |
| 全部紀錄 | 24,243 | 18,614 | 80 | 56.6% |
這些比例的分母是 AWS 自己選寫的測試,只反映模擬器在這些情境裡和 AWS 相符的程度,不等於某個服務有多少比例的操作已經實作。評估套件只有 behavioral/ 目錄,測試清單 manifest.jsonl 裡也找不到任何一筆 wire 紀錄,所以約四分之一的紀錄(10,535/42,937)無法對照公開的測試。指南說,每個 release 會寫明它用的模擬器 commit 和擬真度測試的版本,只有測試版本相同的分數才能比較;v1.0.322 的 release 頁和分數檔都找得到 commit,找不到測試版本,因此無法確認它的分數能和哪些版本比較。指南也說,目前模擬器在控制平面的 API,也就是建立、讀取、更新、刪除和列出資源的 API,和 AWS 最接近;資料平面的 API,以及 CloudFormation、Terraform、AWS CDK 這類基礎設施即程式碼(infrastructure as code)工具的支援,擬真度依服務而異。
AI 代理在維護裡做什麼?
指南〈How AWS Emulator keeps improving〉說,AI 代理讓模擬器跟上 AWS 的變化,模擬器持續改進,一天更新很多次。AGENTS.md 開頭稱這個儲存庫是「EmulatorCore-generated emulator project」,也說明這份文件寫給任何編輯模擬器的人,「human or agent」;它標明 EmulatorCore 的版本是 v0.1.0,vendor/ 底下的框架是代理不能修改的(agent-immutable)。README 說這個儲存庫不收 pull request,錯誤和擬真度缺口請在 GitHub Issues 回報。評估套件的 README 則說,那個儲存庫唯讀,由 AI 代理撰寫、管理和維護,不收 issue 也不收 pull request。
Goldberg 說 AWS Emulator 由三組代理建造:第一組寫測試,從 AWS 的 API 模型設計真實的使用情境,在真正的 AWS 上驗證後才提交;第二組對模擬器重播這些測試,把失敗的測試歸併成 issue,放進 things-that-do-not-work;第三組每個代理只修一個 issue,修改要通過合併關卡才能進主線。關卡會擋下編譯不過的修改,也有代理檢查程式碼規範、安全性,以及擬真度有沒有退步。他說同時有數百個代理在改這份程式碼,每天修掉數千個 issue;團隊沒有寫過、也沒有審查過任何一行程式碼。代理的主要儲存庫在 AWS CodeCommit,GitHub 上的程式碼要到發行流程的最後才發布。
查詢時(2026-11-12 10:04,台北時間),aws/aws-emulator 的預設分支有 29,684 個 commit,最近 200 個(2026-11-10 14:23 到 20:39,UTC)的作者欄全是 IssueFixerAgent(105 個)或 IssueFinderAgent(95 個),至少這一點和 Goldberg 的描述一致。
建置要多少資源、規模和發版頻率如何?
從原始碼建置只支援 Linux(x86_64、aarch64),需要 Rust 工具鏈、C 編譯器、多核心的機器,以及至少 100 GB 給 target/ 目錄的磁碟空間。README 解釋,每個 AWS 服務都是一個 crate,全部以 debug 模式建置的產物很大,而且服務越加越多。第一次完整建置要編譯每個服務 crate;之後只改一個服務,重建快得多。README 說,嵌入模式會把模擬器編進測試程式,這些建置條件和成本也適用:專案第一次跑 cargo test,也要完整編譯一次所有服務 crate,target/ 的空間同樣以這個量級估算。README 同一段說從原始碼建置只支援 Linux,Windows 和 macOS 要走 Docker;嵌入模式是否因此只能在 Linux 上用,README 沒有明說。README 建議在多個專案間共用同一個 CARGO_TARGET_DIR、在 CI 快取 target/ 或改用 sccache,並把模擬器固定在某個 release 的 commit。
在 commit 7753983,services/ 底下有 437 個目錄。其中 436 個以 service-com-amazonaws- 開頭,每個是一個服務 crate;另一個是 common(crate 名稱 service-common),不對應任何 AWS 服務,放各服務共用的程式內 IAM、EventBridge、S3 等用戶端。436 個服務 crate 共有 437 個 Smithy 模型檔,因為 IoT Wireless 的 crate 有兩個模型檔(本文以 ls 列出目錄、逐一確認 Cargo.toml 與 smithy-model/*.json 計數)。Goldberg 說,儲存庫剛建立時,系統產生的空伺服器能接 438 個 AWS API 模型的請求,但什麼也不做;這和目前的 437 個模型檔差在哪裡,文章沒有說明。
版本號的格式是 MAJOR.MINOR.PATCH,指南說 PATCH 用於錯誤修正和擬真度修正。查詢時,GitHub 上共有 12 個 release,從 2026-11-07 的 v1.0.250 到 2026-11-11 的 v1.0.322(UTC),其中 11 月 8 日一天就發了 6 個;v1.0.322 的發行說明列了 215 項修正。版本號中間有跳號,例如 v1.0.269 之後是 v1.0.290。下載站的 versions.json 列了 23 個版本,最早是 1.0.191.1,可見不是每個版本都在 GitHub 上發 release。
用之前要知道哪些限制?
指南〈Limitations〉列了六點:
- 政策:模擬器不照 AWS 的方式評估 IAM 政策和以資源為基礎的政策(resource-based policy),不能拿來測資安。指南的〈Security〉頁補充,用模擬器自己的金鑰簽章的請求一律不會被拒,KMS 金鑰政策和 S3 儲存貯體政策都不檢查,所以 AWS 會拒絕的請求在模擬器裡可能成功,AWS 允許的也可能失敗。
- 單一區域、單一帳號:請求帶任何區域(Region)和帳號 ID 都接受,但不同帳號的資源不分開;區域分不分開則各服務不一,有些服務的資源跨所有區域共用,有些依區域分開,不能照 AWS 的分法預期。所有請求都應該用同一個區域和帳號,要測多個區域,就每個區域各開一個模擬器,各用一個連接埠。
- 擬真度:和 AWS 相符的程度依服務和功能而異,見前面的擬真度分數。
- 只在一個區域驗證:AWS 只在 us-west-2 對照模擬器的行為,全域服務在 us-east-1,各區域服務與功能的差異不會反映出來。
- 本機資源:所有資源都放在記憶體裡,能放多少取決於機器,模擬器停止時全部刪除。
- 只供測試執行:AWS 沒有測過長時間執行和負載測試。指南建議測試時啟動、測完就停,或設定
--idle-timeout讓它自己停止;重新啟動也讓測試從乾淨的狀態開始。
〈Security〉頁還提醒兩件事。模擬器替使用者執行的程式碼,指南舉的例子是函式程式碼(function code),沒有寫明是哪個服務,不會和本機隔離,會以使用者的權限執行,可以讀寫使用者的檔案。安全修正只發布在最新版,要拿到修正就得升級。
遙測(telemetry)預設開啟,嵌入模式也一樣。指南〈Telemetry in AWS Emulator〉說,送出的資料包括隨機產生的安裝與執行 ID、作業系統與 SDK 版本等執行環境資訊、各操作的呼叫次數與結果類別、效能數字和當機類型,每個值都是隨機 ID、數字或固定清單裡的值;不含請求和回應的內容、資源名稱與 ARN、環境變數與設定檔的值、憑證、程式碼和帳號 ID。資料經 TLS 送到 AWS 的端點,每五分鐘送一批,保留最多 90 天。關閉有四種方式,任何一種都有效:
- 啟動時加
--telemetry off(或-t off),只對這個行程有效。 - 啟動前把環境變數
EMULATOR_TELEMETRY設為off;在 Docker 裡要用-e傳進容器。 - 在設定檔
~/.aws/emulator/config.toml寫入[telemetry]的enabled = false,對這台機器的每次執行都有效。 - 嵌入模式在建立模擬器時傳入
EmbeddedOptions::default().telemetry(Telemetry::Off)。
指南也提醒,把模擬器包進測試框架這類給別人用的工具時,要告訴使用者有遙測,並提供關閉的方法。
「由 AI 代理維護」是 AWS 自述。使用者指南只說 AI 代理讓模擬器保持更新,沒說是哪些代理;Goldberg 的文章也沒說代理背後是哪些模型、審查代理怎麼設定。AGENTS.md 說這個儲存庫由 EmulatorCore 產生,本文查到的指南頁面、README 和 Goldberg 的文章都沒有說明 EmulatorCore 是什麼。外界看得到的只有 commit 作者欄的代理名稱和公開的測試結果。
授權是 CC0 1.0,vendor/ 目錄裡的程式碼例外,採 Apache License 2.0。官方文件沒有和 LocalStack、moto 這些既有的第三方工具比較。
參考資料
- AWS, AWS Emulator is now available for building and testing AWS applications locally(2026-11-11)
- Matthew Goldberg, AWS Emulator: a local emulator built 100% by autonomous AI agents(About Amazon,2026-11-11)
- AWS Emulator 使用者指南:What is AWS Emulator?、Fidelity、Telemetry、Security、Versions and compatibility、Getting started with an AI coding agent、Getting started with embedded mode、Pointing your AWS SDK at AWS Emulator
- aws/aws-emulator,commit
7753983(v1.0.322):README.md、AGENTS.md、core/router/README.md、SQS 的src/scaffolded.rs與src/service.rs、Bedrock Runtime 的src/ops/converse.rs與src/ops/SKIPPED_STUBS.md、LICENSE - aws/aws-emulator releases,v1.0.322 與其
scores.json.gz(查詢於 2026-11-12) - aws/aws-emulator-evaluation-suite