代理 Amazon Bedrock 请求
Amazon Bedrock 是一项完全托管的服务,提供来自 Anthropic、AI21 Labs、Cohere、Meta、Mistral AI、Stability AI 和 Amazon 等领先 AI 公司的各种高性能 基础模型 (FM)。这些模型通过 Bedrock 以单一 API 提供,使组织能够轻松构建尖端的 AI 解决方案。
本指南将引导你完成将 APISIX 与 Amazon Bedrock 集成的过程。你将在 AWS 上设置一个 Lambda 函数 以与 Bedrock 上的 Claude 3 Opus 模型 进行交互,配置必要的身份和访问管理 (IAM) 权限,并使用 aws-lambda 插件(实施 AWS 签名版本 4)创建一个到函数 URL 的 APISIX 路由。

前置条件
- 拥有一个 AWS 帐户并以 IAM 用户身份登录。
- 安装 Docker。
- 安装 cURL 以向服务发送请求进行验证。
- 按照 快速入门教程 在 Docker 或 Kubernetes 中启动一个新的 APISIX 实例。
选择基础模型 (FM)
登录你的 AWS 控制台,转到 Amazon Bedrock 服务,并请求访问你想集成的一个或多个模型:

以下文档将使用 Anthropic Claude 3 Opus 模型作为示例。请注意,并非所有模型都在所有区域可用。撰写本文时,Anthropic Claude 3 Opus 仅在 us-west-2 可用。请 参阅 模型区域 以供参考,并根据需要调整你的 AWS 帐户区域。
创建 IAM 访问密钥
转到 AWS Identity and Access Management (IAM) 并选择你想用于集成的用户帐户:

在 security credentials 选项卡中,选择 create access key:

选择 application running outside AWS 作为用例:

继续创建凭证并记下访问密钥和秘密访问密钥:

创建 Lambda 函数
转到 AWS Lambda 并创建一个使用 Node.js 运行时的新函数。你也可以选择其他运行时并编写自己的代码。
开发函数代码
将以下代码粘贴到 Lambda 函数中:
import { BedrockRuntimeClient, InvokeModelCommand } from "@aws-sdk/client-bedrock-runtime";
// 替换为你的模型信息
const aws_region = "us-west-2";
const model_id = "anthropic.claude-3-opus-20240229-v1:0"
const anthropic_version = "bedrock-2023-05-31"
// 在所选区域创建 bedrock 客户端
const bedrockClient = new BedrockRuntimeClient({ region: aws_region });
export const handler = async (event) => {
// 从请求体中的 model_input 获取模型提示词
const requestBody = JSON.parse(event.body);
const model_input = requestBody.model_input;
// 组装模型参数
const params = {
modelId: model_id,
contentType: "application/json",
accept: "application/json",
body: JSON.stringify({
anthropic_version: anthropic_version,
max_tokens: 2048,
messages: [{
role: "user",
content: `${model_input}`
}]
})
}
// 尝试向 bedrock 发送请求
const cmd = new InvokeModelCommand(params);
try {
const resp = await bedrockClient.send(cmd);
const textDecoder = new TextDecoder("utf-8");
const resp_body = JSON.parse(textDecoder.decode(resp.body));
return resp_body.content[0].text;
} catch (err) {
console.error("调用 Bedrock 时出错:", err);
throw err;
}
};
此函数接受来自请求体中用户输入 model_input 的模型 prompt。
配置函数权限
在此步骤中,你将向 Lambda 函数附加所需的权限,以便它可以调用 Bedrock 模型。
转到 Lambda 函数的 Configuration 选项卡,然后在 Permissions 下,单击角色名称以打开函数的 IAM 页面:

单击 Add permissions 下拉菜单并选择 Create incline policy:

将以下策略添加到 policy editor 并保存:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel"
],
"Resource": "*"
}
]
}
这允许 Lambda 函数仅调用 Bedrock 模型,而无需提供全部权限。
调整函数超时
默认情况下,Lambda 函数在 3 秒后超时,这有时不足以让模型处理用户请求并响应。
要增加超时值,请转到 Lambda 函数的 Configuration 选项卡,然后在 General configuration 下,将超时编辑为更大的值,例如 30 秒:

创建函数 URL
要与 Lambda 函数集成,该函数应具有公共 URL。转到 Lambda 函数的 Configuration 选项卡,然后在 Function URL 下,创建一个函数 URL:

配置 APISIX
在 APISIX 中创建一个路由并配置 aws-lambda 插件:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
"id": "aws-bedrock",
"uri": "/bedrock-claude",
"plugins": {
"aws-lambda": {
// Annotate 1
"function_uri": "https://jbihqn4bfwewf4nfrz6typjmcvjh40iuamw.lambda-url.us-west-2.on.aws/",
"authorization": {
"iam": {
// Annotate 2
"accesskey": "AKIARK7HKSJVWCOIIMW6",
// Annotate 3
"secretkey": "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",
// Annotate 4
"aws_region": "us-west-2",
// Annotate 5
"service": "lambda"
}
},
// Annotate 6
"timeout": 30000,
"ssl_verify": false
}
}
}'
❶ 替换为你的 Lambda 函数 URL。
❷ 替换为你的 IAM 访问密钥。
❸ 替换为你的 IAM 秘密访问密钥。
❹ 设置为你的 Lambda 函数的 AWS 区域。
❺ 设置为接收请求的服务。
❻ 配置超时(以毫秒为单位)。
services:
- name: Amazon Bedrock Service
routes:
- uris:
- /bedrock-claude
name: bedrock-claude
plugins:
aws-lambda:
// Annotate 1
function_uri: 'https://jbihqn4bfwewf4nfrz6typjmcvjh40iuamw.lambda-url.us-west-2.on.aws/'
authorization:
iam:
// Annotate 2
accesskey: AKIARK7HKSJVWCOIIMW6
// Annotate 3
secretkey: 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
// Annotate 4
aws_region: us-west-2
// Annotate 5
service: lambda
// Annotate 6
timeout: 30000
ssl_verify: false
❶ 替换为你的 Lambda 函数 URL。
❷ 替换为你的 IAM 访问密钥。
❸ 替换为你的 IAM 秘密访问密钥。
❹ 设置为你的 Lambda 函数的 AWS 区域。
❺ 设置为接收请求的服务。
❻ 配置超时(以毫秒为单位)。
将配置同步到 APISIX:
adc sync -f adc.yaml
创建一个 Kubernetes 清单文件以配置路由:
- Gateway API
- APISIX CRD
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: ingress-apisix
name: aws-plugin-config
spec:
plugins:
- name: aws-lambda
config:
// Annotate 1
function_uri: https://jbihqn4bfwewf4nfrz6typjmcvjh40iuamw.lambda-url.us-west-2.on.aws/
authorization:
iam:
// Annotate 2
accesskey: AKIARK7HKSJVWCOIIMW6
// Annotate 3
secretkey: 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
// Annotate 4
aws_region: us-west-2
// Annotate 5
service: lambda
// Annotate 6
timeout: 30000
ssl_verify: false
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: ingress-apisix
name: bedrock-claude
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /bedrock-claude
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: aws-plugin-config
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: ingress-apisix
name: bedrock-claude
spec:
ingressClassName: apisix
http:
- name: bedrock-claude
match:
paths:
- /bedrock-claude
upstreams:
- name: amazon-bedrock-upstream
plugins:
- name: aws-lambda
enable: true
config:
// Annotate 1
function_uri: https://jbihqn4bfwewf4nfrz6typjmcvjh40iuamw.lambda-url.us-west-2.on.aws/
authorization:
iam:
// Annotate 2
accesskey: AKIARK7HKSJVWCOIIMW6
// Annotate 3
secretkey: 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
// Annotate 4
aws_region: us-west-2
// Annotate 5
service: lambda
// Annotate 6
timeout: 30000
ssl_verify: false
❶ 替换为你的 Lambda 函数 URL。
❷ 替换为你的 IAM 访问密钥。
❸ 替换为你的 IAM 秘密访问密钥。
❹ 设置为你的 Lambda 函数的 AWS 区域。
❺ 设置为接收请求的服务。
❻ 配置超时(以毫秒为单位)。
将配置应用到你的集群:
kubectl apply -f bedrock-claude-route.yaml
验证
向路由发送一个带有请求体中 prompt 的请求:
curl -i "http://127.0.0.1:9080/bedrock-claude" -X POST \
-H "Content-Type: application/json" \
-d '{"model_input": "Write a 50 word introduction of Frida Khalo"}'
你应该收到 HTTP/1.1 200 OK 响应以及模型输出:
Frida Kahlo (1907-1954) was a Mexican artist known for her striking self-portraits and vivid expressions of pain, resilience, and identity. Despite facing numerous challenges, including a devastating bus accident and a turbulent marriage to fellow artist Diego Rivera, Kahlo's unique style and powerful imagery have made her an iconic figure in art history.
下一步
你现在已经学会了如何将 APISIX 与 Amazon Bedrock FM 集成。
如果你想代理来自 Amazon Bedrock 的流式响应,你可以使用 proxy-buffering 插件来禁用 NGINX 的 proxy_buffering 指令,以避免缓冲服务器发送事件 (SSE)。