01目的與範圍
單純驗證技術可行性,不綁定特定業務情境。
主管要求先驗證「AI Agent + Cognito 身份治理」這套架構在既有 AWS 環境是否走得通,再決定要不要投入正式專案。整個 POC 拆成三步驟執行:
- 本地驗證 LLM 推理層——用 OpenRouter 免費方案(
openrouter/free)確認 agent 邏輯、tool calling 能不能動,零成本、不碰 AWS 資源。 - 落地 Cognito 三種整合模式——依 report《Cognito 與 AI Agent 整合》規劃的 A(使用者委任)、B(M2M)、C(代表使用者呼叫第三方)分別建立、驗證。
- EC2 docker sandbox 整合——把「LLM 推理層」與「身份治理層」接在一起,在真實 EC2 環境跑一次完整鏈路。
02執行環境
AWS 資源與 EC2 sandbox 的基本配置。
| 項目 | 值 |
|---|---|
| AWS 帳號 | CF_AI_Native(105673812509) |
| Region | ap-northeast-1 |
| Terraform | poc/terraform/dev——Cognito User Pool / Identity Pool / DynamoDB,共 10 個資源 |
| Sandbox 主機 | 既有 test EC2(i-0e2dad4512d6947c7),Ubuntu 24.04,t3.medium |
| LLM Provider | OpenRouter 免費方案(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。
05關鍵發現與踩坑
過程中三個值得記錄的技術細節,對之後要落地正式專案有參考價值。
minimax/minimax-m3:free)取代自動路由後穩定許多。正式環境如果在意穩定性,建議直接指定模型或改用付費層。complete-resource-token-auth 這個 API 的 --user-identifier 是一個 tagged union 結構,用 AWS CLI 的簡寫語法(userToken=$ID_TOKEN)呼叫時穩定回傳 AccessDeniedException,改用 boto3 SDK 直接建構請求物件後立即成功。印證了 report 原本的警語——此類服務發展快,CLI/文件可能還沒完全跟上,落地前務必用官方 SDK 或最新文件核對規格,不要照單全收。complete-resource-token-auth 需要瀏覽器真的把請求送達一個可達的 HTTPS 端點。最終在 EC2 上架了一個最小化的診斷用 HTTPS listener(自簽憑證即可),並且發現 localhost 在瀏覽器語境下指向使用者自己的電腦,必須換成 EC2 的公網位址才連得到。06現有資源清單
POC 用資源目前保留在 CF_AI_Native 帳號,供後續複查或延伸使用。
- ID
- ap-northeast-1_cFE7TnNVL
- 模式 A Client
- n07vu3nh1sjkg2cvk2n2m0ogj
- 模式 B Client
- 60j28e1687h151f8ik2tp3bljv
- ID
- ap-northeast-1:56bbcb44-5784-4396-acc4-00e667c373cb
- IAM Role
- dev-cognito-agent-poc-authenticated
- 表名
- dev-cognito-agent-poc-agent-data
- 計費模式
- PAY_PER_REQUEST
- Workload Identity
- dev-cognito-agent-poc-workload
- OAuth2 Provider
- dev-cognito-agent-poc-github
07建議與後續
POC 結論:三種模式技術上皆可行。以下是後續若要推進正式專案的建議路徑。
確認正式專案的 agent 情境
依實際使用場景(有無終端使用者、是否需串接第三方)決定要落地哪個模式,report 已建議「不要三種都上」,POC 階段驗證全部只是為了確認技術可行性。
重新確認 AgentCore Identity 最新規格
此服務仍在快速迭代,正式導入前應對照當下最新官方文件/SDK,不直接沿用本次 POC 的 CLI 呼叫方式。
決定 LLM provider 策略
POC 全程使用 openrouter/free 驗證邏輯;正式環境需評估穩定性需求,決定是否指定固定模型、換付費層,或改用 Bedrock。
補齊可追溯性與定期稽核
依 report §6 檢查清單,把 sub、token 簽發資訊、工具呼叫參數記入日誌,並排入既有安全稽核週期。