跳到主要内容

代理 Amazon Bedrock 请求

Amazon Bedrock 是一项托管服务,通过一组通用 API 提供对基础模型的访问能力。

本指南展示如何使用 ai-proxy 插件,从 APISIX 直接向 Amazon Bedrock Converse API 发送请求。APISIX 根据已配置的 AWS 区域和模型 ID 构造 Bedrock 端点,并使用 AWS Signature Version 4(SigV4)对每个请求进行签名。

前置条件

  • 安装 Docker
  • 安装 cURL 以发送验证请求。
  • 按照快速入门教程,在 Docker 或 Kubernetes 中启动 APISIX 实例。
  • 如果已启用 Admin API 密钥身份认证,请将有效密钥导出为 ADMIN_API_KEY
  • 拥有 AWS 账户,并具备调用所选 Amazon Bedrock 模型的权限。
  • 为具有所需权限的 IAM 角色获取临时 AWS 凭证

选择模型并配置权限

本指南使用雪梨区域的 Amazon Nova Micro 模型。

在 Amazon Bedrock 模型目录中,选择模型并记录其模型 ID:

Amazon Bedrock 模型目录中的 Amazon Nova Micro 模型详细信息

导出区域和模型 ID:

export AWS_REGION=ap-southeast-2
export BEDROCK_MODEL_ID=amazon.nova-micro-v1:0

APISIX 将 BEDROCK_MODEL_ID 作为 Converse API 的 modelId 传递给 Bedrock。你可以使用基础模型 ID 或 ARN,也可以使用推理配置文件 ID 或 ARN。如果使用推理配置文件,请更新 IAM 策略资源,包括该配置文件及其路由到的模型。

当调用者具有所需权限时,Amazon Bedrock 默认启用模型访问。某些第三方模型还有 AWS Marketplace 或服务提供方准入要求。本文使用的 Amazon Nova 模型不需要这类第三方准入流程。

授予 IAM 角色调用所选模型的权限:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:ap-southeast-2::foundation-model/amazon.nova-micro-v1:0"
}
]
}

❶ 允许 Converse 请求。

❷ 允许 ConverseStream 请求。

❸ 将访问限制为所选模型。如果使用推理配置文件,请同时包含该配置文件及其路由到的模型。

导出该角色的临时凭证:

export AWS_ACCESS_KEY_ID="<your-access-key-id>"
export AWS_SECRET_ACCESS_KEY="<your-secret-access-key>"
export AWS_SESSION_TOKEN="<your-session-token>"

临时凭证会过期。对于长期运行的部署,请自动轮换凭证,并在凭证过期前更新 APISIX 路由。

创建到 Amazon Bedrock 的路由

创建路由并配置 ai-proxy 插件:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
--data-binary @- <<EOF
{
"id": "bedrock-converse",
"uri": "/bedrock/converse",
"methods": ["POST"],
"plugins": {
"ai-proxy": {
"provider": "bedrock",
"auth": {
"aws": {
"access_key_id": "${AWS_ACCESS_KEY_ID}",
"secret_access_key": "${AWS_SECRET_ACCESS_KEY}",
"session_token": "${AWS_SESSION_TOKEN}"
}
},
"provider_conf": {
"region": "${AWS_REGION}"
},
"options": {
"model": "${BEDROCK_MODEL_ID}"
},
"timeout": 60000
}
}
}
EOF

❶ 将服务提供方设置为 bedrock

❷ 配置临时 AWS 凭证。使用临时凭证时必须提供会话令牌。

❸ 设置用于构造 Bedrock Runtime 端点和对请求签名的 AWS 区域。

❹ 设置 Bedrock 模型 ID。已配置的模型优先于请求体中提供的模型。

❺ 允许 Bedrock 在 60 秒内返回响应。

路由配置中包含 AWS 凭证。启用使用密钥环进行数据加密后,APISIX 会在将路由保存到 etcd 之前对访问密钥和会话令牌进行加密。在生产环境中请配置自定义密钥环。

验证路由

发送 Converse 和 ConverseStream 请求以验证路由。

发送 Converse 请求

以 Bedrock Converse 格式发送请求。路由 URI 必须以 /converse 结尾,以便 APISIX 识别请求协议:

curl -i "http://127.0.0.1:9080/bedrock/converse" -X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"role": "user",
"content": [
{
"text": "Explain what an API gateway does in one sentence."
}
]
}
],
"inferenceConfig": {
"maxTokens": 128,
"temperature": 0
}
}'

你应该收到 Bedrock Converse 响应格式的 HTTP 200 响应。生成的文本位于 output.message.content 下,具体内容可能因请求而异:

{
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "An API gateway provides a single entry point for routing, securing, and managing requests to backend services."
}
]
}
},
"stopReason": "end_turn",
"usage": {
"inputTokens": 12,
"outputTokens": 21,
"totalTokens": 33
}
}

发送 ConverseStream 请求

发送 ConverseStream 请求:

curl -sS "http://127.0.0.1:9080/bedrock/converse" -X POST \
-H "Content-Type: application/json" \
-d '{
"stream": true,
"messages": [
{
"role": "user",
"content": [
{
"text": "Respond with a short greeting."
}
]
}
]
}' \
--dump-header /tmp/bedrock-stream-headers \
--output /tmp/bedrock-stream-response

APISIX 使用高亮字段选择 Bedrock ConverseStream 端点,并在转发请求前将其移除,因为 Bedrock 通过端点路径选择流式传输。

响应应不为空,并使用 AWS EventStream 内容类型:

grep -i "content-type: application/vnd.amazon.eventstream" /tmp/bedrock-stream-headers
test -s /tmp/bedrock-stream-response && echo "Received a streaming response"

AWS EventStream 使用二进制帧。当应用需要解码各个流式事件时,请使用兼容 EventStream 的客户端。

删除临时响应文件:

rm /tmp/bedrock-stream-headers /tmp/bedrock-stream-response

清理资源

不再需要该路由时,请将其从 APISIX 中删除,以从路由配置中移除临时 AWS 凭证:

curl "http://127.0.0.1:9180/apisix/admin/routes/bedrock-converse" -X DELETE \
-H "X-API-KEY: ${ADMIN_API_KEY}"

从 shell 中移除临时凭证:

unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

如果使用了 ADC,请从 adc.yaml 中移除 AWS 凭证,或按照组织的密钥处理策略保护该文件。

后续步骤

你已配置 APISIX 完成身份认证,并将 Converse 和 ConverseStream 请求直接发送到 Amazon Bedrock。

你可以添加限流以控制模型请求量。