Đến nội dung chính
Phạm Nam

Tìm kiếm

Nhập từ khoá để tìm trong các bài viết.

Quay lại
vi

Claude Code từ xa trên AWS Bedrock AgentCore

Chạy Claude Code từ xa trên AWS Bedrock AgentCore: mỗi task một microVM riêng, model call chỉ qua Bedrock, xong việc tự mở pull request. Hướng dẫn và giới hạn.

11 phút đọc—

Claude Code chạy từ xa trên AWS Bedrock AgentCore trong microVM riêng, trả về pull request

Claude Code từ xa trên AWS Bedrock AgentCore: đóng laptop lại, agent vẫn chạy

Chiều thứ Sáu, bạn giao cho Claude Code một task sửa bug khó. 40 phút sau, test vẫn chưa pass, mà đóng laptop là agent chết giữa chừng.

Đó là giới hạn của agent chạy local: máy bạn vừa giao việc, vừa thực thi, vừa giữ credential; cả team mỗi người một máy, không hàng đợi chung, không kiểm soát. Bedrock AgentCore giải quyết đúng điểm đó: Claude Code chạy từ xa, mỗi task một microVM riêng trong tài khoản AWS của bạn, xong việc tự mở pull request để người review. Bài này theo bài blog chính thức của AWS ngày 6/11/2026 và repo mẫu aws-samples/sample-remote-coding-agent.

Claude Code remote trên Bedrock AgentCore là gì?

Mỗi task bạn giao trở thành một phiên AgentCore runtime — một microVM riêng — trong tài khoản AWS của bạn, mọi lần gọi model đều đi qua Amazon Bedrock. Agent clone repo, viết code, chạy lệnh kiểm chứng, rồi push nhánh agent/<taskId> và mở pull request; agent không bao giờ tự merge.

Khác biệt lớn nhất là trạng thái sống ở đâu: chạy local thì trong terminal — đóng laptop là mất; chạy remote thì trong DynamoDB và SQS trên AWS. Credential cũng khác: không còn key AWS hay token GitHub trong shell local, token do AgentCore Identity cấp, sống 8 giờ, tự refresh.

Nói rõ những gì nó không phải: không phải SaaS host sẵn — bạn tự deploy và vận hành toàn bộ stack; không phải CI thay thế; không phải agent tự trị — tối đa 3 lần thử lại, hết là dừng, để lại pull request dạng draft.

Nên dùng nếu team đã dùng AWS, có repo tin cậy với lệnh setup và test sẵn, và task có phạm vi rõ: feature nhỏ, bugfix, viết test. Chưa nên dùng nếu repo không tin cậy, task mở không có tiêu chí xong, team chưa có tài khoản AWS riêng, hoặc ngân sách chưa chấp nhận bill idle.

Kiến trúc và cơ chế hoạt động

Bạn giao việc bằng plugin Claude Code sample-rca hoặc web console (CloudFront + Cognito); một Lambda sàng lọc prompt bằng Bedrock Guardrails rồi đẩy vào hàng đợi SQS, dispatcher Lambda khởi động một phiên AgentCore runtime.

Bên trong microVM, agent clone repo, tra AgentCore Memory tìm bài học cũ, lập kế hoạch bằng Claude Opus, viết code bằng Claude Sonnet, chạy lệnh setup và test của repo, rồi review bằng Opus — tối đa 3 lần — trước khi push nhánh agent/<taskId> và mở pull request (draft nếu kiểm chứng chưa pass).

Sơ đồ kiến trúc

flowchart TD
    A["Người dùng<br/>Plugin Claude Code sample-rca<br/>hoặc Web Console (CloudFront + Cognito)"] --> B["API Gateway + Lambda<br/>Tiếp nhận task"]
    B --> C["Bedrock Guardrails<br/>Chỉ sàng lọc prompt giao việc"]
    C -->|Prompt bị chặn: PromptBlockedByGuardrail| X["Từ chối task"]
    C --> D["DynamoDB: trạng thái task<br/>SQS: hàng đợi"]
    D --> E["Dispatcher Lambda"]
    E --> F["AgentCore Runtime microVM<br/>Một microVM cho một task<br/>Bộ nhớ bị sanitize khi phiên kết thúc"]
    F --> G["AgentCore Memory<br/>Bài học xuyên phiên"]
    F --> H["Claude Opus: lập kế hoạch + review"]
    F --> I["Claude Sonnet: viết code"]
    F --> J["Lệnh setup / test của repo"]
    H -->|Tối đa 3 lần thử lại| I
    I --> J
    J --> H
    F --> K["GitHub App qua AgentCore Identity<br/>Token 8 giờ, tự refresh"]
    K --> L["Nhánh agent/&lt;taskId&gt; + Pull Request<br/>Draft nếu chưa pass kiểm chứng"]
    L --> M["Người review và merge bằng tay<br/>Agent không bao giờ merge"]
    F -.->|"Mọi model call chỉ qua Amazon Bedrock<br/>DNS Firewall chặn api.anthropic.com"| N["Amazon Bedrock"]
    F -.->|"VPC private, outbound HTTPS<br/>qua NAT gateway"| O["GitHub / Package registry"]

Các thành phần chính

MicroVM là lớp cô lập: một task một microVM, bộ nhớ bị sanitize khi phiên kết thúc. AgentCore Memory là thành phần duy nhất giữ bài học xuyên phiên — và cũng là bề mặt cần quản trị cẩn thận nhất (xem mục bảo mật). Bedrock là cửa duy nhất ra model: IAM role của runtime chỉ được invoke model Anthropic; Guardrails chặn jailbreak, prompt injection, yêu cầu mã độc và secret lộ trong prompt. DynamoDB, SQS và dispatcher Lambda tạo thành hàng đợi bất đồng bộ; GitHub App (Contents và Pull requests) kết hợp AgentCore Identity cấp token ngắn hạn, giới hạn bằng danh sách repo được install; VPC private có VPC endpoints, NAT gateway chỉ cho outbound HTTPS và Route 53 DNS Firewall chặn domain của vendor model.

Giới hạn đã xác minh

Region hỗ trợ AgentCore runtime V2: us-east-1, us-east-2, us-west-2, ap-northeast-1, eu-west-1 (bài của AWS dùng us-west-2) — không có ap-southeast-1 (Singapore).

Repo phải tự khai báo lệnh của chính nó: Makefile với target setup và test, hoặc package.json với scripts.setup và scripts.test. Repo trống phải scaffold trước bằng scripts/scaffold.sh hoặc /sample-rca:scaffold, nếu không task fail ở cuối khi mở pull request.

Hướng dẫn triển khai

Chuẩn bị: tài khoản AWS riêng (nên dedicated, tách khỏi production); AWS CLI; Docker đang chạy; Python 3.11+; uv; Node.js 22.12+ theo bài blog của AWS (README ghi Node ≥ 20, theo mình dùng 22.12+). Ngoài ra cần tài khoản GitHub có quyền tạo GitHub App và một repo tin cậy đã có sẵn setup và test.

Trước khi deploy, chỉ rõ profile và region sẽ dùng:

export AWS_PROFILE=<profile-cua-ban>
export AWS_REGION=us-west-2

Nếu deploy ở region khác us-east-1, vẫn cần CDK bootstrap us-east-1 — một phần deployment luôn đi về đó; make preflight sẽ in lệnh cần chạy. Các lệnh chuẩn theo tài liệu chính thức của AWS:

git clone https://github.com/aws-samples/sample-remote-coding-agent
cd sample-remote-coding-agent
make setup
make preflight
make deploy EMAIL=you@example.com

Deploy mất khoảng 15–25 phút, chủ yếu là build image ARM64 khoảng 1,3 GB trên máy local — số liệu của AWS, mình chưa chạy thử. make preflight phải pass trước khi deploy: preflight chỉ đọc, còn deploy bắt đầu tính tiền ngay.

Sau deploy, mở console và kết nối GitHub: console tạo sẵn mô tả GitHub App, bạn xác nhận trên GitHub rồi chọn Install on GitHub với Only select repositories, chỉ install đúng repo đã đăng ký. Đăng ký repo mất thêm 8–12 phút mới đạt READY; task giao trước lúc đó trả lỗi 409 ConfigurationNotReady — install và authorize là hai bước riêng, cả hai đều bắt buộc.

Chạy task đầu tiên

Cài plugin, rồi khởi động lại Claude Code để nạp MCP tools. Để trống các trường cấu hình (RCA_API_URL, RCA_REGION, RCA_STACK_NAME) để tự discovery — điền tay có thể trỏ nhầm sang deployment khác:

/plugin marketplace add aws-samples/sample-remote-coding-agent
/plugin install sample-rca@sample-remote-coding-agent

Sau khi khởi động lại, chạy lệnh giao việc từ một bản clone local của repo đã đăng ký:

/sample-rca:remote <mô tả task>
/sample-rca:remote status

Web console đẩy task vào cùng một hàng đợi SQS: đăng nhập qua Cognito, gõ task lên board rồi Start run.

Trên board, task đi qua Backlog → Planning → Coding → Verifying → Done; Reviewing và Submitting nằm bên trong Verifying. Done chưa phải bằng chứng thành công — chỉ SUCCEEDED mới nghĩa là lệnh kiểm chứng đã chạy và review đánh giá xanh. Mốc cuối phải thấy là nhánh agent/<taskId> kèm pull request; nếu task kẹt, đối chiếu log CloudWatch của dispatcher và runtime.

Task đầu tiên nên là bugfix nhỏ đã có test sẵn.

Đánh giá kỹ thuật

Ưu điểm

Cô lập là thật: một task một microVM, bộ nhớ xóa khi hết phiên; model call chỉ qua Bedrock trong tài khoản của bạn; không credential AWS nào nằm trong container; token GitHub sống 8 giờ; agent không merge. SQS và DynamoDB tách việc giao task khỏi việc thực thi, cả team giao việc từ plugin hoặc console mà không cần máy ai bật.

Nhược điểm

Chi phí idle là nhược điểm lớn nhất: NAT gateway, endpoints, WAF, Cognito, DNS Firewall, image và log vẫn tính tiền khi không có task nào chạy. Budget mặc định 200 USD/tháng chỉ gửi email cảnh báo — không chặn chi tiêu — và repo mẫu không có ước tính chi phí chính thức nào.

Mẫu còn rất non: repo MIT-0, tạo ngày 2026-09-01, push gần nhất 2026-11-05, chỉ 2 star và 0 fork — uy tín nằm ở chỗ đây là sample chính thức của AWS, nên API hay lệnh có thể đổi ở các bản sau. Giới hạn 3 lần thử lại khiến task mở dễ dừng giữa chừng, và chưa có region Singapore là điểm trừ thực tế với team Việt Nam.

Bảo mật: 6 lớp kiểm soát và 1 điểm mù

Sáu lớp kiểm soát: model call chỉ qua Bedrock; microVM cô lập và sanitize sau phiên; token GitHub 8 giờ; Guardrails sàng lọc prompt; VPC private với endpoints và DNS Firewall; IAM least-privilege — runtime chỉ invoke model Anthropic, chỉ đọc/ghi task record và memory của repo mình.

Nhưng có một điểm mù phải nói thẳng: Guardrails chỉ sàng lọc prompt giao việc, không sàng lọc file trong repo hay output của lệnh — theo AWS, sàng lọc mọi model call sẽ phải đánh giá lại toàn bộ context và flag cả system prompt của Claude Code. Hệ quả: ranh giới tin cậy thực sự nằm ở nội dung repo và bài học trong Memory, không phải ở prompt. Một chỉ dẫn độc hại trong file repo hay issue sẽ đi thẳng vào context mà không qua lớp chặn nào; và vì Memory không bị sanitize như microVM, một bài học xấu sẽ sống qua mọi phiên sau.

README nói thẳng: installation list của GitHub App chính là blast radius — token cấp cho container của một repo có thể ghi vào mọi repo mà app được install. Đó là cách GitHub App hoạt động, và là điểm mẫu này đánh đổi so với token fine-grained theo từng repo. Chỉ install app đúng các repo đã đăng ký chạy agent, và dùng tài khoản GitHub không sở hữu thứ gì bạn tiếc nếu mất. Trước khi đăng ký repo nào, bật branch protection cho nhánh mặc định.

Tuyên bố dữ liệu của Bedrock — không train trên dữ liệu khách hàng, SOC/ISO/FedRAMP Moderate, HIPAA eligible, Mantle zero operator access, zero data retention — là tuyên bố của vendor AWS, chưa kiểm chứng độc lập. Riêng zero data retention là tùy chọn theo region, phải bật và xác nhận model hỗ trợ; inference profile mặc định dạng global. có thể phục vụ ngoài region triển khai — pin inference profile theo khu vực nếu dữ liệu cần ở trong một khu vực địa lý.

Dọn dẹp cũng là rủi ro vận hành: deregister repo trước (1–3 phút mỗi repo), ngắt kết nối GitHub, destroy stack, rồi xóa GitHub App. DynamoDB, Cognito pool, access-log bucket, image và log group còn sót sau khi xóa stack và vẫn tính tiền nếu không xóa tay.

So sánh với các lựa chọn cùng phạm vi

Chạy local thì setup và chi phí gần như bằng không, nhưng máy của bạn là con tin và credential nằm trong shell. Worktree local (Worktrunk, Orca) rẻ và nhanh nhưng vẫn là máy local, không có hàng đợi chung. CC Switch giải quyết chi phí model, không giải quyết chạy từ xa. Tự dựng trên máy chủ riêng thì bạn tự chịu cô lập và credential. Dịch vụ host sẵn setup nhanh nhất, nhưng code và dữ liệu rời khỏi tài khoản AWS của bạn.

Kết luận: AgentCore thắng ở cô lập, credential ngắn hạn và bất đồng bộ trong tài khoản AWS của chính bạn; thua ở chi phí idle, độ phức tạp setup và region hạn chế. Xem thêm bài CC Switch và bộ nhớ xuyên phiên của Claude Code để đặt remote agent đúng chỗ trong quy trình hiện tại.

Trường hợp sử dụng thực tế

Với team IT dùng AWS, kịch bản hợp nhất là giao bugfix và feature nhỏ có test, review PR tập trung, tách tài khoản AWS dedicated cho agent khỏi production, và dùng Memory để agent học quy ước repo — hoặc giao spec đã viết sẵn (xem bài Spec Kit) làm task rồi review PR theo spec đó. Với DevOps/SRE, giá trị là giao task dài chạy nền rồi nhận PR để review sau. Homelab hoặc cá nhân ít dùng AWS thì chạy local cộng worktree rẻ và đơn giản hơn.

Xử lý sự cố thường gặp

Repo chưa READY: trả lỗi 409 ConfigurationNotReady — chờ READY rồi giao lại. Repo trống chưa scaffold: task fail ở cuối khi mở pull request — scaffold bằng scripts/scaffold.sh hoặc /sample-rca:scaffold trước khi đăng ký. Thiếu setup hoặc test: PR mở dạng draft — bổ sung hai lệnh này rồi đăng ký lại.

Prompt bị chặn (PromptBlockedByGuardrail): viết lại task, tách secret ra khỏi prompt. Node: README ghi Node ≥ 20 nên Node 20 vẫn qua setup và preflight — nhưng bài blog của AWS yêu cầu 22.12+, theo mình cứ dùng 22.12+. Docker chưa chạy: deploy fail ở bước build image — khởi động Docker daemon rồi chạy lại make deploy. Region không hỗ trợ: lỗi ở preflight hoặc deploy — chuyển sang một trong năm region đã xác minh. GitHub App chưa install vào repo: agent không clone hay push được — kiểm tra install list của App, rồi authorize lại trong console, vì install và authorize là hai bước riêng.

Rollback: không có nút “undo” cho task đã chạy — đóng pull request, xóa nhánh agent/<taskId>, deregister repo nếu cần, xóa bài học xấu khỏi Memory.

Kết luận

Hợp với team đã dùng AWS, repo tin cậy có sẵn setup và test, task có phạm vi rõ, và chấp nhận chi phí idle để đổi lấy cô lập và chạy bất đồng bộ. Không hợp với repo không tin cậy, task mở không có tiêu chí xong, team chưa có tài khoản AWS riêng, hay ngân sách chưa chấp nhận bill idle.

Bước tiếp theo: thử trên một repo phụ tin cậy với một bugfix nhỏ có test; đo thời gian deploy, đăng ký repo và bill tuần đầu trước khi đưa repo chính vào.

Bài học rút ra

  1. Đóng laptop được vì trạng thái sống trong DynamoDB và SQS, không sống trong terminal local — nhưng đổi lại phải quan sát hàng đợi qua CloudWatch.
  2. Bảo mật mạnh nhất không nằm ở prompt đã sàng lọc, mà ở repo tin cậy và Memory sạch.
  3. Token 8 giờ và microVM dùng một lần giảm rủi ro rò rỉ credential, nhưng Memory là thứ duy nhất sống qua phiên — một bài học xấu trong Memory tồn tại lâu hơn mọi phiên làm việc.
  4. Chi phí idle là chi phí thật: budget 200 USD chỉ cảnh báo, không chặn; dọn dẹp phải xóa tay tài nguyên sót sau stack.
  5. Tối đa 3 lần thử lại là giới hạn thiết kế — task phải có tiêu chí xong rõ ràng qua lệnh test của repo.

Phạm vi kiểm chứng

Kiểm chứng ngày 2026-11-09 theo AWS ML Blog 6/11/2026 và repo aws-samples/sample-remote-coding-agent (MIT-0, 2 star, push 2026-11-05): kiến trúc, luồng task, Guardrails, VPC, token GitHub, lệnh deploy, thời gian deploy/đăng ký repo, chi phí idle, thứ tự dọn dẹp. DNS Firewall mặc định là denylist, AWS khuyên Network Firewall allowlist cho production; budget 200 USD là alert-only, không phải cap. Các con số 15–25 phút deploy, 8–12 phút đăng ký repo, image khoảng 1,3 GB, tối đa 3 lần thử lại đều là số liệu cấu hình của AWS, không phải benchmark. Chưa kiểm chứng: không tự tay deploy sample, không đo thời gian và chi phí thực tế, không chốt phiên bản model Opus/Sonnet.

Tham khảo


Bài viết liên quan

Bình luận

Bình luận được duyệt trước khi hiển thị.

Đang tải bình luận…

Để lại bình luận