AWS Bedrock
Amazon Bedrock 是一项 AWS 服务,可通过托管 API 访问 Amazon 及其他服务提供方的基础模型。AISIX 为应用提供统一的 OpenAI 兼容接口,用于访问由 Bedrock 托管的 Claude、Llama、Mistral、Amazon Nova、Cohere 等模型。
此配置适用于需要使用 AISIX 身份验证、模型允许列表、限流和用量核算的 Bedrock 托管模型。AISIX 使用 AWS SigV4 对出站 Bedrock 调用进行签名 ,或以 Bearer Token 发送 Bedrock API Key,参见选择凭证模式。
准备工作
开始前,请准备以下内容:
- 一套 AISIX 环境:
- 对于 AISIX Enterprise 或 AISIX Cloud,需要一个已关联网关的环境和具有写入作用域的 Admin Token。使用 AISIX Enterprise 时,请按照 AISIX Enterprise 快速入门操作。如需申请 AISIX Cloud 访问权限,请联系 API7。
- 对于开源 AISIX 网关,请准备本地 AISIX 安装,或使用开源 AISIX 网关快速入门中的 Docker 环境。配置网关以加载声明式资源文件。
- 对目标模型具有
bedrock:InvokeModel权限的 AWS 凭证:Access Key ID 和 Secret Access Key(使用临时凭证时另加 STS Session Token),或其他凭证模式之一。 - 对于跨区域推理,需要对推理配置文件 ARN、源区域以及每个目标区域中的基础模型 ARN 拥有
bedrock:InvokeModel权限。具体要求参见 AWS 的地理区域和全球推理配置文件说明。 - 对所选区域中目标 Bedrock 模型的访 问权限,以及该模型的模型 ID 或推理配置文件 ID。
curl和jq。
使用 AISIX Enterprise 或 AISIX Cloud 配置
导出控制面连接信息:
# AISIX_CP 是 Admin API 基础 URL;应包含 /api,且不含尾部斜杠
# 本地 AISIX Enterprise 快速入门使用 http://localhost:8080/api
export AISIX_CP="YOUR_AISIX_CONTROL_PLANE_API_URL"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export ENV_ID="YOUR_ENVIRONMENT_ID"
使用 Bedrock 目录服务提供方和结构化 config 凭证创建服务提供方密钥:
PROVIDER_KEY_ID=$(curl -sS -X POST "$AISIX_CP/provider_keys" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"display_name": "bedrock-prod",
"provider": "amazon-bedrock",
"config": {
"access_key_id": "YOUR_AWS_ACCESS_KEY_ID",
"secret_access_key": "YOUR_AWS_SECRET_ACCESS_KEY",
"region": "us-west-2"
},
"allowed_environments": ["'"$ENV_ID"'"]
}' | jq -r '.provider_key.id')
凭证放在 config 中,因此请求省略 api_key。使用临时 STS 凭证时,在 config 中添加 session_token。如需以其他方式认证,在 config 中添加 auth_type,参见选择凭证模式。
api_base 是可选的。未设置时,控制面会保存凭证中 region 对应的运行时端点(本例为 https://bedrock-runtime.us-west-2.amazonaws.com,中国区域为 .amazonaws.com.cn),并像显式设置的值一样返回。使用私有 Bedrock 端点时请设置 api_base。region 不是合法的 AWS 区域名称,或属于隔离分区时,必须显式设置 api_base。之后将凭证替换为另一个区域的凭证时,由控制面推导出的端点会随之切换到新区域。
在控制台中,服务提供方密钥表单的认证方式字段用于选择凭证模式,并显示该模式需要的字段。
为 Claude Sonnet 5 创建别名。该模型不支持在 us-west-2 区域内推理,因此示例使用其美国地理区域推理配置文件:
MODEL_ID=$(curl -sS -X POST "$AISIX_CP/environments/$ENV_ID/models" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"display_name": "claude-bedrock",
"model_name": "us.anthropic.claude-sonnet-5",
"provider_key_id": "'"${PROVIDER_KEY_ID}"'"
}' | jq -r '.model.id')
创建可访问该模型的调用方 API Key:
BEDROCK_CALLER_KEY=$(curl -sS -X POST "$AISIX_CP/environments/$ENV_ID/api_keys" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"display_name": "bedrock-caller",
"allowed_models": ["'"${MODEL_ID}"'"]
}' | jq -r '.plaintext')
使用开源 AISIX 网关配置
导出 AWS 凭证,并选择应用将发送给 AISIX 的调用方 API Key:
# 请替换为实际值
export BEDROCK_CREDENTIALS='{"access_key_id":"YOUR_AWS_ACCESS_KEY_ID","secret_access_key":"YOUR_AWS_SECRET_ACCESS_KEY","region":"us-west-2"}'
export BEDROCK_CALLER_KEY="YOUR_CALLER_API_KEY"
对于新网关,请使用此完整资源文件。对于现有网关,请将这些条目合并到其当前文件中,并保留其他资源。
_format_version: "1"
provider_keys:
- display_name: bedrock-prod
provider: amazon-bedrock
adapter: bedrock
api_key: ${BEDROCK_CREDENTIALS}
models:
- display_name: claude-bedrock
provider: amazon-bedrock
model_name: us.anthropic.claude-sonnet-5
provider_key: bedrock-prod
api_keys:
- display_name: bedrock-caller
key_env: BEDROCK_CALLER_KEY
allowed_models: ["claude-bedrock"]
❶ provider 用于标记上游。
❷ adapter 选择 Bedrock。
❸ api_key 是包含 access_key_id、secret_access_key 和 region 的 JSON 字符串。其他凭证模式使用同样的 JSON 字符串,只是字段不同。Bedrock 端点按区域确定,例如 bedrock-runtime.us-west-2.amazonaws.com,因此区域为必填项。对于标准 AWS,应不设置 api_base;如果使用私有 Bedrock 端点,则将其设置为该端点。
❹ model_name 是 Bedrock 模型 ID 或完整的推理配置文件 ID。示例中的 us. 配置文件可从 us-west-2 使用,并将推理限制在美国和加拿大境内。
❺ provider_key 通过服务提供方密钥的 display_name 将模型关联到凭证。模型的 provider 使用与服务提供方密钥相同的上游标签。
要在示例文件中使用 Meta Llama,请替换 claude-bedrock 模型条目,并更新 bedrock-caller 以允许新别名。保留 bedrock-prod 和其他资源不变:
models:
- display_name: llama-bedrock
provider: amazon-bedrock
model_name: us.meta.llama3-3-70b-instruct-v1:0
provider_key: bedrock-prod
api_keys:
- display_name: bedrock-caller
key_env: BEDROCK_CALLER_KEY
allowed_models: ["llama-bedrock"]
对于 Amazon Nova,请使用 Bedrock 模型或推理配置文件 ID,例如从 us-west-2 使用的 Nova 2 Lite 配置文件 us.amazon.nova-2-lite-v1:0。与 Claude 和 Llama 示例一样,us. 前缀选择美国地理区域推理配置文件。网关会从 BEDROCK_CALLER_KEY 读取明文调用方 Key,并且只存储其哈希。
下面的验证使用 claude-bedrock。如果应用了 Meta Llama 配置块,请改为发送 llama-bedrock,并预期响应中出现该别名。
使用临时 STS 凭证时,请在凭证 JSON 中包含 session_token;使用长期静态密钥时则省略该字段。服务提供方密钥 Secret 遵循服务提供方密钥中说明的凭证处理方式。
验证并加载配置
如果 AISIX 安装在本地,请在加载前验证完整文件:
aisix validate --resources resources.yaml
验证后,在网关进程环境中提供文件引用的环境变量,再启动网关。仅当这些变量已经可供进程使用时,才重新加载现有网关;否则,请使用更新后的环境重启网关。
如果使用 Docker,请调整开源 AISIX 网关快速入门中的验证和启动命令。挂载此 resources.yaml 文件,并在两条命令中使用 -e 传入它引用的每个环境变量。
选择凭证模式
Bedrock 凭证是一个 JSON 对象:在 AISIX Cloud Admin API 中是 config,在资源文件中是 api_key 里的 JSON 字符串。其中 auth_type 决定 AISIX 如何向 Bedrock 认证,region 在所有模式下都必填:
auth_type | 字段 | 认证方式 |
|---|---|---|
access_key(省略时的默认值) | access_key_id 和 secret_access_key,使用临时凭证时另加 session_token | 使用这组密钥进行 SigV4 签名。 |
api_key | api_key,即 Bedrock API Key | 以 Authorization: Bearer 发送,不做 SigV4 签名。 |
default_chain | 不带凭证字段 | 使用网关自身的 AWS 凭证进行 SigV4 签名:环境变量、Web Identity(例如 EKS 上的 IRSA)、ECS 容器凭证端点或 EC2 实例配置文件。 |
在 access_key 或 default_chain 模式下,设置 role_arn 后,AISIX 会通过 sts:AssumeRole 用这组凭证换取该角色的凭证。external_id 和 role_session_name 可选,且都要求同时设置 role_arn。未设置 role_session_name 时,会话名为 aisix-session-<unix seconds>。如果基础凭证本身已经属于 该角色,AISIX 会直接使用,而不会让角色扮演自身。例如,使用网关自身的凭证扮演角色:
{
"auth_type": "default_chain",
"role_arn": "arn:aws:iam::123456789012:role/bedrock-invoke",
"external_id": "YOUR_EXTERNAL_ID",
"region": "us-west-2"
}
属于其他模式的字段会被拒绝:Admin API 拒绝保存并返回 400;在资源文件中,网关会让经过该密钥的每个请求返回 401 authentication_error,错误信息只写字段名,不回显字段值。默认凭证链找不到凭证来源,或 STS 拒绝 AssumeRole,同样是不可重试的 401。凭证服务本身故障(例如 STS 返回 5xx 或元数据端点不可达)属于传输错误,路由可以重试和故障转移。错误信息会写明 auth_type 以及是否涉及角色,但不会包含 STS 返回的原文,具体原因记录在网关日志中。
来自默认凭证链或 AssumeRole 的临时凭证按配置缓存,并在过期前 60 秒刷新。STS 通过标准 AWS SDK 解析方式访问,因此网关环境中的 AWS_ENDPOINT_URL_STS 和 AWS_ENDPOINT_URL 同样生效。所有 Bedrock 调用都遵循所选模式,包括流式、Token 计数和嵌入。
api_key 和 default_chain 模式,以及任意模式下的角色字段,都需要 1.7.0 或更高版本的网关。只要该密钥允许使用的某个环境中注册了更早版本的网关,AISIX Enterprise 和 AISIX Cloud 就会拒绝保存,并返回 422 DP_INCOMPATIBLE,因为旧网关要么让经过该密钥的所有请求失败,要么以基础身份而非该角色签名。