Claude Code × Amazon Bedrock 完整指南 | 在AWS上将Claude投入生产环境
使用Claude Code充分利用Amazon Bedrock的完整指南。从IAM认证、流式传输、Lambda集成、RAG实现到成本优化——基于Masa的实际生产实施经验。
“想在生产服务中使用Claude API,但担心API密钥管理问题”或”内部安全要求不允许数据离开AWS”——面对这些困境的工程师,Amazon Bedrock是最佳解决方案。
我在工作中将AI集成到ECS上的API服务器时,最初直接使用Anthropic的API。然而安全审查指出”外部服务API密钥管理存在问题”。切换到Bedrock后,仅通过IAM角色即可完成认证,从此告别了API密钥管理的烦恼。本文将从使用Claude Code实现Bedrock到生产运营全程进行详解。
Amazon Bedrock是什么?
Amazon Bedrock是AWS的托管AI模型服务。可通过统一的API调用多种模型——包括Claude (Anthropic)、Llama (Meta)、Titan (Amazon)等。
为什么使用Bedrock?
| 维度 | Anthropic API | Amazon Bedrock |
|---|---|---|
| 认证 | API密钥 | AWS IAM角色 |
| 计费 | 直接向Anthropic | 集成到AWS账单 |
| VPC支持 | 无 | 通过PrivateLink完全隔离 |
| 数据存储 | Anthropic的策略 | AWS的策略 |
| 合规认证 | SOC2等 | SOC2 / ISO27001 / HIPAA等 |
个人开发用Anthropic API很方便,但在企业、金融、医疗等领域,选择Bedrock的情况越来越多。
Step 1: 初始设置
申请模型访问权限
首先在AWS控制台申请访问Claude模型。
# 查看可用模型列表
aws bedrock list-foundation-models \
--by-provider anthropic \
--region us-east-1 \
--query 'modelSummaries[].{id:modelId, name:modelName}'
# 输出示例
[
{"id": "anthropic.claude-opus-4-5", "name": "Claude Opus 4.5"},
{"id": "anthropic.claude-sonnet-4-6", "name": "Claude Sonnet 4.6"},
{"id": "anthropic.claude-haiku-4-5-20251001", "name": "Claude Haiku 4.5"}
]
重要提示:主要可用Region为us-east-1(弗吉尼亚)和us-west-2(俄勒冈)。东京Region可通过Cross-region inference(跨区域推理)使用。
安装SDK
npm install @anthropic-ai/sdk @aws-sdk/client-bedrock-runtime
Step 2: 基本实现
使用Anthropic SDK内置的Bedrock支持(推荐)
官方Anthropic SDK内置了Bedrock支持。由于写法与普通Anthropic API几乎相同,从现有代码迁移的成本最小。
// src/lib/bedrock-client.ts
import Anthropic from "@anthropic-ai/sdk";
// 使用IAM角色(如Lambda/ECS)时无需凭证
const bedrock = new Anthropic.AnthropicBedrock({
awsRegion: process.env.AWS_REGION ?? "us-east-1",
// 本地开发时自动使用AWS CLI配置文件
});
export async function generateText(
prompt: string,
options: { model?: string; maxTokens?: number } = {}
): Promise<string> {
const { model = "anthropic.claude-sonnet-4-6", maxTokens = 1024 } = options;
const response = await bedrock.messages.create({
model,
max_tokens: maxTokens,
messages: [{ role: "user", content: prompt }],
});
return response.content[0].type === "text" ? response.content[0].text : "";
}
Bedrock的模型ID与Anthropic API不同:
Anthropic API: claude-sonnet-4-6
Bedrock: anthropic.claude-sonnet-4-6 (添加了前缀)
流式传输支持
长响应必须使用流式传输。
// src/lib/bedrock-stream.ts
export async function* streamText(
prompt: string,
model = "anthropic.claude-sonnet-4-6"
): AsyncGenerator<string> {
const stream = await bedrock.messages.stream({
model,
max_tokens: 4096,
messages: [{ role: "user", content: prompt }],
});
for await (const chunk of stream) {
if (
chunk.type === "content_block_delta" &&
chunk.delta.type === "text_delta"
) {
yield chunk.delta.text;
}
}
}
// 使用示例(Next.js App Router的情况)
export async function POST(req: Request) {
const { prompt } = await req.json();
const encoder = new TextEncoder();
const stream = new ReadableStream({
async start(controller) {
for await (const text of streamText(prompt)) {
controller.enqueue(encoder.encode(text));
}
controller.close();
},
});
return new Response(stream, {
headers: { "Content-Type": "text/event-stream" },
});
}
Step 3: Lambda + Bedrock模式
提供Serverless AI功能最常用的架构。
claude -p "
在src/lambda/ai-handler.ts中实现以下Lambda函数:
- 从event中获取prompt和maxTokens
- 调用Bedrock (claude-sonnet-4-6)并返回结果
- 错误处理分支:ThrottlingException(重试)和ValidationException(400)
- 记录执行时间到日志
- 在容器外初始化客户端(冷启动优化)
"
// src/lambda/ai-handler.ts
import { Handler, APIGatewayProxyEvent, APIGatewayProxyResult } from "aws-lambda";
import Anthropic from "@anthropic-ai/sdk";
// 在模块作用域初始化(容器复用时被缓存)
const bedrock = new Anthropic.AnthropicBedrock({
awsRegion: process.env.AWS_REGION,
});
export const handler: Handler<APIGatewayProxyEvent, APIGatewayProxyResult> = async (event) => {
const startTime = Date.now();
try {
const { prompt, maxTokens = 512 } = JSON.parse(event.body ?? "{}");
if (!prompt) {
return { statusCode: 400, body: JSON.stringify({ error: "prompt is required" }) };
}
const response = await bedrock.messages.create({
model: "anthropic.claude-sonnet-4-6",
max_tokens: maxTokens,
messages: [{ role: "user", content: prompt }],
});
const duration = Date.now() - startTime;
console.log(JSON.stringify({
level: "INFO",
duration_ms: duration,
input_tokens: response.usage.input_tokens,
output_tokens: response.usage.output_tokens,
}));
return {
statusCode: 200,
body: JSON.stringify({
text: response.content[0].type === "text" ? response.content[0].text : "",
usage: response.usage,
}),
};
} catch (error: any) {
if (error.name === "ThrottlingException") {
console.warn("Rate limited by Bedrock, client should retry");
return { statusCode: 429, body: JSON.stringify({ error: "Rate limited, please retry" }) };
}
console.error("Bedrock error:", error);
return { statusCode: 500, body: JSON.stringify({ error: "AI generation failed" }) };
}
};
Lambda的IAM策略
// 使用CDK进行IAM配置
import * as iam from "aws-cdk-lib/aws-iam";
lambdaFunction.addToRolePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
],
resources: [
`arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6`,
`arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-haiku-4-5-20251001`,
],
}));
Step 4: RAG(检索增强生成)实现
让Claude读取内部文档或产品信息进行回答的模式。
claude -p "
使用Bedrock Knowledge Base实现RAG系统。
架构:
- 将文档存储在S3
- 使用Bedrock Knowledge Base进行向量索引
- 根据用户问题检索文档
- 用Claude Sonnet生成回答
使用TypeScript + AWS SDK v3实现。
Knowledge Base ID从环境变量KNOWLEDGE_BASE_ID获取。
"
// src/lib/rag.ts
import {
BedrockAgentRuntimeClient,
RetrieveAndGenerateCommand,
} from "@aws-sdk/client-bedrock-agent-runtime";
const agentClient = new BedrockAgentRuntimeClient({ region: "us-east-1" });
export async function ragQuery(question: string): Promise<{
answer: string;
citations: string[];
}> {
const response = await agentClient.send(
new RetrieveAndGenerateCommand({
input: { text: question },
retrieveAndGenerateConfiguration: {
type: "KNOWLEDGE_BASE",
knowledgeBaseConfiguration: {
knowledgeBaseId: process.env.KNOWLEDGE_BASE_ID!,
modelArn: `arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6`,
retrievalConfiguration: {
vectorSearchConfiguration: { numberOfResults: 5 },
},
},
},
})
);
const answer = response.output?.text ?? "";
const citations = (response.citations ?? [])
.flatMap((c) => c.retrievedReferences ?? [])
.map((r) => r.location?.s3Location?.uri ?? "")
.filter(Boolean);
return { answer, citations };
}
Step 5: 成本优化
// 模型选择工具函数
type TaskType = "classify" | "extract" | "summarize" | "generate" | "complex";
const MODEL_MAP: Record<TaskType, string> = {
classify: "anthropic.claude-haiku-4-5-20251001", // $0.80/1M输入token
extract: "anthropic.claude-haiku-4-5-20251001",
summarize: "anthropic.claude-sonnet-4-6", // $3.00/1M输入token
generate: "anthropic.claude-sonnet-4-6",
complex: "anthropic.claude-opus-4-5", // $15.00/1M输入token
};
export function selectModel(task: TaskType): string {
return MODEL_MAP[task];
}
通过Prompt缓存降低输入成本
// Bedrock中也可以使用Prompt缓存
const response = await bedrock.messages.create({
model: "anthropic.claude-sonnet-4-6",
max_tokens: 1024,
system: [
{
type: "text",
text: longSystemPrompt,
cache_control: { type: "ephemeral" }, // 缓存5分钟
},
],
messages: [{ role: "user", content: userQuery }],
});
5个常见陷阱
1. Region不支持
Claude on Bedrock并非在所有Region均可使用。截至2026年,us-east-1和us-west-2是主力Region。从东京使用时,需启用Cross-region inference(跨区域推理)。
// 使用跨区域推理的模型ARN
const crossRegionModelArn =
"arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-sonnet-4-6";
2. 忘记申请模型访问权限
在Bedrock中,每个想要使用的模型都需要申请”Model access”。未申请直接调用会报AccessDeniedException错误。在使用Claude Code编码前务必先申请。
3. Lambda超时时间过短
Claude的响应可能需要1030秒。Lambda默认的3秒必然超时。**最少设置30秒,长内容生成则设置60300秒**。
4. 将Bedrock的模型ID与Anthropic API的ID混淆
❌ 直接使用Anthropic API的ID:"claude-sonnet-4-6"
✅ Bedrock的ID:"anthropic.claude-sonnet-4-6"
5. 未考虑Cross-region inference的延迟
从东京调用us-east-1的模型会增加约100~200ms的往返网络延迟。对实时性要求较高的应用,请使用流式传输来减轻感知延迟。
总结
| 任务 | Claude Code的贡献 |
|---|---|
| 基本实现 | 生成AnthropicBedrock客户端和函数 |
| Lambda集成 | 一键生成Handler和IAM策略 |
| RAG实现 | 自动生成Knowledge Base集成代码 |
| 成本优化 | 根据任务类型设计模型选择逻辑 |
| 故障排查 | 从错误日志中找出原因并提供修复方案 |
用Claude Code开发,用Bedrock进行生产运营——这个组合同时满足安全性、成本和可扩展性的所有要求。先从Bedrock免费试用开始,正式投入生产时只需配置IAM角色即可完成迁移。
相关文章
参考资料
免费 PDF:5 分钟看懂 Claude Code 速查表
只需留下邮箱,我们就会立即把这份 A4 一页速查表 PDF 发送给你。
我们会严格保护你的个人信息,绝不发送垃圾邮件。
本文作者
Masa
深度使用 Claude Code 的工程师。运营 claudecode-lab.com——一个涵盖 10 种语言、超过 2,000 页内容的科技媒体。
相关文章
Claude Code × AWS CodePipeline/CodeBuild 完全指南 | 自动构建CI/CD流水线
使用Claude Code通过AWS CodePipeline和CodeBuild自动构建CI/CD。包含流水线设计、buildspec.yml生成、测试自动化、CDK基础设施定义的实战代码解说。
Claude Code × AWS CloudWatch 完整指南 | 日志分析·告警设置·仪表盘自动构建
用 Claude Code 提升 AWS CloudWatch 效率。包含日志模式分析、自动告警配置、指标仪表盘构建及故障排查的实战代码解析。
Claude Code × AWS ECS/Fargate 完整指南 | 自动化容器部署
使用Claude Code自动化AWS ECS/Fargate部署。从任务定义、服务配置到Blue/Green部署和CDK基础设施构建——基于Masa的实际工作经验。