跳到主要内容

代理 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) 并选择你想用于集成的用户帐户:

选择 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 页面:

配置 Lambda 函数权限

单击 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:

创建函数 URL

配置 APISIX

在 APISIX 中创建一个路由并配置 aws-lambda 插件:

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 区域。

❺ 设置为接收请求的服务。

❻ 配置超时(以毫秒为单位)。

验证

向路由发送一个带有请求体中 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)。

此外,你还可以集成 APISIX 提供的更多功能,例如 限流限速缓存,以规范 API 使用并改善用户体验。