POC 驗證報告 · SRE-394

AI Agent 身份治理 POC

依《Cognito 與 AI Agent 整合》報告規劃,先在本地驗證 LLM 推理層可行性,再於 CF_AI_Native 帳號落地三種 Cognito 整合模式,最後在 EC2 docker sandbox 完整整合驗證。本報告記錄執行過程、結果與踩坑細節。

執行日期 2026-08-27 帳號 CF_AI_Native Jira SRE-394 對象 SRE 主管
模式 A · 使用者委任 通過
Cognito → STS → DynamoDB
越權存取正確被 IAM 條件擋下
模式 B · M2M 通過
Client Credentials Grant
Token claims 與 scope 正確
模式 C · 第三方(GitHub) 通過
AgentCore Identity 3-legged OAuth
實際取得 token 並成功呼叫 GitHub API

01目的與範圍

單純驗證技術可行性,不綁定特定業務情境。

主管要求先驗證「AI Agent + Cognito 身份治理」這套架構在既有 AWS 環境是否走得通,再決定要不要投入正式專案。整個 POC 拆成三步驟執行:

  1. 本地驗證 LLM 推理層——用 OpenRouter 免費方案(openrouter/free)確認 agent 邏輯、tool calling 能不能動,零成本、不碰 AWS 資源。
  2. 落地 Cognito 三種整合模式——依 report《Cognito 與 AI Agent 整合》規劃的 A(使用者委任)、B(M2M)、C(代表使用者呼叫第三方)分別建立、驗證。
  3. EC2 docker sandbox 整合——把「LLM 推理層」與「身份治理層」接在一起,在真實 EC2 環境跑一次完整鏈路。
重點:LLM provider(openrouter/free)與身份治理機制(Cognito/AgentCore Identity)是兩條獨立的軸線——大腦層用哪家模型,不影響身份治理層的設計,三個模式的驗證結果因此可以套用在未來換成任何 provider 的正式 agent 專案上。

02執行環境

AWS 資源與 EC2 sandbox 的基本配置。

項目
AWS 帳號CF_AI_Native(105673812509)
Regionap-northeast-1
Terraformpoc/terraform/dev——Cognito User Pool / Identity Pool / DynamoDB,共 10 個資源
Sandbox 主機既有 test EC2(i-0e2dad4512d6947c7),Ubuntu 24.04,t3.medium
LLM ProviderOpenRouter 免費方案(openrouter/free,OpenAI 相容 API)

03三種模式驗證結果

依「agent 代表誰行動」分類,三種模式的技術路徑完全不同,分開驗證。

模式情境驗證方式結果
A · 使用者委任 Agent 代表已登入使用者操作,資料互相隔離 ID Token → Identity Pool 換 STS 臨時憑證 → 存取 DynamoDB(userId 條件收斂) ✅ 通過
B · M2M Agent 本身是常駐服務,無終端使用者 Client Credentials Grant 換 access token,驗證 claims/scope ✅ 通過
C · 代表使用者呼叫第三方 Agent 需要以使用者身分操作 GitHub Cognito → AgentCore workload identity → 3-legged OAuth → 取得真實 GitHub token ✅ 通過

模式 A:越權防護實測

建立測試使用者後模擬登入,換出的臨時憑證用來存取一張測試用 DynamoDB 表。先驗證「存取自己的資料」——成功寫入與讀取;接著用同一組憑證嘗試存取別人的資料——正確被拒絕:

aws: [ERROR]: An error occurred (AccessDeniedException) when calling the GetItem
operation: User: arn:aws:sts::105673812509:assumed-role/dev-cognito-agent-poc-authenticated
/CognitoIdentityCredentials is not authorized to perform: dynamodb:GetItem on resource:
arn:aws:dynamodb:ap-northeast-1:105673812509:table/dev-cognito-agent-poc-agent-data
because no identity-based policy allows the dynamodb:GetItem action

實測輸出:嘗試讀取非本人 userId 的資料時,IAM 的 LeadingKeys 條件正確擋下請求,證明權限收斂發生在 AWS 服務層,不依賴 agent 程式邏輯自律。

模式 C:完整 3-legged OAuth 流程

sequenceDiagram
    participant U as 使用者
    participant CUP as Cognito User Pool
    participant AC as AgentCore Identity
    participant GH as GitHub

    U->>CUP: 登入(模擬)
    CUP-->>U: ID Token
    Note over AC: get-workload-access-token-for-jwt
    U->>AC: ID Token
    AC-->>U: workload access token
    Note over AC: get-resource-oauth2-token(force)
    AC-->>U: 授權連結
    U->>GH: 開啟連結、登入、按 Authorize
    GH-->>AC: 授權碼(server-side 交換)
    Note over AC: complete-resource-token-auth(boto3)
    AC-->>U: 真實 GitHub access token
    U->>GH: 呼叫 api.github.com/user
    GH-->>U: 帳號資訊(驗證成功)
  

圖:模式 C 實測流程。Cognito 負責「這個人是誰」,AgentCore Identity 負責「他有沒有授權、把授權結果安全存放在 vault 裡短暫換發」。

04EC2 Docker Sandbox 整合

把「大腦層」與「身份治理層」接在一起,在真實 EC2 環境跑通完整鏈路。

在 test EC2 上用 docker 驗證了兩種實作方式:

  • 自寫 Python agent——openrouter/free 做推理決策,呼叫自訂 tool 時走模式 A 流程(ID Token → STS → DynamoDB),容器本身不持有任何長效 AWS 憑證,權限完全來自即時換發的臨時憑證。
  • Pi Coding Agent 框架(開源,pi.dev)——取代手寫腳本,用 TypeScript extension 註冊同樣的工具,一樣接 openrouter/free,並額外驗證了互動式 TUI 模式,體驗上等同於一個「自己接 model、自己加工具」版本的 coding agent。
驗證重點:不論用哪種實作,容器內的 agent 能做什麼事,永遠受限於兩層疊加——IAM policy(權限天花板)與程式碼(有沒有寫對應的工具)。兩層都通過,agent 才真的能執行該操作,任何一層擋下都會失敗,不會出現「繞過」的情況。

05關鍵發現與踩坑

過程中三個值得記錄的技術細節,對之後要落地正式專案有參考價值。

openrouter/free 的路由不穩定:免費模型池是所有使用者共用,尖峰時偶發 429(上游限流)。透過 Pi 框架呼叫時觀察到比裸 API 呼叫更容易卡在同一顆被限流的模型,改為明確指定固定模型(minimax/minimax-m3:free)取代自動路由後穩定許多。正式環境如果在意穩定性,建議直接指定模型或改用付費層。
AgentCore Identity 的 CLI 简寫語法有陷阱:complete-resource-token-auth 這個 API 的 --user-identifier 是一個 tagged union 結構,用 AWS CLI 的簡寫語法(userToken=$ID_TOKEN)呼叫時穩定回傳 AccessDeniedException,改用 boto3 SDK 直接建構請求物件後立即成功。印證了 report 原本的警語——此類服務發展快,CLI/文件可能還沒完全跟上,落地前務必用官方 SDK 或最新文件核對規格,不要照單全收。
3-legged OAuth 需要真實可達的 callback:一開始嘗試「不架服務,靠手動複製瀏覽器網址列」省事,實測行不通——complete-resource-token-auth 需要瀏覽器真的把請求送達一個可達的 HTTPS 端點。最終在 EC2 上架了一個最小化的診斷用 HTTPS listener(自簽憑證即可),並且發現 localhost 在瀏覽器語境下指向使用者自己的電腦,必須換成 EC2 的公網位址才連得到。

06現有資源清單

POC 用資源目前保留在 CF_AI_Native 帳號,供後續複查或延伸使用。

Cognito User Pool
ID
ap-northeast-1_cFE7TnNVL
模式 A Client
n07vu3nh1sjkg2cvk2n2m0ogj
模式 B Client
60j28e1687h151f8ik2tp3bljv
Identity Pool
ID
ap-northeast-1:56bbcb44-5784-4396-acc4-00e667c373cb
IAM Role
dev-cognito-agent-poc-authenticated
DynamoDB
表名
dev-cognito-agent-poc-agent-data
計費模式
PAY_PER_REQUEST
AgentCore Identity
Workload Identity
dev-cognito-agent-poc-workload
OAuth2 Provider
dev-cognito-agent-poc-github
臨時對外 port 已關閉:測試用的 EC2 security group 8080 port 規則已刪除,恢復僅開放 22。
Callback listener 已停止:EC2 上的診斷用 HTTPS 服務已終止,不再監聽。
費用範圍:Cognito/Identity Pool/DynamoDB 均在免費額度內;EC2 為既有測試機共用,無額外費用。

07建議與後續

POC 結論:三種模式技術上皆可行。以下是後續若要推進正式專案的建議路徑。

01

確認正式專案的 agent 情境

依實際使用場景(有無終端使用者、是否需串接第三方)決定要落地哪個模式,report 已建議「不要三種都上」,POC 階段驗證全部只是為了確認技術可行性。

02

重新確認 AgentCore Identity 最新規格

此服務仍在快速迭代,正式導入前應對照當下最新官方文件/SDK,不直接沿用本次 POC 的 CLI 呼叫方式。

03

決定 LLM provider 策略

POC 全程使用 openrouter/free 驗證邏輯;正式環境需評估穩定性需求,決定是否指定固定模型、換付費層,或改用 Bedrock。

04

補齊可追溯性與定期稽核

依 report §6 檢查清單,把 sub、token 簽發資訊、工具呼叫參數記入日誌,並排入既有安全稽核週期。