AWS上部署Claude全流程:从API接入、IAM权限到成本控制实践

发布时间:2026/9/7 7:41:56
AWS上部署Claude全流程:从API接入、IAM权限到成本控制实践 很多同学看完“在AWS上用Claude从开发到落地”这类视频后第一反应是“好像学会了”但真到了自己动手打开AWS控制台的那一刻就开始发懵。原因很简单视频里一条命令接着一条命令看得懂但轮到自己操作时权限、网络、密钥、账单这些工程细节全冒出来了。视频课的讲述节奏天然不适合“照着敲”它适合建立整体认知。真正要落地你需要的是一篇可以随时翻出来对照的文字版。这篇文章就把“在AWS上用Claude从开发到落地”这条路径完整拆开从接入方式选型、IAM权限、密钥管理、最小可运行服务、Claude Code上开发机到成本控制与Agent开发边界一次性讲清楚。先说一个核心判断在AWS上落地Claude真正的门槛并不是模型能力而是工程化配置。模型用哪个、走什么接入通道、密钥放在哪里、权限给多大、账单怎么防这五件事全部处理清楚“从开发到落地”这件事就完成了90%。本文适合正在做AI应用开发、Agent智能体开发想在AWS上把Claude用起来的开发者也适合刚接触云开发但愿意动手踩坑的同学。前端、后端、客户端开发都能照着跑通。1. 在AWS上用Claude到底难在哪里很多人以为用Claude开发就是拿到一个API Key然后写代码调用。如果你只是本地写个脚本自己玩这个理解没错。但一旦涉及“落地”两个字情况就完全变了。落地意味着你的服务要稳定运行要被别人访问要有权限控制要能排查问题更重要的是——月底账单出来的时候你要能解释清楚每一笔钱花在了哪里。具体来说在AWS上接入Claude你需要处理下面几个问题第一接入方式选型。是直连Anthropic API还是走Amazon Bedrock两个方案在权限模型、账单入口、网络要求上完全不同选错了后面会改起来很痛苦。第二权限设计。AWS的核心安全模型是IAM。给谁授权、授权到什么资源、能不能调用模型这些都要在IAM里配置。很多人图省事直接在代码里写死了一个Access Key结果密钥泄露后整个账号都暴露了。第三密钥管理。API Key、Secret Key不能写进代码仓库。但在本地开发时大家又懒得搭一套KMS于是到处复制粘贴KeyGit提交记录里全是密钥。第四成本控制。模型调用是按Token计费的一个死循环或一个没加限流的接口一晚就能烧掉不少钱。AWS上的EC2、EBS、NAT Gateway等资源也会持续计费很多人以为“实例停掉就不收费了”实际上并不是这么简单。第五运行与监控。服务部署上去之后你怎么知道它挂了你怎么看到调用日志失败时怎么定位问题这就涉及到CloudWatch、日志系统、告警策略。所以如果你要在这个月内交付一个AWS Claude的Demo或生产项目建议按这个顺序排查先确认接入方式再配置好权限然后写最小服务跑通后再补监控和成本保护。2. Claude在AWS上的接入方式与核心概念先把几个基础概念交代清楚。Claude是Anthropic公司推出的大语言模型系列擅长对话、代码生成、文本理解和Agent任务。它的能力不局限于“聊天机器人”而是可以作为应用核心完成内容分析、结构化输出、代码审查、工具调用等任务。Amazon Bedrock是AWS提供的托管式基础模型服务。你不需要自己部署模型也不需要直接对接Anthropic的海外API而是在AWS控制台里开通模型访问权限然后通过AWS的SDK调用模型。这种方式的好处是账单统一走AWS权限走IAM网络可以收敛在AWS内部。Claude Code是Anthropic推出的命令行AI编程工具本质上是Agent形态的“AI结对程序员”。你可以在终端里让它读取代码、修改文件、执行命令、运行测试。它非常适合在云端开发机或本地开发环境中使用。在AWS上接入Claude目前主流有三种方式。2.1 方式一直连Anthropic API你的应用直接调用Anthropic官方API使用Anthropic提供的Python/TypeScript SDK。这种方式最简单适合快速原型验证和个人项目。优点接入代码最少。模型版本选择灵活。不依赖AWS服务细节。缺点需要自己管理API Key。账单入口在Anthropic和AWS云资源账单分离。权限控制依赖应用层没有IAM级别的精细管控。生产环境需要处理网络出口、密钥轮换、限流重试等。2.2 方式二通过Amazon Bedrock调用Claude模型在AWS的Bedrock服务中启用Claude模型然后通过Boto3或Bedrock API调用。它的优势非常明显统一账单模型调用费用并入AWS账单。IAM权限用IAM角色或策略控制谁可以调用哪个模型。网络集成可以在VPC内部通过VPC Endpoint访问不需要把请求发到公网。审计友好模型调用记录可以接入CloudTrail。缺点需要先开通Bedrock并启用模型访问。不同区域的可用模型可能不同需要以AWS控制台显示为准。对Anthropic SDK的兼容程度要确认部分高级参数可能需要通过Bedrock接口传递。2.3 方式三自建模型网关在应用和模型之间加一层封装服务例如FastAPI、Spring Boot或者开源的模型网关组件。对外暴露统一的接口对内管理模型路由、API Key、限流、缓存和日志。这种方式适合团队场景。比如公司里有多个项目都要用Claude但不想每个项目各自管理密钥就在中间架一层网关统一收敛。也可以是Claude与其他模型并存时通过网关做模型切换。三种方式对比如下维度直连Anthropic APIAmazon Bedrock自建网关接入位置应用代码里直接用SDKAWS托管API中间加封装层账单入口Anthropic账户AWS账单统一入口或自管权限控制应用层API KeyIAM精细权限IAM 业务层密钥管理自己管理可结合Secrets Manager统一管理适合场景个人实验、快速验证企业合规、统一云账单多团队、多模型混合接入小结论个人开发或Demo直连API最快要在公司生产环境用优先考虑Bedrock项目多到一定数量后再考虑自建网关。3. 前置条件与账号准备无论选哪种方式你都需要提前准备好环境。以下环境清单以通用情况为例具体版本请以实际项目为准。3.1 需要的账号与权限一个可用的AWS账号。该账号下有权限创建IAM角色、策略并且能访问Bedrock控制台。本文默认你已经拥有合法的Claude模型访问方式例如Anthropic API Key或Bedrock模型访问权限。这里要特别强调不要使用AWS根用户进行日常开发和部署。根用户的权限太大一旦密钥泄露攻击者可以操作你的所有资源。更稳妥的做法是创建一个IAM用户只给它需要的权限。3.2 本机环境安装推荐安装以下工具Python 3.10用于运行示例代码。Node.js 18用于安装Claude Code。AWS CLI用于配置AWS账号访问。Git用于代码版本管理。Python环境示例建议使用虚拟环境mkdir aws-claude-demo cd aws-claude-demo python3 -m venv venv source venv/bin/activate pip install --upgrade pip3.3 配置AWS CLI如果你使用Bedrock方式需要先配置AWS CLIaws configure执行后按提示输入Access Key ID、Secret Access Key、默认区域和输出格式。在IAM中创建用户时不要直接给AdministratorAccess建议创建一个满足最小权限的策略。下面是一份适用于Bedrock基础调用的IAM策略示例。{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [ bedrock:InvokeModel, bedrock:InvokeModelWithResponseStream ], Resource: * } ] }注意生产环境建议把Resource收敛到具体模型ARN而不是使用*。模型ARN可以在Bedrock控制台的模型详情页查看。3.4 开通Bedrock模型访问如果你选择Bedrock方式需要在控制台完成模型访问开通打开Amazon Bedrock控制台。在左侧菜单找到Model access。选择你需要使用的Claude模型点击Enable。等待状态变成Access granted。不同区域的模型列表可能不同以你的控制台实际显示为准。4. IAM权限与密钥管理在实际项目中IAM和密钥管理是最容易被忽视、出事后果最严重的环节。4.1 最小权限原则给IAM用户、角色、EC2实例配备的权限永远遵循最小权限原则。什么意思就是“够用就好”不要给多余权限。例如一个只需要调用Bedrock模型的服务不需要S3的写权限也不需要EC2的停止实例权限。一旦权限过大某个服务被入侵后攻击者可以在你的账号里横向移动。下面的策略只允许调用Bedrock模型不包含其他操作{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: bedrock:InvokeModel, Resource: * } ] }如果你还需要读取Secrets Manager里的密钥那就加一条Secrets Manager的读权限。原则是一个服务需要什么就给它什么不需要的一律不给。4.2 密钥不要写进代码无论是Anthropic API Key还是AWS Access Key都不应该出现在代码仓库里。常见错误是把密钥写在.env文件中然后不小心提交到了Git仓库。结果要么被扫描工具抓到要么被内部人员看到。推荐两种做法第一种本地开发时使用环境变量export ANTHROPIC_API_KEYyour-api-key export CLAUDE_MODELyour-model-idPython代码里通过os.environ读取import os api_key os.environ[ANTHROPIC_API_KEY] model os.environ[CLAUDE_MODEL]第二种生产环境使用AWS Secrets Manager或SSM Parameter Store存储密钥。应用启动时从Secrets Manager拉取。4.3 不要在安全组里开全开端口如果服务部署在EC2或ECS上安全组只开放需要的端口。比如应用对外只提供443或8000端口就不要把22端口对全世界开放。数据库端口更是只能允许应用所在安全组访问。5. 最小可运行服务Python Claude API这段内容的目标是用最少的代码把一个Claude能力服务跑起来。无论后面是接Web前端、移动端还是Agent框架服务层思路都是一样的。我们用FastAPI写一个HTTP接口后端调用Anthropic SDK。这样做的原因是FastAPI轻量、自带交互文档适合作为AI服务的底座。5.1 安装依赖pip install fastapi uvicorn anthropic python-dotenv5.2 项目结构aws-claude-demo/ ├── app.py ├── requirements.txt ├── .env └── .gitignore.env文件内容ANTHROPIC_API_KEYyour-api-key CLAUDE_MODELyour-model-id.gitignore必须包含.env venv/ __pycache__/5.3 编写服务代码文件路径app.pyimport os from fastapi import FastAPI, HTTPException from anthropic import Anthropic app FastAPI(titleClaude on AWS Demo) # 从环境变量读取密钥与模型ID不写死在代码中 api_key os.environ.get(ANTHROPIC_API_KEY) model os.environ.get(CLAUDE_MODEL) if not api_key or not model: raise RuntimeError(请先设置 ANTHROPIC_API_KEY 和 CLAUDE_MODEL 环境变量) client Anthropic(api_keyapi_key) app.get(/health) def health(): return {status: ok, model: model} app.post(/chat) async def chat(request: dict): prompt request.get(prompt, ) max_tokens request.get(max_tokens, 1024) if not prompt: raise HTTPException(status_code400, detailprompt 不能为空) try: resp client.messages.create( modelmodel, max_tokensmax_tokens, messages[ {role: user, content: prompt} ] ) return {reply: resp.content[0].text} except Exception as e: # 生产环境应把异常细节记录到日志而不是直接返回给客户端 print(fcall claude failed: {e}) raise HTTPException(status_code502, detail模型调用失败)这段代码里几个关键点第一密钥通过环境变量注入不在代码中出现。第二/chat接口接收一个JSON请求字段为prompt和可选的max_tokens。第三异常处理很粗糙生产环境应补充结构化日志和错误分类。5.4 启动服务source venv/bin/activate uvicorn app:app --host 0.0.0.0 --port 8000如果是本地测试可以用python-dotenv先加载环境变量pip install python-dotenv然后在app.py开头加上from dotenv import load_dotenv load_dotenv()5.5 请求验证另外开一个终端用curl验证curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d {prompt: 用一句话解释什么是Agent}预期返回{ reply: Agent 是一个能够感知环境、自主决策并执行任务的智能体。 }到这里一个最简单的Claude服务就通了。6. 通过Amazon Bedrock调用Claude模型如果你选择Bedrock方式示例代码会有所不同。核心区别在于不再直接用Anthropic SDK而是用Boto3调用Bedrock Runtime。安装依赖pip install boto3文件路径bedrock_demo.pyimport json import boto3 # 区域以你自己的账号实际可用的区域为准 bedrock boto3.client(bedrock-runtime, region_nameus-east-1) # 模型ID请从Bedrock控制台的模型访问列表中获取 model_id anthropic.claude-3-5-sonnet prompt 请用一句话解释什么是Claude Code payload { anthropic_version: bedrock-2023-05-31, max_tokens: 1024, messages: [ {role: user, content: prompt} ] } response bedrock.invoke_model( modelIdmodel_id, bodyjson.dumps(payload) ) result json.loads(response[body].read().decode(utf-8)) print(result[content][0][text])Bedrock方式下IAM权限、网络策略、模型访问权限集中在AWS侧安全性更好。调用流程比直连API多了一层但对于企业级项目来说多出的这一层是值得的。从开发到落地选择Bedrock方案还有一层考虑你可以在CloudTrail中看到谁在什么时间调用了哪个模型这为审计提供了基础。7. 在AWS开发机上使用Claude CodeClaude Code是Anthropic官方的AI编程工具运行在终端中可以理解为一个Agent型的开发助手。它可以读取项目文件、调用Shell命令、运行测试、修复代码。很多开发者的实际感受是它把“让AI写代码”从复制粘贴变成了真正接管一部分开发流程。在AWS上你完全可以把Claude Code安装到一台开发机或EC2实例上让它直接操作云端代码仓库处理编译、测试、部署脚本等任务。7.1 安装Claude Code推荐使用npm全局安装npm install -g anthropic-ai/claude-code安装完成后验证claude --version如果提示找不到命令通常是npm全局目录没有加入PATH。可以运行下面命令查看npm config get prefix然后把输出的bin目录加入PATH。7.2 配置API KeyClaude Code运行时需要读取认证信息。最常见方式是设置环境变量export ANTHROPIC_API_KEYyour-api-key claude如果你使用的是Bedrock方式则需要参考AWS侧的身份认证配置通过IAM角色把调用权限授予当前运行环境。7.3 在VSCode中使用Claude Code开发环境通常用的是VSCode。在VSCode中打开终端直接运行claude命令即可。它会在终端里启动一个交互式会话你可以用自然语言描述需求它会读取当前目录下的文件并执行操作。典型的会话流程在VSCode终端进入项目目录。输入claude启动。输入需求例如“分析这个项目的依赖关系并帮我补全README”。Claude Code会读取文件、执行命令、展示修改结果。你确认后它会继续或结束任务。使用Claude Code时要特别注意安全问题。它拥有当前终端的权限可以执行命令、修改文件。在本地开发机或隔离环境中使用没问题但在生产服务器上要极其谨慎。8. 运行结果与效果验证无论你写的服务是直连API还是Bedrock验证一套完整效果需要关注三个层面服务可用性、模型回复质量、成本可观测性。8.1 服务可用性验证启动服务后先访问健康检查接口curl http://localhost:8000/health预期返回{ status: ok, model: your-model-id }然后测试对话接口curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d {prompt: 写一个Python快速排序函数}判断成功的标准是接口返回200reply字段是符合预期的内容。8.2 失败时先去哪里看如果接口返回502第一步不是去改代码而是看服务终端日志。示例代码里已经把异常信息打印到了标准输出所以终端里会有类似于call claude failed: xxx的日志。根据这个报错再去查API Key是否有效、模型ID是否正确、网络是否可达。如果是Bedrock方式可以再确认IAM角色是否有bedrock:InvokeModel权限以及Bedrock控制台的模型访问是否已开通。8.3 日志与版本管理从开发第一天起就养成习惯每次调用记录模型ID、Token用量、耗时。接口版本通过URL或请求头区分。代码务必放进Git仓库不要只保存在服务器上。记录Token用量尤其重要因为它是成本核算的基础。9. 常见问题与排查思路下面这个表格能覆盖大部分新手遇到的问题问题现象可能原因排查方式解决方案claude命令找不到npm全局目录未加入PATH执行npm config get prefix确认目录将对应bin目录加入PATH或重装模型调用返回403或权限错误IAM角色权限不足或Bedrock模型未开通检查IAM策略和Bedrock Model access补充最小权限策略或控制台启用模型/chat接口超时网络原因、API Key失效、模型ID错误查看服务端日志和网络出口配置重试、确认密钥、切换可用区域服务能跑但回复乱码或风格不对缺少system prompt或模型版本不稳定检查请求参数增加系统提示词并固定模型版本EC2停机后账单还在涨实例停止了但EBS卷、公网IP、快照等还在计费查看Cost Explorer账单明细释放不再使用的EBS、快照、弹性IP密钥不小心提交到了Git.gitignore没配置检查Git历史记录立即吊销密钥轮换新密钥并清理历史这里展开说两个高频问题。9.1claude命令无法识别这个错误在Windows和Linux环境都出现过。Windows下通常是因为npm全局目录没有在PATH中或者Node.js安装时没有勾选自动配置PATH。解决方法是找到npm全局bin目录手动加入系统环境变量。在Linux或macOS下可以执行export PATH$(npm config get prefix)/bin:$PATH这条命令只是临时生效持久化需要写入~/.bashrc或~/.zshrc。9.2 模型调用提示没有权限直连Anthropic API时403错误首先检查API Key是否有余额或是否被吊销。Bedrock方式下则检查Bedrock控制台是否已经启用模型访问。IAM用户或角色是否具备bedrock:InvokeModel权限。当前请求的Region是否支持该模型。按这个顺序排查大多数权限问题都能解决。10. 成本控制与账单保护在AWS上做AI应用成本控制是“落地”和“Demo”最大的区别之一。很多人的第一个月账单超支都是因为以下两种场景。10.1 场景一模型调用失控对流式响应、批量任务、Agent循环没有做限制。Agent在执行过程中可能会反复调用模型一次任务可能消耗几十万Token。对策在代码层面对单次任务设置Token上限。对用户请求做限流。使用缓存相同或相似的请求直接返回历史答案。在AWS Budgets中设置月度预算。设置预算示例aws budgets create-budget \ --account-id 123456789012 \ --budget-name claude-monthly-budget \ --budget-limit Amount100,UnitUSD注意123456789012要替换成你自己的账号ID。预算只是一个告警机制能在费用接近阈值时通知你但不能完全阻止超支。10.2 场景二云资源持续计费很多同学问“Auto Scaling Group的Desired设为0以后还会扣费吗”这是一个非常典型的问题。答案是实例可能不再产生费用但相关资源仍然可能扣费。具体来说ASG的Desired设为0后EC2实例会被终止或停止。终止后实例小时费用不再产生但以下资源依然存在EBS卷即使实例终止卷如果没有删除会持续计费。快照EBS快照按存储容量计费。弹性IP如果绑定到了不存在的实例或保留未释放可能有费用。负载均衡器ALB/NLB本身按小时计费。NAT网关按小时和流量计费而且价格不低。CloudWatch日志日志存储超出免费额度后收费。所以在排查费用时不要只看EC2实例列表要去Cost Explorer里按服务维度逐项查看。11. Agent开发的技能边界与工程建议Claude Code的流行本质上是Agent开发进入了一个可落地阶段。你可以把它理解成一个“能读代码、能执行命令、能修改文件”的智能体。Agent开发的核心不再是“让AI生成一段文字”而是设计一套“工具边界验证”的闭环。当你自己开发Agent时有几个经验值得参考。11.1 给Agent划定工具边界Agent能调用什么工具决定了它的破坏力上限。仓库扫描、依赖安装、文件删除、数据库操作这些工具不是不能给而是要分级本地开发环境可以放开读写权限。测试环境可以给测试数据库的读写权限。生产环境默认只读需要人工审批后才可写。11.2 工作区隔离不要让Agent直接在你的主项目目录或者生产服务器上随便操作。推荐把它放在一个隔离的工作区比如一个Git分支或一个Docker容器中。Claude Code运行过程中会创建和修改文件如果代码没有被版本管理出了问题就很难回滚。11.3 代码审查不能省略AI生成的代码再流畅也要人工审查后再合并。Claude Code擅长快速完成任务但它对一个大型系统的历史背景、兼容性要求、团队规范并不了解。把Agent当“结对程序员”可以当“免检程序员”不行。11.4 不同技术栈的接入思路如果你在Java项目里使用LangChain4j之类的AI框架或者用Python的FastAPI搭服务Claude的接入思路是一样的先封装一个模型调用模块对外提供统一接口再在业务层调用。不要让业务代码到处直接依赖SDK否则切换模型或调整参数时会非常痛苦。12. 总结与后续学习方向从开发到落地核心路径可以归纳为四步选型、授权、实现、观测。选型解决“用哪个接入方式”授权解决“谁能用、能用什么”实现解决“服务怎么跑起来”观测解决“跑起来之后我怎么知道它正常、省钱、安全”。你可以在下一周按这个顺序动手实践用FastAPI写一个最小的Claude服务不需要加复杂功能先跑通。配置IAM用户和最小权限策略把密钥从代码里挪到环境变量。在AWS上申请一台开发机装上Claude Code用它完成一个小任务。打开Cost Explorer和Budgets确认你清楚地知道每一项费用来自哪里。完成这四步你就不只是在“用过Claude”而是真正把Claude放在了可控的工程化轨道上。如果继续深入下一阶段值得研究的话题是Agent在执行任务时的工具调用协议、多模型混合接入的网关设计、通过CloudWatch构建模型调用的可观测体系。这些内容比“跑通一个接口”更接近生产环境也更能体现工程价值。