在实际的 AWS 上使用 Claude 做开发,远不止“打开一个网页对话”这么简单。开发者需要同时处理两条技术线:一条是 Claude 的模型访问能力,包括账号、API Key、模型 ID、配额和限流;另一条是 AWS 的云资源管理,包括 EC2、安全组、IAM、Lambda 和账单。两条线如果只搞定其中一条,项目都很难从本地原型走到真正落地。这篇文章围绕“在 AWS 上用 Claude 从开发到落地”整理了一条可复现的完整链路:先在 EC2 上准备开发环境,再安装配置 Claude Code 作为 AI 编码助手,用它辅助开发一个调用 Claude 模型的文本摘要接口,随后把应用部署回 AWS,并补充验证、排错和成本控制方法。
文章不会假设你已经熟悉全部服务。每个环节会先说明目的,再给命令,最后给检查点。读者可以按顺序操作,也可以在遇到报错时直接跳到对应排查章节。
1. 先想清楚“在 AWS 上用 Claude”的三种形态
1.1 三种形态的区别与选型
很多文章把“使用 Claude”混为一谈,但实际工作中至少存在三种差别很大的形态:
形态一:Claude Code 作为开发工具。Claude Code 是 Anthropic 提供的命令行 AI 编码工具,运行在终端里,可以帮你读代码、改 Bug、写测试、做代码审查。在这种形态里,Claude 不参与生产流量,只提升研发效率。它应该被安装到开发机上,最常见的就是开发人员自己的电脑或一台 AWS EC2 实例。
形态二:应用代码直接调用 Claude API。你的业务服务在运行时把用户请求转发给 Anthropic 的接口,拿回模型结果后再返回给用户。这种形态需要考虑 API Key 管理、超时、限流和错误处理。
形态三:通过 Amazon Bedrock 调用 Claude 模型。Bedrock 是 AWS 托管的模型服务,Claude 系列模型可以通过 Bedrock 的接口调用。相比直接调用 Anthropic API,这种方式的身份体系由 AWS IAM 管理,计费也走 AWS 账单,适合已经有 AWS 账号体系、需要在同一个云环境里做权限管控的生产项目。
三种形态并不互斥。一个完整项目里,完全可以先安装 Claude Code 辅助开发,业务代码里再通过 Bedrock 调用 Claude,部署在 AWS Lambda 上运行。
1.2 为什么选择“EC2 开发 + API/Bedrock 接入 + AWS 部署”作为主线
AWS 上可用的开发环境很多,Cloud9、CodeBuild、EC2、Lambda 都能写代码,但 EC2 仍然是最适合做这套教程的环境。原因有两个:
Claude Code 安装后是一个命令行工具,依赖 Node.js。EC2 上可以干净地安装 Node.js、Python、Git 等工具,环境之间不会互相污染。
同一台 EC2 既可以用作开发机,也可以作为后续部署测试的临时服务器。如果文章只讲 Lambda,不少读者会卡在本地没有 CLI 环境的问题上;如果只讲 EC2,又缺少更省成本的落地形态。所以本文先把开发放在 EC2 上,最后再给出 Lambda 的改造思路。
1.3 本文要实现的最小闭环
整个项目的流程可以概括为下面这条链路:
- 创建一台 Ubuntu EC2 实例,配置安全组和 SSH。
- 在 EC2 上安装 Node.js、npm 和 Claude Code。
- 配置 Claude Code 的认证信息,确认命令行工具能正常启动。
- 用 Flask 写一个文本摘要 HTTP API,应用通过 Anthropic API 或 Bedrock 调用 Claude。
- 本地跑通后,把应用部署到 EC2 或改造成 Lambda 函数。
- 用 curl 验证接口,检查返回结果和日志。
- 最后看账单和资源占用,避免遗留资源扣费。
这样既覆盖了“开发”,也覆盖了“落地”,中间涉及的报错和排查点也可以集中讲清楚。
2. 准备 AWS 环境:账号、主机、网络和权限
2.1 创建 EC2 实例的关键参数
登录 AWS 控制台后,进入 EC2 页面,点击“启动实例”。初学者建议按下面的参数选择:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 名称 | claude-ec2-dev | 方便识别资源,避免账单里出现一堆匿名实例 |
| Amazon Machine Image(AMI) | Ubuntu Server 22.04 LTS | 软件源丰富,Claude Code、Python、Node.js 安装资料多 |
| 实例类型 | t3.micro 或 t3.small | 学习场景够用;生产场景按内存和 CPU 需求调整 |
| 密钥对 | 新建并下载 .pem 文件 | 丢失后只能重建实例,无法找回 |
| 网络设置 | 允许 SSH 流量,来源选择“我的 IP” | 不要设置为 0.0.0.0/0,否则容易招致爆破 |
| 配置存储 | 20 GB gp3 | 默认值通常够用;如果计划装大模型工具,可以加大到 50 GB |
这里要特别提醒:t3.micro 在免费套餐有效期内可能包含一定免费额度,但免费套餐资格与账号注册时间、地域有关。如果账号已经没有免费额度,实例会按小时计费。创建实例前先把区域选好,比如亚太地区某个可用区,然后持续在同一个区域操作,否则后续找资源和排查账单都会混乱。
2.2 安全组、SSH 和密钥连接
实例创建完成后,SSH 连接前需要给密钥文件设置正确权限,否则 SSH 会拒绝使用:
chmod 400 your-key.pem ssh -i your-key.pem ubuntu@你的实例公网IPUbuntu 的默认用户名是ubuntu,公网 IP 可以在 EC2 控制台实例列表里找到。
连接成功后先更新系统:
sudo apt update sudo apt upgrade -y这一步是为了让后续安装 Node.js、pip 时不会遇到旧的软件源问题。如果 SSH 连接超时,优先检查安全组的入站规则里是否只允许了 22 端口,以及来源 IP 是否填写正确。很多“实例无法连接”的问题并不是系统坏了,而是安全组没有放行。
2.3 为模型访问准备密钥或 IAM 权限
在进入 Claude Code 安装前,先确认你准备用哪种方式访问 Claude,因为后续配置不同。
如果直接使用 Anthropic API,需要先在 Anthropic 控制台创建 API Key。API Key 是一个以sk-ant-开头的字符串,创建后只显示一次,要立即保存。注意不要把 API Key 提交到 Git 仓库或写在公共代码里。
如果使用 Amazon Bedrock,则需要做两件事:
- 在 Bedrock 控制台“模型访问”页面里,勾选需要用到的 Claude 模型并申请开通。
- 为当前使用的用户或角色配置 IAM 权限,至少包括
bedrock:InvokeModel权限。
两种方式的区别可以整理成下面的表格:
| 对比项 | Anthropic API | Amazon Bedrock |
|---|---|---|
| 身份认证 | API Key | AWS IAM |
| 计费账号 | Anthropic 独立账单 | AWS 账单 |
| 模型 ID 维护 | 由 Anthropic 侧发布 | 由 AWS 侧同步 |
| 适合场景 | 快速接入、已有 Anthropic 账号 | 企业统一权限、AWS 安全审计 |
如果两个账号都没有,也可以先注册 Anthropic 账号创建 API Key。某些地区或新用户账号可能受服务开放范围限制,落地前以官方支持情况为准。
2.4 环境检查清单
在安装任何工具之前,先确认当前机器已经具备以下环境:
- Ubuntu 22.04 或相近的 Linux 发行版
- Python 3.10 或更高版本
- Node.js 18 或更高版本
- npm 9 或更高版本
- Git
- AWS CLI(如果后续要用 Bedrock 或部署 Lambda)
用一段命令集中检查:
python3 --version node --version npm --version git --version aws --version3. 在 AWS EC2 上安装 Claude Code
3.1 安装 Node.js 和 npm
Claude Code 基于 Node.js 运行,直接使用 apt 安装的 Node.js 版本往往偏旧,推荐用 nvm 安装 LTS 版本:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" nvm install --lts node -v npm -v如果重新登录 session 后发现node命令不存在,检查.bashrc或.zshrc里是否加载了 nvm 环境:
alias nvm command -v nvm注意:安装工具的报错有 80% 来自环境变量没有生效。重新打开终端,或者手动执行
source ~/.bashrc,通常能解决“命令找不到”的问题。
3.2 全局安装 Claude Code
安装 Claude Code 的命令是:
npm install -g @anthropic-ai/claude-code claude --version如果全局安装成功,claude命令应该可以直接执行。如果执行后提示找不到命令,先确认 npm 的全局安装目录是否在 PATH 中:
npm config get prefix如果 prefix 指向的是/usr/local,通常没有路径问题。如果 prefix 指向~/.npm-global,需要在环境变量中加入对应目录。
3.3 登录或配置 API Key
Claude Code 启动后有几种认证方式。最简单的方式是直接运行:
claude首次启动会引导你登录 Anthropic 账号,完成浏览器授权后即可进入对话界面。
如果你更希望用 API Key 控制调用,也可以设置环境变量:
export ANTHROPIC_API_KEY="sk-ant-你的key" claude为了让配置在重启后依然生效,可以把环境变量写入用户配置:
echo 'export ANTHROPIC_API_KEY="sk-ant-你的key"' >> ~/.bashrc source ~/.bashrc这种方式的优点是脚本化更稳定,缺点是 API Key 会以明文形式存在服务器上,生产环境建议使用 AWS Secrets Manager 或系统密钥管理工具保存。
3.4 备选安装路径:VS Code 扩展与桌面版
如果你不想在纯终端里工作,也可以走两条备选路径:
在 VS Code 中搜索 Claude Code 扩展,安装后通过图形界面调用。这种方式适合熟悉 IDE 的开发者,但扩展仍依赖同一个命令行工具,如果基础安装有问题,扩展一样会报错。
Claude Code 也有桌面客户端形态。桌面版适合本机日常使用,但在远程 EC2 上使用命令行版本更轻量,也更容易配合 CI/CD 脚本。实际项目的选择标准是:看代码、改代码、查日志时,终端工具通常够用;需要可视化查看 diff 时,IDE 扩展更直观。
4. Claude Code 安装报错和启动问题排查
4.1 “claude 不是内部或外部命令”或“无法将 claude 识别为 cmdlet”怎么处理
这是搜索引擎里出现频率最高的两个报错,分别出现在 Windows 环境和中文字符环境下。本质原因只有一个:claude可执行文件不在当前终端的命令查找路径 PATH 中。
在 Linux 上先检查全局安装是否成功:
npm list -g @anthropic-ai/claude-code npm bin -g如果包已经安装,但命令不在/usr/local/bin或~/.npm-global/bin,手动添加路径:
export PATH="$PATH:$(npm bin -g)"在 Windows 的 PowerShell 或 CMD 下,出现“不是内部或外部命令”时,先查看 npm 全局包路径:
npm config get prefix然后把这个路径下的目录加入系统环境变量 PATH。另一种快速解法是不依赖全局安装,直接用 npx 启动:
npx @anthropic-ai/claude-code这样可以绕过 PATH 配置问题,缺点是每次调用会先检查包版本,启动稍慢。
4.2 PowerShell 执行策略或权限问题
Windows 下即使 PATH 正确,PowerShell 也可能因为执行策略限制而拒绝运行脚本。报错通常会包含“无法加载文件,因为在此系统上禁止运行脚本”等关键字。
常见处理方式是修改当前用户的执行策略:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser修改后重新打开 PowerShell。如果公司环境不允许调整执行策略,就不要纠结全局命令,直接使用 npx 方式:
npx @anthropic-ai/claude-code4.3 账号与订阅相关提示
启动 Claude Code 或使用 Claude 过程中,可能出现两类账号提示:
一类是“Claude is not available to new users right now”或“Your organization has disabled Claude subscription access for Claude Code”。这类提示意味着当前账号没有 Claude Code 的使用权限,或者组织策略禁止成员使用订阅功能。处理顺序是:
- 确认账号是否完成 Claude 登录。
- 确认是否持有 Claude 订阅或 API 可用额度。
- 确认组织后台是否关闭了 Claude Code 功能。
- 如果以上都没有问题,改用 ANTHROPIC_API_KEY 认证方式再试。
- 如果使用 Bedrock 通道,则需要检查 IAM 角色的权限是否包含 Bedrock 模型调用。
注意:不要反复重装软件来尝试解决账号权限问题。这类提示通常和账号状态相关,而不是安装文件损坏。
4.4 网络超时和请求失败
Claude Code 启动后需要和模型服务端通信。如果你看到超时、连接失败或长时间无响应,先检查网络环境:
curl -I https://api.anthropic.com在 AWS EC2 上还需要检查安全组的出站规则。大部分情况出站是默认允许的,但如果企业账号启用了出站白名单,就需要确认目标域名和端口是否被放行。
调试时可以用带超时的请求定位问题:
curl --max-time 10 -I https://api.anthropic.com如果 curl 正常但 Claude Code 仍然超时,再看环境变量是否正确配置,模型 ID 是否有效,以及是否触发了限流。限流通常表现为 HTTP 429 或模型返回“rate limit”相关错误。
5. 用 Claude Code 开发一个最小 AI 应用
5.1 需求与功能设计
为了让教程形成完整闭环,这里实现一个“文本摘要 API”。外部请求向服务发送一段文本,服务调用 Claude 模型后返回三句话摘要。
功能拆解后有三部分:
- HTTP 接口层:接收 POST 请求和 JSON 参数。
- 模型调用层:支持 Anthropic API 和 Bedrock 两种通道。
- 异常处理层:文本为空时返回 400,调用失败时返回 500 并记录日志。
为什么选择文本摘要而不是聊天机器人?因为摘要功能对输入输出边界清晰,适合演示接口设计;而聊天机器人涉及会话状态管理、上下文记忆、流式输出,环节更多,容易模糊主线。
5.2 项目结构
在 EC2 上创建项目目录:
mkdir claude-demo cd claude-demo项目结构建议保持最小:
claude-demo/ ├── app.py ├── requirements.txt └── README.md如果后续要部署到 Lambda,可以再把模型调用函数拆到claude_client.py中,方便 Lambda 入口直接引用。
5.3 依赖和代码
创建requirements.txt:
flask==3.0.0 anthropic==0.25.4 boto3==1.34.0版本号只是示例,落地前以官方最新版本为准。boto3只在采用 Bedrock 通道时需要。
创建app.py:
import json import os import anthropic import boto3 from flask import Flask, request, jsonify app = Flask(__name__) provider = os.getenv("CLAUDE_PROVIDER", "anthropic").lower() if provider == "bedrock": bedrock_runtime = boto3.client( "bedrock-runtime", region_name=os.getenv("AWS_REGION", "us-east-1") ) BEDROCK_MODEL_ID = os.getenv( "BEDROCK_MODEL_ID", "anthropic.claude-3-5-sonnet-20241022-v2:0" ) else: anthropic_client = anthropic.Anthropic() ANTHROPIC_MODEL_ID = os.getenv( "ANTHROPIC_MODEL_ID", "claude-3-5-sonnet-20241022" ) def summarize(text: str) -> str: if provider == "bedrock": body = { "anthropic_version": "bedrock-2023-05-31", "max_tokens": 1024, "messages": [ { "role": "user", "content": f"请用三句话总结下面内容:\n\n{text}", } ], } response = bedrock_runtime.invoke_model( modelId=BEDROCK_MODEL_ID, contentType="application/json", accept="application/json", body=json.dumps(body), ) result = json.loads(response["body"].read()) return "".join( block.get("text", "") for block in result.get("content", []) ) message = anthropic_client.messages.create( model=ANTHROPIC_MODEL_ID, max_tokens=1024, messages=[ { "role": "user", "content": f"请用三句话总结下面内容:\n\n{text}", } ], ) return "".join(block.text for block in message.content) @app.post("/summarize") def summarize_handler(): data = request.get_json(silent=True) if not data or not data.get("text"): return jsonify({"error": "text is required"}), 400 try: summary = summarize(data["text"]) return jsonify({"summary": summary}) except Exception as exc: app.logger.exception("summarize failed") return jsonify({"error": str(exc)}), 500 if __name__ == "__main__": app.run(host="0.0.0.0", port=8000)这段代码看起来很长,但逻辑只有三层。CLAUDE_PROVIDER环境变量决定走 Anthropic API 还是 Bedrock;summarize函数完成模型调用;HTTP 层负责解析请求和返回错误。模型 ID 在示例中写的是 Claude 3.5 Sonnet,实际使用时以 Anthropic 或 Bedrock 控制台展示的最新模型 ID 为准。
5.4 用 Claude Code 辅助编码和审查
代码写完后,在项目目录里启动 Claude Code:
cd claude-demo claude在对话界面中,可以输入如下指令:
请检查 app.py 的错误处理逻辑,指出可能的问题并给出修改建议。Claude Code 会读取项目文件,返回审查意见。这里的关键不是让它直接生成一版你能用的完整代码,而是要学会验证它给出的建议。
建议按三个步骤使用:
- 先让它列出问题清单。
- 逐个确认问题是否真实存在。
- 确认后再让它给出修改后的代码片段。
例如,代码中的request.get_json(silent=True)在收到非 JSON 请求时不会抛异常,这是刻意设计的。但如果 Claude 建议你去掉silent=True,你就需要判断:你是想返回 400 还是想直接让 Flask 框架返回 HTML 错误页?带着这个判断去接受建议,Claude Code 才会成为可靠的辅助工具。
5.5 本地启动和验证
先创建虚拟环境并安装依赖:
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt如果用 Anthropic API,设置密钥后启动:
export CLAUDE_PROVIDER=anthropic export ANTHROPIC_API_KEY="sk-ant-你的key" python app.py服务会监听 8000 端口。打开另一个 SSH 终端,执行:
curl -X POST http://127.0.0.1:8000/summarize \ -H "Content-Type: application/json" \ -d '{"text": "AWS 提供了计算、存储、数据库、机器学习等丰富的云服务,用户可以根据需要灵活地选择和组合这些服务,从而降低运维成本并加快业务迭代速度。"}'正常响应类似:
{ "summary": "AWS 提供多样云服务。用户可按需组合。这能降低运维成本并加速迭代。" }如果返回 500,先看终端日志。常见原因是 API Key 无效、模型 ID 不存在、没有开通 Bedrock 模型访问权限,或者当前账号地区不支持该模型。
6. 部署到 AWS:从 EC2 到 Lambda
6.1 方案选型
应用在本地跑通后,需要决定部署形态。这里比较多的是 EC2 常驻服务和 Lambda 按量函数。
| 对比项 | EC2 常驻服务 | Lambda 函数 |
|---|---|---|
| 启动方式 | systemd 管理 Python 服务 | API Gateway 或函数 URL 触发 |
| 运维成本 | 需要管理主机、补丁、系统启动 | 托管执行,不需要维护服务器 |
| 冷启动 | 无冷启动 | 首次请求可能有延迟 |
| 成本模型 | 按实例运行时长计费 | 按调用次数和运行时长计费 |
| 适合场景 | 长连接、WebSocket、稳定接口 | 低频调用、异步处理、事件任务 |
如果只是给内部团队演示,选 EC2 更直观;如果接口调用本来就是低频的,直接改造成 Lambda 更省钱。
6.2 部署到 EC2 的步骤
假设你已经通过 SSH 登录到 EC2 实例并安装了项目文件。下面用 systemd 管理 Flask 服务。
先创建服务文件:
sudo tee /etc/systemd/system/claude-demo.service > /dev/null <<'EOF' [Unit] Description=Claude Demo Flask Service After=network.target [Service] User=ubuntu WorkingDirectory=/home/ubuntu/claude-demo Environment=CLAUDE_PROVIDER=anthropic Environment=ANTHROPIC_API_KEY=sk-ant-你的key ExecStart=/home/ubuntu/claude-demo/.venv/bin/python app.py Restart=always RestartSec=3 [Install] WantedBy=multi-user.target EOF然后执行:
sudo systemctl daemon-reload sudo systemctl enable claude-demo sudo systemctl start claude-demo sudo systemctl status claude-demo如果服务启动失败,用下面命令查看详细日志:
sudo journalctl -u claude-demo -f确认服务状态为active (running)后,再用 curl 验证本机接口。如果希望从公网访问,需要在 EC2 安全组中放行 8000 端口,但来源 IP 建议限制为可访问者所在网络的 IP,不要直接对全世界开放。
6.3 改造成 Lambda 函数的思路
Lambda 的运行环境不适合直接运行 Flask 服务,但我们可以复用核心的summarize函数。
创建lambda_function.py:
import json import os def lambda_handler(event, context): body = json.loads(event.get("body", "{}")) text = body.get("text", "") if not text: return { "statusCode": 400, "body": json.dumps({"error": "text is required"}), } try: summary = summarize(text) return { "statusCode": 200, "body": json.dumps({"summary": summary}), } except Exception as exc: return { "statusCode": 500, "body": json.dumps({"error": str(exc)}), }需要把app.py里的summarize函数复制到lambda_function.py,或者把模型调用逻辑抽到claude_client.py再统一 import。Lambda 的依赖需要打包成层或把依赖安装到同目录上传。建议使用容器镜像方式打包,这样依赖版本更可控。
Lambda 的环境变量配置如下:
CLAUDE_PROVIDER=anthropic或bedrockANTHROPIC_API_KEY=sk-ant-你的keyAWS_REGION=us-east-1BEDROCK_MODEL_ID=对应模型 ID
如果走 Bedrock 通道,Lambda 的执行角色必须附带允许 Bedrock 调用权限的策略,否则运行时会报AccessDeniedException。
6.4 验证发布结果
不管部署到 EC2 还是 Lambda,验证方式都是发一个真实请求。
如果是 EC2,执行:
curl -X POST http://你的实例公网IP:8000/summarize \ -H "Content-Type: application/json" \ -d '{"text": "AWS Lambda 允许用户运行代码而无需管理服务器,只需要配置触发器、代码和运行角色即可。"}'如果是 Lambda 函数 URL,从控制台复制 URL 后同样用 curl 调用。
验证通过后,还要检查日志。EC2 下使用journalctl -u claude-demo,Lambda 下前往 CloudWatch Logs 查看LogStream。日志里应该能看到完整请求记录、异常堆栈和耗时信息。如果发现模型响应偏慢,考虑设置更长超时时间,并在接口层加入合理的超时重试策略。
7. 常见坑、扣费问题和成本控制
7.1 AWS 上最容易踩到的 5 个坑
实际项目中,问题往往不是模型不行,而是云资源配置和代码集成之间的细节没有对齐。
| 问题现象 | 常见原因 | 处理方式 |
|---|---|---|
| 部署后接口 504 | Flask 服务未启动或 Lambda 超时太短 | 检查 systemd 状态;调大 Lambda 超时时间 |
| Bedrock 返回 AccessDenied | IAM 角色没有模型调用权限 | 给执行角色附加bedrock:InvokeModel权限 |
| Claude Code 无法启动 | Node.js 版本过低或 npm 全局目录不在 PATH | 用node -v检查版本,补全 PATH |
| API Key 泄露到 Git | 环境变量写在代码里,或提交了.env | 删除历史记录,改用环境变量和密钥管理服务 |
| 账单突然变高 | 忘记关闭测试实例,或残留快照和弹性 IP | 按资源清单逐一检查并释放 |
7.2 ASG desired 设为 0 后为什么还会扣费
很多人在关闭 Auto Scaling Group(ASG)时,会把 desired 数量设为 0,认为这样实例就释放了,不会产生费用。这个理解不完整。
ASG 本身的配置是免费的,但 ASG 通常关联其他资源。常见扣费来源包括:
- 仍存在的 Application Load Balancer,即使没有流量也按时计费。
- NAT Gateway,按创建时长和流量计费,价格并不低。
- 实例释放后遗留的 EBS 快照,按存储容量收费。
- Elastic IP,未绑定到运行中实例时仍会收费。
- S3 存储桶中的测试文件,按存储量计费。
- CloudWatch Logs 日志组,日志会持续累积并产生存储费用。
正确做法是在确认不再需要测试环境时,进入 EC2 Auto Scaling 控制台,把Min、Max、Desired全部设为 0,然后单独检查 ELB、NAT、EIP、快照和日志组是否还需要保留。
7.3 降低模型成本和省 token 的使用方法
Claude Code 和 Claude API 都会消耗 token,成本控制可以从以下几个方向做:
使用 Claude Code 时,对话上下文越长,消耗越大。不要让它反复读取整个项目。如果需要切换任务,使用/clear清理上下文,再重新描述问题。
把大任务拆成小任务。比如“先审查这个函数的错误处理”比“帮我把整个项目重构一遍”更容易控制输出长度,也更容易产生准确结果。
明确限制输出长度。在调用 API 时设置合理的max_tokens,避免模型生成超长回答。摘要功能只需要三句话,max_tokens设为 1024 已经足够。
对于辅助性、非核心的编码任务,有些人会通过 cc-switch 等工具在不同模型服务商之间切换,甚至使用本地 Ollama 模型来减少 token 消耗。这种方式适合做草稿、命名、简单文本转换,但生产环境仍建议回到官方 Claude API 或 Bedrock,因为模型对复杂项目的理解能力和输出稳定性更可靠。
7.4 AWS 成本排查清单
定期检查下面这些资源,能减少大部分“无厘头扣费”:
- 是否有未绑定实例的 Elastic IP。
- 是否有不再使用但仍在运行的 EC2 实例。
- 是否有残留的 EBS 快照。
- 是否有闲置的 NAT Gateway。
- 是否有不再访问的 S3 存储桶和 CloudWatch 日志组。
- 是否在多个区域重复创建了同样用途的资源。
AWS 账单控制台可以从“按服务”“按区域”两个维度看费用分布。扣费异常时先从这两张维度表切入,通常很快就能定位到具体资源。
8. 从开发到落地的完整检查清单
8.1 开发前检查清单
- 确定使用 Anthropic API 还是 Amazon Bedrock,并准备好 API Key 或 IAM 权限。
- 确认 EC2 实例操作系统、实例类型和区域。
- 安装 Node.js、npm、Python、Git、AWS CLI。
- 创建项目目录并初始化虚拟环境。
- 确认模型 ID 有效,先调用一次最小模型请求,验证密钥和网络通。
8.2 发布前检查清单
- 将 API Key 从代码中移除,改放到环境变量或密钥管理服务。
- 设置服务超时时间,避免模型卡住导致 HTTP 请求长期挂起。
- 配置日志记录,确保异常堆栈能完整输出。
- 安全组只放行必要端口,来源 IP 范围尽量收敛。
- 在生产环境使用 Bedrock 时,检查 IAM 权限是最小权限。
- 记录当前使用的模型 ID 和依赖版本,方便回滚。
8.3 运行中检查清单
- 关注 CloudWatch 指标,包括错误率、响应时间和调用次数。
- 设置预算告警,费用超过阈值时第一时间收到通知。
- 定期删除测试环境的快照、日志组和弹性 IP。
- 更新 Claude Code 或模型版本时,先在小流量环境验证,再全量发布。
这篇文章走通的路径并不复杂,但覆盖了从开发到落地最容易被忽略的环节:开发环境怎么搭建,Claude Code 报错从哪里排查,模型接口怎么设计,部署形态怎么选,账单异常怎么定位。把这套链路跑熟之后,你会发现真正的效率提升来自两部分:Claude 帮你处理重复编码和审查任务,而你把 AWS 的资源生命周期管理清楚,不让基础设施反过来成为项目的负担。下一步可以继续扩展的方向包括:把 Flask 应用改成流式输出、在 Lambda 中接入 API Gateway 与自定义域名、用 AWS Secrets Manager 托管 API Key,以及把 Claude Code 接入 CI 流程自动做代码审查。按顺序逐个实验,就能把“在 AWS 上使用 Claude”从一次实践变成一套稳定的工程能力。