Claude Code 网关与用量

Claude Code 网关与用量

Claude 应用网关配置

13 分钟阅读

Claude 应用网关配置

gateway.yaml 所有选项的参考文档:监听器与 TLS、OIDC、会话、Postgres 存储、Amazon Bedrock、Claude Platform on AWS、Google Cloud Agent Platform 和 Microsoft Foundry 上游、模型路由、托管策略以及遥测。

Claude 应用网关部署由一个 YAML 文件配置,通常命名为 gateway.yaml。网关的所有行为都在这个文件中定义:监听位置、开发者的登录方式、推理请求的去向,以及要应用的策略和遥测配置。本页是该文件中所有选项的参考文档。

要编写第一份配置,请从快速入门开始;其中会构建一份可运行的最小配置并将其启动。配置调整满意后,可参阅部署指南,了解如何将网关容器化,以及如何将其托管在 Kubernetes、Cloud Run 或您自己的平台上。

网关会在启动时通过 claude gateway --config /path/to/gateway.yaml 读取该文件一次。启动期间,每个选项都会依据 schema 进行验证,因此配置格式有误时,网关会在启动阶段报告具体字段的错误,而不会等到首次使用时才失败。

本页末尾的完整示例涵盖了所有配置部分。

文件结构

其中有五个必需部分。其他部分均为可选部分;省略时采用默认值。未知的键会导致启动失败,因此拼写错误会以明确指出键名的错误呈现,而不会被静默忽略。

必需部分:

  • listen:绑定地址、公开 URL、TLS 终止
  • oidc:身份提供商 (IdP),包括颁发者、客户端、声明映射和登录资格
  • session:网关签发的 bearer Token,包括密钥和有效期
  • store:用于存储设备授权和限流计数器的 PostgreSQL
  • upstreams:推理请求的目的地,可以是 Anthropic、Amazon Bedrock、Claude Platform on AWS、Google Cloud Agent Platform 或 Microsoft Foundry

可选部分:

  • admin:Admin API 身份验证和消费限额数据保留
  • enforcement:消费限额的故障开放或故障关闭行为
  • modelsauto_include_builtin_models:管理员选定的模型列表及各上游对应的 ID
  • managed:按 IdP 组划分的托管设置策略
  • telemetry:将 OTLP 数据转发到可观测性技术栈
  • access_controllimitstimeoutsrate_limits:IP 允许/拒绝规则、请求大小上限、上游首字节响应时间,以及按 IP 统计的登录限流

密钥展开

不要将 client_secretjwt_secretpostgres_url 等密钥直接写入 gateway.yaml。请使用以下任一形式引用密钥,网关会在启动时从环境变量或文件中解析其值:

形式解析结果适用场景
${VAR}环境变量 VAR;若未定义,启动失败容器环境变量、通过环境变量注入的 AWS Secrets Manager 密钥
${file:/path}去除首尾空白后的文件内容Kubernetes Secret 卷挂载、Vault Agent、SOPS

必需部分

listen

listen 块控制网关在何处提供服务:绑定地址和端口、外部可见的源,以及可选的 TLS 终止。

字段是否必需说明
host绑定地址。默认为 0.0.0.0
port绑定端口。默认为 8080
public_url使用代理时必需外部可见的 https:// 源,用于构造 IdP redirect_uri 和发现元数据。只要网关位于 ALB、Ingress 或 Cloud Run 等终止 TLS 的代理之后,就必须设置此项,因为网关在构造自身源时不信任可能由客户端伪造的 X-Forwarded-* 标头。下文的 trusted_proxies 仅控制客户端 IP 的解析。启用遥测时也必须设置此项,因为网关会根据该 URL 构造推送给客户端的 OTLP 端点。
tls.cert / tls.key网关自行终止 TLS 时使用的 PEM 文件路径。
trusted_proxies位于网关前方的负载均衡器 CIDR 或 IP。设置后,网关只信任来自这些对等方的 X-Forwarded-For,并记录真实客户端 IP,用于按 IP 限流和审计。等同于 nginx 的 set_real_ip_from

oidc

oidc 块将网关连接到您的身份提供商,并决定哪些用户可以登录。它指定颁发者和 OAuth 客户端,映射承载电子邮件地址和组信息的声明,并可按电子邮件域或组限制登录。

OpenID Connect (OIDC) 是网关与身份提供商配合使用的 SSO 协议。有关需要在 IdP 端注册的内容,请参阅身份提供商设置

字段是否必需说明
issuerOIDC 发现基址,必须在 /.well-known/openid-configuration 提供发现信息。生产环境中应使用 HTTPS;网关也接受 http:// 颁发者。除非在网关环境中设置 CLAUDE_GATEWAY_ALLOW_LOOPBACK=1,否则 http://localhost:8081 之类的回环颁发者会被 SSRF 防护拒绝。
client_id / client_secret来自 OAuth 客户端注册的信息。
allowed_email_domains如果 id_token 的 email 声明不属于这些域之一,则拒绝该 Token;匹配不区分大小写。这是针对多租户 IdP 配置错误的纵深防御。无论此项如何设置,只要 id_token 的 email_verified 声明确为 false,就始终会被拒绝。
allowed_groups仅允许这些 IdP 组的成员登录,匹配依据为 groups_claim。即使用户属于允许的电子邮件域,只要不属于其中任何一个组,也会被拒绝。要求 IdP 发出组声明。
groups_claim指定 id_token 中承载组成员资格的声明。默认为 groups。Microsoft Entra 在 roles 下发出应用角色。可接受扁平键,也可接受 RFC 6901 JSON Pointer,例如用于嵌套声明的 /resource_access/gateway/roles
google_groups通过 Google Workspace Admin SDK Directory API 查询已登录用户所属的组,因为 Google 的 id_token 不包含组声明。将 service_account_json_path 设为服务账号密钥文件;该服务账号须针对 https://www.googleapis.com/auth/admin.directory.group.readonly 范围启用全域委派。将 admin_email 设为该服务账号要模拟的 Workspace 管理员,因为 Directory API 要求真实的管理员主体。每位用户所属组的电子邮件地址会成为其组声明,因此 allowed_groupsmanaged.policies.match.groups 都按组电子邮件地址匹配。
email_claim指定 id_token 中承载用户电子邮件地址的声明。默认为 email。ADFS 和 Entra B2C 等部分 IdP 会改为发出 upnpreferred_username。可接受扁平键、JSON Pointer,或按顺序回退的键列表;使用其中第一个存在的键。
scopes完全覆盖网关请求的 OIDC scope。默认为 [openid, profile, email, offline_access]。当 IdP 拒绝其无法识别的 scope,或要求自定义 scope 才会发出组或电子邮件信息时,可设置此项。必须包含 openid。移除 offline_access 会禁用刷新 Token,此后开发者每隔 session.ttl_hours 都要重新在浏览器中登录。有关各 IdP 的 scope 配置方法(例如 Google 的刷新 Token 流程),请参阅身份提供商设置
extra_auth_params原样附加到 IdP 授权请求的额外查询参数。它用于覆盖 IdP 特有的行为,例如 Google 刷新 Token 所需的 access_type: offline、部分 Entra 租户使用的 domain_hint,或升级身份验证流程使用的 acr_values。不能覆盖由网关管理的协议参数:statenonceredirect_uri、PKCE、scoperesponse_typeresponse_modeclient_id
userinfo_fallback当 id_token 缺少电子邮件或组信息时,从 /userinfo 获取。Keycloak 轻量级访问 Token、Okta 组织服务器和 ADFS 最小化 Token 需要使用此项。id_token 仍是权威来源;userinfo 只补全缺失信息。默认为 false
use_pkce在授权请求中发送 PKCE (S256) challenge。默认为 true。仅当 IdP 拒绝为此机密客户端使用 PKCE 时才设为 false
clock_skew_seconds验证 id_token 的时间声明时允许时钟偏差。默认为严格校验的 0。如果主机与 IdP 的时钟偏差导致登录后立即出现“token expired / not yet valid”错误,请增大此值。
token_endpoint_auth_method覆盖 Token 端点的身份验证方法。可设为 client_secret_basicclient_secret_post。默认自动协商。
id_token_signed_response_alg预期的 id_token 签名算法。默认为 RS256。对于使用 ES256、PS256 或 EdDSA 签名的 IdP,请设置此项。
additional_authorized_partiesclient_id 外还可接受的额外 azp 值,用于 Keycloak 代理和 Token 交换流程。
discovery_url从此 URL 获取发现文档,而不是根据 issuer 推导。适用于位于会重写颁发者主机名的代理之后的 IdP。路径必须包含 /.well-known/
form_action_origins/device 页面的 Content-Security-Policy: form-action 指令允许使用的其他源。网关已允许 'self' 和发现到的 authorization_endpoint 源,但 Chrome 会针对整个重定向链强制执行 form-action。如果 IdP 会经由另一个主机重定向,例如联合到 ADFS 的 Azure AD、中心辐射型 Okta 或企业 SSO 拦截器,请列出授权请求可能经过的每个源。
ca_cert_pem仅针对 IdP 请求替换系统信任存储的 PEM CA 证书。适用于位于企业 PKI 后方的 Keycloak 或 Dex。

session

session 块定义网关在登录后签发的 bearer Token:用于签名的密钥及其有效期。

字段是否必需说明
jwt_secret至少包含 32 字节的熵,例如由 openssl rand -base64 32 生成。用于签署网关的 HS256 bearer Token。可接受单个字符串,也可接受用于轮换的数组:索引 0 处的密钥用于签名,所有条目都可用于验证。轮换时,先在数组开头加入新密钥,等待 ttl_hours,然后移除旧密钥。
ttl_hours网关 bearer Token 的有效期。默认为 1。如果 IdP 签发刷新 Token,CLI 会在到期前静默刷新。有效期越短,停用用户生效越快;有效期越长,与 IdP 的往返次数越少。如果 IdP 因不支持 offline_access 而无法签发刷新 Token,就不能静默刷新;可将此值提高到 812,避免开发者每小时都要返回浏览器登录。

store

store 块将网关连接到 PostgreSQL 数据库,用于保存设备授权和限流计数器。

字段是否必需说明
postgres_urlpostgres://postgresql:// URL。此项必需,因为浏览器回调写入、轮询 CLI 读取的设备授权汇合点需要跨副本状态。网关会在启动时自行执行 schema 迁移,因此相应角色需要目标 schema 的 CREATE TABLE 权限。如果安全策略禁止应用角色执行 DDL,请先用管理员角色运行迁移,并在每次新版本包含迁移时再次运行,然后向应用角色授予网关表的 SELECT, INSERT, UPDATE, DELETE 权限。请参阅升级Postgres
username覆盖 postgres_url 中的用户。
password数据库凭据。请在此处设置,而不要放入 postgres_url,以免凭据出现在 URL 中。可包含任意字符,且优先于 URL 中的凭据。
max_connections每个副本的 Postgres 连接池大小。默认为 5,这一保守值适合共享数据库。启用消费限额后,每个推理请求的关键路径会执行数次数据库操作;专用数据库承受负载时可提高此值,同时应确保“副本数 × 此值”低于数据库的 max_connections

本地开发时,可将 postgres_url 指向一个用完即弃的 Postgres 容器,例如 docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres

upstreams

upstreams 是一个有序列表。网关会将推理请求转发到第一个能够解析所请求模型的上游。遇到 5xx429401403404 或超时时,会故障转移到下一个上游;其他 4xx 不会触发故障转移,因为这类错误应归因于请求本身,而不是上游。401403 表示网关自身的凭据未能通过该上游的验证;404 表示该上游不提供所请求的模型,因此列表中后续的上游仍可能处理请求。

404 时进行故障转移需要网关 v2.1.198 或更高版本。早期版本即使列表中的后续上游提供该模型,也会把第一个 404 返回给客户端。

同一提供商的多个上游必须分别设置不同的 name:

Amazon Bedrock、Claude Platform on AWS、Google Cloud Agent Platform 和 Microsoft Foundry 客户端在启动时创建一次,其 SDK 会在内部刷新凭据,因此轮换云凭据无需重启。静态 Anthropic API 密钥和 bearer Token 会在启动时读取;请参阅 Anthropic API

Anthropic API

最小的 Anthropic 上游配置只需一个来自 Claude Console 的 API 密钥:

upstreams:
  - provider: anthropic
    auth:
      api_key: ${ANTHROPIC_API_KEY}
    # 或使用 OAuth bearer Token(例如,通过 Workload Identity Federation 交换获得的 Token):
    #   oauth_token: ${file:/var/run/secrets/anthropic-oauth-token}
    # base_url: https://api.anthropic.com   # 默认值;如使用正向代理可覆盖

两种凭据形式发送的标头不同:

  • api_key:发送 x-api-key。请在 Claude Console 中轮换密钥,并更新环境变量。
  • oauth_token:发送 Authorization: Bearer。如果组织签发的是短期 Token,而不是长期 API 密钥,请使用 bearer 形式。bearer 只在启动时读取一次,因此需要重新挂载密钥并重启才能刷新。

除静态密钥或 bearer 外,还可以使用 Workload Identity Federation。按照 Workload Identity Federation 指南创建联合规则,然后将工作负载的 OIDC JWT 以文件形式挂载,例如 Kubernetes 投射的服务账号 Token 或 CI 平台的 id-token。网关会将该 JWT 交换为短期 bearer,并自动刷新。每次交换都会重新读取 Token 文件,因此轮换后的投射 Token 无需重启即可生效。

upstreams:
  - provider: anthropic
    auth:
      federation_rule_id: ${ANTHROPIC_FEDERATION_RULE_ID}
      organization_id: ${ANTHROPIC_ORGANIZATION_ID}
      identity_token_file: /var/run/secrets/anthropic/id-token
      # workspace_id: wrkspc_...       # 规则涵盖多个 workspace 时必填
      # service_account_id: svac_...   # 可选的预期目标校验

Amazon Bedrock

有关网关所替代或位于其前方的客户端 Amazon Bedrock 部署,请参阅 Amazon Bedrock 上的 Claude Code。网关侧的上游配置如下:

upstreams:
  - provider: bedrock
    region: us-east-1
    auth: {}                           # 首选:AWS 默认凭证链
    # 或显式指定凭证:
    # auth:
    #   aws_access_key_id: ${AWS_AKID}
    #   aws_secret_access_key: ${AWS_SK}
    #   aws_session_token: ${AWS_ST}
    # 或使用 Bedrock API bearer Token:
    # auth:
    #   aws_bearer_token: ${AWS_BEARER_TOKEN}
    # 针对 FIPS 或 VPC endpoint 部署覆盖 bedrock-runtime 端点:
    # base_url: https://bedrock-runtime-fips.us-east-1.amazonaws.com

空的 auth 块会使用 AWS SDK 的默认凭据链:环境变量、~/.aws/credentials、ECS 任务角色、EC2 实例元数据或 EKS 上的 IRSA。在生产环境中,应为网关 Pod 分配 IAM 角色,而不要将静态密钥嵌入容器镜像。

设置方法
IAM 权限针对推理配置文件 ARN 和底层基础模型 ARN,向网关主体授予 bedrock:InvokeModelbedrock:InvokeModelWithResponseStream。对于美国区域中的内置目录:arn:aws:bedrock:<region>:<account>:inference-profile/us.anthropic.*arn:aws:bedrock:*::foundation-model/anthropic.*
模型访问权限在 Amazon Bedrock 控制台中,按区域申请并启用所需 Claude 模型的访问权限。跨区域推理配置文件 (us.anthropic.*) 要求在其覆盖的每个区域中都具有模型访问权限。
EKS (IRSA)创建包含上述策略的 IAM 角色,并为集群的 OIDC 提供商配置一份限定到网关服务账号的信任策略。使用 eks.amazonaws.com/role-arn: arn:aws:iam::<acct>:role/claude-gateway 为服务账号添加注解。auth: {} 会自动使用该角色。
ECS / EC2将 IAM 角色附加到任务定义或实例配置文件。auth: {} 会自动使用该角色。
其他环境通过 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 环境变量传入凭据,或在 auth: 中通过 ${VAR} 展开显式设置。
区域region: 是 API 端点所在的区域。无论选择哪个区域,跨区域推理配置文件都会在相应地理范围(美国、欧洲、亚太)内进行路由。对于美国以外的区域或预置吞吐量 ARN,请添加 models: 块,配置正确的各上游 ID。

Claude Platform on AWS

Claude Platform on AWS 在 AWS 基础设施上的 aws-external-anthropic.<region>.api.aws 提供 Anthropic 第一方 API。它使用第一方模型 ID,按原样处理 anthropic-beta 标头,并提供 count_tokens,因此不需要进行任何 Bedrock 特有的转换。anthropicAws 提供商要求 Claude Code v2.1.198 或更高版本;较早的网关版本会在启动时拒绝它。

有关同一平台的客户端部署,请参阅 Claude Platform on AWS 上的 Claude Code。网关侧的上游配置如下:

upstreams:
  - provider: anthropicAws
    region: us-east-1
    workspace_id: wrkspc_...
    auth:
      api_key: ${ANTHROPIC_AWS_API_KEY}   # 作为 x-api-key 发送
    # 或通过 AWS 默认凭证链使用 SigV4:
    # auth: {}
    # 或显式指定 SigV4 凭证:
    # auth:
    #   aws_access_key_id: ${AWS_ACCESS_KEY_ID}
    #   aws_secret_access_key: ${AWS_SECRET_ACCESS_KEY}
    # 覆盖推导出的端点:
    # base_url: https://aws-external-anthropic.us-east-1.api.aws

该平台与 Amazon Bedrock 运行在不同的 AWS 账号中,并使用自己的服务名称 aws-external-anthropic 对 SigV4 请求进行签名,因此仅限 Bedrock 的 IAM 角色无法授权访问它。如果同时设置了 SigV4 凭据,auth.api_key 中的 API 密钥优先。空的 auth 块使用 AWS SDK 的默认凭据链,与 Amazon Bedrock 上游使用的凭据链相同。

字段是否必需说明
regionAWS 区域,由小写字母、数字和连字符组成。网关据此推导端点:https://aws-external-anthropic.<region>.api.aws
workspace_id作为标头随每个请求发送;平台要求提供此值。
auth.api_key平台 API 密钥,以 x-api-key 发送。它不是 bearer Token:两种身份验证模式分别为 API 密钥和 SigV4。
auth.aws_access_key_id / auth.aws_secret_access_key显式 SigV4 凭据。只设置其中一项会导致启动失败。还可同时设置 auth.aws_session_token
base_url覆盖推导出的端点。

由于平台可解析第一方模型 ID,因此内置目录不需要 models: 块即可路由到该平台。自行指定 models: 列表时,请使用 anthropicAws: 作为条目键,并将第一方 ID 设为其值。

Google Cloud Agent Platform

有关等效的客户端设置,请参阅 Google Cloud 上的 Claude Code。网关侧的上游配置如下:

upstreams:
  - provider: vertex
    region: us-east5
    project_id: example-prod
    auth: {}                           # 首选:Application Default Credentials
    # 或使用服务账号密钥文件:
    # auth: { service_account_json: /secrets/sa.json }
    # 覆盖用于 Private Service Connect 的 aiplatform 端点:
    # base_url: https://us-east5-aiplatform.p.googleapis.com

空的 auth 块使用应用默认凭据:GOOGLE_APPLICATION_CREDENTIALS、GCE 元数据或 GKE Workload Identity。虽然也支持服务账号 JSON 密钥文件,但不建议使用;请优先使用 Workload Identity,或将服务账号附加到 GCE 或 Cloud Run 实例。

region: global 设为使用 Google Cloud Agent Platform 的全球端点,而不是区域端点。随后 Google 会将每个请求路由到可用区域,您无需跟踪各区域的模型可用性。指定具体区域则会将每个请求固定到该区域。

设置方法
IAM 权限在项目中向网关的服务账号授予 roles/aiplatform.user,或授予包含 aiplatform.endpoints.predict 的自定义角色。启用 Google Cloud Agent Platform API (aiplatform.googleapis.com)。
模型访问权限在 Model Garden 中为项目启用 Claude 模型。这些模型会发布到特定区域;请查看模型卡了解支持的区域。
GKE (Workload Identity)将 GCP 服务账号绑定到网关的 Kubernetes 服务账号,并使用 iam.gke.io/gcp-service-account: claude-gateway@<proj>.iam.gserviceaccount.com 为 KSA 添加注解。auth: {} 会自动使用该身份。
Cloud Run / GCE将服务的服务账号设为具有 roles/aiplatform.user 的账号。auth: {} 会自动使用该身份。
其他环境使用 auth: { service_account_json: /secrets/sa.json },其中路径指向以密钥形式挂载的 JSON 密钥文件。该字段接收文件路径而非密钥内容,因此不涉及 ${file:…} 展开。

Microsoft Foundry

有关客户端 Microsoft Foundry 部署,请参阅 Microsoft Foundry 上的 Claude Code。网关侧的上游配置如下:

upstreams:
  - provider: foundry
    resource: example-foundry              # https://example-foundry.services.ai.azure.com
    auth: { use_azure_ad: true }        # 首选:DefaultAzureCredential / Managed Identity
    # 或使用 API key:
    # auth:
    #   api_key: ${FOUNDRY_API_KEY}

use_azure_ad: true 通过 DefaultAzureCredential 解析凭据:AKS、ACI 或 App Service 上的 Managed Identity、Azure CLI,或环境凭据。API 密钥也可用,但作用于整个项目,且不会自动轮换。Microsoft Foundry 的端点根据 resource: 推导;对于 Azure Government 等主权云,可设置可选的 base_url 来覆盖该端点。

设置方法
RBAC在 Microsoft Foundry 资源上,向网关身份授予 Azure AI UserCognitive Services User
部署Microsoft Foundry 使用由管理员选择的部署名称,而不是规范模型 ID。添加 models: 块,将每个规范 ID 映射到相应部署名称。
AKS(工作负载身份)将用户分配的 Managed Identity 与集群的 OIDC 颁发者联合,并绑定到网关的服务账号。use_azure_ad: true 会通过 WorkloadIdentityCredential 自动使用该身份。
ACI / App Service在资源上启用系统分配或用户分配的 Managed Identity。use_azure_ad: true 会自动使用它。
其他环境auth: { api_key: "${FOUNDRY_API_KEY}" }。在 { } 内使用 ${…} 时要加引号。

多个上游

同一提供商可以出现多次,但各项必须使用不同的 name:。这适用于不同区域、通过不同凭据链访问的不同账号、预置吞吐量与按需容量,以及跨提供商回退等场景。

网关按顺序尝试上游。5xx429401403404、超时和缺少端点 (501) 会触发故障转移;其他 4xx 不会。

429 表示单个上游的容量问题,因此预置吞吐量 (PT) 耗尽时会故障转移到按需容量。404 表示单个上游的模型可用性问题,因此尚未启用某个模型的上游不会阻止后续可提供该模型的上游。无法解析所请求模型的上游会被跳过,不会发生网络往返。

以下示例首先将请求路由到 Amazon Bedrock 预置吞吐量配额;容量溢出后,依次转移到按需容量和另一个账号,最后回退到 Anthropic API:

upstreams:
  # 主上游:本地区域内的预置吞吐量。
  - name: bedrock-pt
    provider: bedrock
    region: us-east-1
    auth: {}
  # 溢出上游:跨区域按需容量。
  - name: bedrock-od
    provider: bedrock
    region: us-west-2
    auth: {}
  # 其他账户:通过 assumed-role 凭证使用单独的 Bedrock 配额。
  - name: bedrock-acct2
    provider: bedrock
    region: us-east-1
    auth:
      aws_access_key_id: ${ACCT2_AKID}
      aws_secret_access_key: ${ACCT2_SK}
  # 最后选择:直连 Anthropic API。
  - name: anthropic-fallback
    provider: anthropic
    auth:
      api_key: ${ANTHROPIC_API_KEY}

# 每个上游的模型 ID 以该上游的 `name:` 为键;没有 `name:` 的上游
# 默认使用其提供商字符串(例如 `bedrock`)。模型配置中未列出的任何
# 上游都会被跳过。借此可以将某个模型路由到预置吞吐量,同时让其他
# 所有模型继续使用按需容量。
models:
  - id: claude-opus-4-8
    label: Claude Opus 4.8
    upstream_model:
      bedrock-pt: arn:aws:bedrock:us-east-1:111111111111:provisioned-model/abcdef
      bedrock-od: us.anthropic.claude-opus-4-8
      bedrock-acct2: us.anthropic.claude-opus-4-8
      anthropic-fallback: claude-opus-4-8
调整方式方法
不同区域每个区域配置一个 Amazon Bedrock 上游,各自使用对应的 region:。启用 auto_include_builtin_models: true 后,跨区域推理配置文件会自动路由;对于固定到特定区域的部署,请使用 models: 块。
不同账号每个账号配置一个 Amazon Bedrock 上游,各自在 auth: 中使用自己的凭据。默认凭据链 (auth: {}) 使用 Pod 的身份;如需访问第二个账号,请设置显式凭据或 bearer Token。
预置吞吐量models: 中,以该上游的名称将模型映射到预置吞吐量 ARN。其他上游继续使用按需 ID,因此会在 PT 容量耗尽后再进行故障转移。
VPC / FIPS 端点将上游的 base_url: 设为 VPC 端点或 FIPS 端点 URL。
限定模型的路由从模型的 upstream_model: 映射中省略某个上游,即可针对该模型跳过该上游。例如,将 Opus 路由到预置吞吐量,而将 Sonnet 和 Haiku 路由到按需容量。

在不同云提供商之间进行故障转移,或回退到直接使用 Anthropic API,会改变请求适用的协议、地理区域及其他条款。

无论处理某个请求的是哪个上游,CLI 都会对网关应用相同的功能门控,因此故障转移不会向上游发送其无法接受的请求正文字段。

可选部分

admin

可选。启用 /v1/organizations/spend_limits(与 Anthropic 的公共 Admin API 对应)以及 /v1/messages 上按开发者执行的消费限额。有关限额的设置和执行方式,请参阅消费限额;本节介绍用于启用和调整该功能的 gateway.yaml 键。

admin:
  # 管理端点使用的具名静态 API key,通过 x-api-key 发送。
  # id 会以 admin-key:<id> 形式出现在审计日志中,从而可以
  # 追溯每个 key。此数组用于轮换:添加新 key、更新客户端,
  # 再移除旧 key。
  write_keys:
    - { id: terraform, key: "${GATEWAY_ADMIN_WRITE_KEY_TF}" }
    - { id: ci,        key: "${GATEWAY_ADMIN_WRITE_KEY_CI}" }
  read_keys:
    - { id: reporting, key: "${GATEWAY_ADMIN_READ_KEY}" }
  # 通过常规网关 JWT 获得完整管理员权限的 IdP 组(无需 API key)。
  admin_groups: [platform-finops]
  blocked_message: 如需提高限额,请访问 https://go.example.com/claude-limits
字段是否必需说明
write_keys{id, key} 数组。与其中任一项匹配的 x-api-key 可以列出、设置和删除消费限额。密钥值至少要有 32 个字符;idread_keyswrite_keys 中必须全局唯一。
read_keys{id, key} 数组。只读:可访问所有 GET 端点,包括列出限额、按 ID 获取单项,以及读取 /effective/audit
admin_groupsIdP 组名称。如果网关 JWT 的 groups 声明包含其中任一组,该 JWT 即拥有完整的读写管理权限,审计身份记录为 oidc:<sub>。此方式适合人工管理员;机器应使用 API 密钥。
blocked_message原样附加到被阻止开发者看到的 429 billing_error。请写明完整指引,例如 URL 或 Slack 频道。未设置时,错误为 spend limit reached
audit_retention_days默认为 365。超过期限的 admin_audit 行会被清理。
spend_retention_months默认为 13。超过该期限的 spend 计数器行会被清理。默认值会保留一个完整年度及当前不完整月份的数据,供同比报告使用。
identity_retention_days默认为 90principal_emails 行的最近出现 TTL;这些行保存每位开发者的电子邮件、显示名称和组信息(个人身份信息)。此值有意短于消费数据的保留期,使已停用的身份可随时间清除,同时保留其匿名消费计数器。
group_limit_modemin(默认)或 max。如果开发者所属的多个组均设有限额,min 执行最严格的限额,max 执行最宽松的限额。限额执行和 /effective 均使用此设置。

enforcement

enforcement 块控制存储不可用时消费限额检查的行为。

字段是否必需说明
fail_closed_on_error默认为 false。Postgres 中断时,消费限额执行采用故障开放策略,以保持推理服务可用。设为 true 可改为故障关闭:超出限额的开发者会被阻止,但存储不可达时其他所有人也会被阻止。没有 admin: 块时,此设置不起作用。

models

models 块是可选的管理员精选模型列表,由 /v1/models 提供,并用于转换各上游的模型 ID。对于美国以外的 Amazon Bedrock 区域、Amazon Bedrock 预置吞吐量 ARN 和 Microsoft Foundry 部署名称,此块为必需。

auto_include_builtin_models: true   # false:仅公开下方列表
models:
  - id: claude-opus-4-8
    label: Claude Opus 4.8
    # description: 显示在支持该字段的客户端中的可选文本
    upstream_model:
      anthropic: claude-opus-4-8
      bedrock: us.anthropic.claude-opus-4-8   # 或 inference profile ARN
      foundry: your-opus-deployment-name

managed

managed 块定义基于角色的访问策略,以 IdP 组或电子邮件域为匹配条件。策略按顺序求值:先选择第一个匹配项,再将其合并到下文所述的 match: {} 全匹配基础策略之上。系统通过 GET /managed/settings 按用户提供策略,并使用 ETag/304 缓存。

managed:
  policies:
    # 先列出特定组。
    - match: { groups: [eng-contractors] }
      cli:
        availableModels: [claude-sonnet-4-6]
        permissions: { deny: ["WebFetch", "WebSearch"] }
    # 最后列出默认兜底规则:匹配所有已通过身份验证的用户。
    - match: {}
      cli:
        availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]

通常列在最后的 match: {} 全匹配策略会被视为基础层。其他每项策略都会从全匹配策略继承自身未设置的键,因此按角色配置的条目只需列出与组织默认值不同的部分。合并规则取决于键的类型:

  • 允许列表availableModelspermissions.allow。具体策略的列表会完全替换基础列表。
  • 拒绝列表和 Hook 数组permissions.denypermissions.askdisabledMcpjsonServersdeniedMcpServersblockedMarketplaces,以及 hooks 各事件类型的数组。这些值取基础策略与具体策略的并集,因此组织级拒绝规则或审计 Hook 不会被按角色的覆盖意外移除。
  • 记录类型的键envmodelOverridesskillOverrides。这些键进行浅合并,因此按角色配置的 env 块会覆盖自身设置的键,同时继承基础策略中的其余键。

availableModels 还会在服务器端的 /v1/messages 强制执行,因此无论客户端发送什么内容,被拒绝的模型都会返回 400

匹配器行为
match: {}匹配每个已通过身份验证的用户。可以先设置这样一项,之后再在其上方添加限定组范围的策略。
match: { groups: [a, b] }如果 JWT 的 groups 声明包含所列任一组,则匹配。区分大小写:组名必须与 IdP 中的大小写完全一致。
match: { email_domain: example.com }对 JWT 的 email 声明中最后一个 @ 后面的部分进行匹配,不区分大小写。每项策略接受一个域。
match: { groups: [a], email_domain: example.com }两个条件都必须匹配。

已通过身份验证但未匹配任何策略的用户会获得网关默认配置,即可使用目录中的所有模型,且没有托管设置。如果要保证始终存在默认策略,请在最后添加 match: {} 全匹配项。

网关不维护自己的用户目录。它依据用户的 IdP Token 对每个请求进行授权:从 Token 的 groups 声明读取组成员资格,并据此评估策略。网关没有可供枚举的用户花名册,也不需要预先创建账号,因此没有 SCIM 端点,因为不存在需要通过 SCIM 同步到网关的数据。

请在权威数据源中管理用户和组的生命周期,即使用 IdP 原生的 SCIM 配置或专用的身份治理平台。由这些系统管理的成员资格和用户停用会通过 Token 自动传递到网关。如果要使用 SCIM 配置 Claude 账号本身,这是 Claude for Enterprise 的一项功能。

需要考虑两个传播周期:

  • 策略内容:编辑策略并重新部署后,已连接的客户端会在下次轮询托管设置时收到更新,最长不超过一小时
  • 组成员资格:更改用户的组成员资格会改变与其匹配的策略。这会在下次重新签发会话时生效,即下次静默刷新时,最长由 session.ttl_hours 决定。

cli 中可以包含的内容

每个 cli 值都是一份完整的 Claude Code managed-settings.json 文档,其 schema 与通过 MDM 或 /etc/claude-code/managed-settings.json 部署的文档相同,只是在此处以 YAML 表示。CLI 会在托管层级应用下发的文档,其优先级高于用户和项目设置。

网关启动时会依据 CLI 的设置 schema 验证每份文档。如果存在无法识别的顶层键,或已识别键的值格式错误,启动就会失败,并在错误中列出所有有问题的键。schema 中有意保持开放的部分仍接受任意值,因为较新的客户端可能会识别网关 schema 尚不了解的条目。这些开放键包括 envpluginConfigs,以及 permissions 下嵌套的键。

由于验证使用网关安装版本所附带的 schema,如果要在托管配置中加入较新 Claude Code 版本引入的顶层设置键,必须先升级网关。全面推广新策略前,请先在一台客户端上进行冒烟测试。

完整的键参考请参阅 Claude Code 设置。运维人员最常用的键如下:

managed:
  policies:
    - match: {}
      cli:
        # 模型访问权限(服务器端也会在 /v1/messages 强制执行)
        availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]

        # 权限策略
        permissions:
          deny:
            - "WebFetch"
            - "Read(./.env)"
            - "Read(./secrets/**)"
          disableBypassPermissionsMode: disable   # 阻止 --dangerously-skip-permissions
        allowManagedPermissionRulesOnly: true     # 忽略用户/项目权限规则

        # 注入 CLI 进程的环境变量。DISABLE_UPDATES 会阻止
        # 后台和手动更新;DISABLE_AUTOUPDATER 仅阻止
        # 后台更新。
        env:
          DISABLE_UPDATES: "1"                    # 通过你自己的分发渠道固定版本

        # 组织范围的 Hook。Hook 命令在开发者机器上运行,而非
        # 网关,因此该路径必须存在于策略覆盖的每种客户端 OS 上。
        hooks:
          PostToolUse:
            - matcher: "Edit|Write"
              hooks:
                - { type: command, command: /usr/local/bin/audit-edit.sh }
执行方效果
availableModels网关 + CLI模型允许列表。还会在 /v1/messages 进行检查,因此经过修改的客户端也无法绕过。
permissions.allow / .denyCLI工具和命令规则。请参阅权限
permissions.disableBypassPermissionsModeCLI设为 disable 可禁用 bypassPermissions(自动批准每次工具调用的模式)及 --dangerously-skip-permissions 标志。
allowManagedPermissionRulesOnlyCLI设为 true 时,忽略用户和项目权限规则,只应用本文档中的规则。
envCLI合并到 CLI 进程中的环境变量。可用于遥测、自动更新和模型名称覆盖。
hooksCLI组织级 Hook

由于这些设置经由网络传送,CLI 会在首次应用任何能够执行 shell 命令或改变流量目的地的设置前,向每位开发者显示一次安全审批对话框。该对话框涵盖:

  • hooks
  • 不在 CLI 内置安全列表中的 env 变量
  • apiKeyHelperstatusLine 等执行 shell 的设置
  • 托管的 CLAUDE.md 内容

以下安全列表决定哪些 env 变量无需批准即可应用:

  • 在安全列表中:自动更新变量和模型名称变量
  • 不在安全列表中:代理变量、基础 URL 变量和 OTEL_EXPORTER_OTLP_ENDPOINT

网关的遥测配置会推送 OTEL_EXPORTER_OTLP_ENDPOINT,因此设置 telemetry.forward_to 会在每个交互式客户端上触发该对话框。使用 -p 标志的非交互式运行会跳过对话框,并直接应用设置。该对话框旨在保护开发者的计算机免受已遭入侵或恶意网关的影响,而不是保护组织免受开发者影响,因此允许 -p 跳过是有意设计,并非漏洞。

如果开发者拒绝,Claude Code 会直接退出,而不会应用策略。因此,如果向覆盖范围广的策略推送新的 Hook 或非安全环境变量,每个匹配该策略的开发者都会在下次启动时看到审批提示。

早期版本将 cli 键命名为 settings。该拼写仍可作为别名使用,但新部署应使用 cli

与其他托管来源之间的优先级

如果设备上还存在本地 managed-settings.json 或通过 MDM 下发的策略,各托管来源不会合并。优先级最高的来源提供全部策略设置,优先级从高到低如下:

  1. 策略辅助程序
  2. 网关下发的设置
  3. MDM;在 Windows 上通过 HKLM 注册表,在 macOS 上通过 plist
  4. managed-settings.json 文件
  5. HKCU 注册表(仅限 Windows)

嵌入式宿主可以通过 SDK 的 managedSettings 选项提供策略。默认情况下该策略会被忽略;仅当某个托管来源通过 parentSettingsBehavior: "merge" 选择加入时才会应用,并且会经过筛选,只能收紧策略,不能放宽策略。

唯一的例外是以下键:只要用户可写的 HKCU 层级之上的任一管理员来源设置了这些键,无论其余策略来自何处,它们都会生效:

  • sandbox.network.allowManagedDomainsOnlysandbox.filesystem.allowManagedReadPathsOnly:锁定后,会合并各来源中相应允许列表的并集
  • allowAllClaudeAiMcps:仅允许型的 claude.ai MCP 服务器允许列表覆盖
  • sandbox.bwrapPathsandbox.socatPath沙箱辅助二进制文件的文件系统路径
  • forceRemoteSettingsRefresh:在远程托管设置获取到最新版本前阻止启动。因此,即使不含此键的缓存远程负载是最高优先级来源,由 MDM 或文件策略设置的该键仍会生效

其他所有键(包括 allowManagedPermissionRulesOnlydisableBypassPermissionsMode)都只取自最高优先级来源。有关设置页中的同一规则,请参阅设置优先级

网关策略适用于计算机上的每次 Claude Code 调用,包括非交互式 claude -p 运行和 Agent SDK 启动的会话。如果启动时网关不可达,已登录的会话会报错退出,而不会在缺少策略的情况下运行。

网关启动时会拒绝策略 cli 块内的 mcpServers。目前无法按组分发 MCP;请通过每台设备上基于文件的 managed-mcp.json 部署 MCP 服务器,或允许开发者在本地添加。

telemetry

CLI 会通过 HTTP 发送 OpenTelemetry Protocol (OTLP) 指标、日志,以及启用后的跟踪数据;网关会将这些数据原样转发到各个已配置的目的地。有关 CLI 发出的指标和事件,请参阅监控用量

CLI 会在每次导出中附加已通过身份验证的用户身份,该身份从网关签发的 JWT 中读取,包括 user.iduser.emailuser.groups 属性。因此,无需开发者侧配置即可按开发者归属成本和用量。

telemetry:
  forward_to:
    - url: https://otel-collector.internal.example.com
      headers:
        Authorization: ${OTLP_TOKEN}
      # 按信号选择启用。默认:仅指标。
      metrics: true
      logs: false
      traces: false
    - url: https://api.datadoghq.com/api/v2/otlp
      headers:
        DD-API-KEY: ${DD_API_KEY}

每个目的地分别选择是否接收 metricslogstraces;默认仅接收指标。这些信号的敏感程度不同:

  • 指标:Token 数、请求数和延迟等汇总计数
  • 日志和跟踪数据:可能包含完整的 bash 命令、工具输入和文件路径,涵盖 Claude Code 在开发者计算机上执行的任何操作

仅当目的地具备与这些数据相称的访问控制和保留策略时,才启用日志和跟踪数据。

CLI 默认关闭遥测。同时配置 telemetry.forward_tolisten.public_url 会将其开启。网关会通过 /managed/settings 向每个已连接的客户端推送五个环境变量:

  • CLAUDE_CODE_ENABLE_TELEMETRY=1
  • OTEL_METRICS_EXPORTER=otlp
  • OTEL_LOGS_EXPORTER=otlp
  • OTEL_TRACES_EXPORTER=otlp
  • OTEL_EXPORTER_OTLP_ENDPOINT=<public_url>

推送的端点根据公开 URL 构造,因此开发者或策略无需为指标和日志提供任何 OTEL 配置。推送的配置在托管层级应用,会覆盖开发者在本地设置的 OTEL_* 变量。

跟踪数据还要求每个客户端设置 CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1。网关不会推送该变量,因此请通过托管策略的 env 块设置。该变量不在 CLI 安全列表中,因此通过策略下发时,也会触发推送 OTLP 端点时已会触发的同一个安全审批对话框

网关会中继 protobuf 和 JSON 两种 OTLP 编码,任何兼容 OpenTelemetry 的后端均可作为目的地。

HTTP 调优

四个可选顶层块 access_controllimitstimeoutsrate_limits 用于调整 HTTP 接口。默认值适合大多数部署。

默认值说明
access_controlallow_cidrs / deny_cidrs根据客户端地址对入站 IP 执行允许/拒绝规则,地址为经过 trusted_proxies 解析后的结果。先检查 deny_cidrs;即使客户端同时匹配 allow_cidrs,只要匹配拒绝规则就会被拒绝。如果 allow_cidrs 非空,网关默认拒绝未匹配的请求。/healthz/readyz 不受 allow_cidrs 限制。
limitsmax_request_bytes32 MiB入站请求正文的最大大小;超出限制的请求会在正文进入缓冲区前收到 413。处理大型文件或图像请求时可提高此值。
limitsmax_request_header_bytes未设置设置后,标头过大的请求返回 431
limitsmax_url_length未设置设置后,URL 过长的请求返回 414
timeoutsupstream_ttfb_ms120000等待上游响应标头的最长时间(首字节时间)。随后响应正文以流式方式传输,不受总时钟时长上限限制。此项适用于直接连接 Anthropic 的上游路径;其他每个提供商均受其 SDK 自身的超时限制。
rate_limitsdevice_authorization.max / .window_seconds30 / 600未经身份验证的设备授权端点按 IP 执行的限流。大型组织共用出口 IP 或 NAT 时可提高此值。这些限制仅适用于设备授权登录流程,不适用于 /v1/messages 推理。请参阅防止暴力破解用户代码
rate_limitsdevice_verify.max / .window_seconds10 / 600/device 上提交的 user_code 按 IP 执行限流。

完整示例

以下完整参考配置涵盖所有核心部分;HTTP 调优块保持默认值。复制该配置,删除不需要的部分,然后填入您自己的值。快速入门中的配置是此示例的最小版本。

gateway.yaml
# 运行命令:
#   claude gateway --config gateway.yaml
#
# 运行日志详细程度由 CLAUDE_GATEWAY_LOG_LEVEL
# 环境变量控制(info | warn | error;默认为 info)。这不会
# 影响审计事件,审计事件始终会发出。

listen:
  host: 0.0.0.0
  port: 8080
  public_url: https://claude-gateway.internal.example.com
  # 在终止 TLS 的 ingress 后运行时,请省略 tls 块。
  # tls:
  #   cert: /certs/gateway.crt
  #   key: /certs/gateway.key
  # trusted_proxies:
  #   - 10.0.0.0/8

oidc:
  issuer: https://example.okta.com
  client_id: 0oa1example2
  client_secret: ${OIDC_CLIENT_SECRET}
  allowed_email_domains:
    - example.com
  # 当 issuer 是 Okta org server 时必须启用,因为其 id_tokens
  # 可能省略 email 和 groups;网关会从 /userinfo 补全。
  userinfo_fallback: true
  # allowed_groups: [claude-code-users]
  # 只有请求 `groups` scope 且应用的 groups claim 筛选器允许时,
  # Okta 才会发出 groups。下方 contractors 策略按 groups 匹配,
  # 因此此处请求了该 scope。
  scopes: [openid, profile, email, offline_access, groups]
  # extra_auth_params: { access_type: offline, prompt: consent }  # Google
  # groups_claim: groups          # Entra 应用角色:使用 `roles`
  # email_claim: email

session:
  jwt_secret: ${GATEWAY_JWT_SECRET}   # openssl rand -base64 32
  # ttl_hours: 1

store:
  postgres_url: ${GATEWAY_POSTGRES_URL}
  # max_connections: 5

# 启用 /v1/organizations/spend_limits(与 Anthropic Admin API 一致)
# 以及 /v1/messages 上按开发者执行的消费限额。省略此部分即可禁用。
# 限额本身通过 admin API 设置,而不是在这里设置。
# admin:
#   write_keys:
#     - { id: terraform, key: "${GATEWAY_ADMIN_WRITE_KEY_TF}" }
#   read_keys:
#     - { id: reporting, key: "${GATEWAY_ADMIN_READ_KEY}" }
#   admin_groups: [platform-finops]
#   blocked_message: 如需提高限额,请访问 https://go.example.com/claude-limits
#   # audit_retention_days: 365
#   # spend_retention_months: 13
#   # identity_retention_days: 90
#   # group_limit_mode: min

# enforcement:
#   fail_closed_on_error: false

upstreams:
  - provider: anthropic
    auth:
      api_key: ${ANTHROPIC_API_KEY}

  # - provider: bedrock
  #   region: us-east-1
  #   auth: {}

  # - provider: anthropicAws
  #   region: us-east-1
  #   workspace_id: wrkspc_...
  #   auth:
  #     api_key: ${ANTHROPIC_AWS_API_KEY}

  # - provider: vertex
  #   region: us-east5
  #   project_id: example-prod
  #   auth: {}

  # - provider: foundry
  #   resource: example-foundry
  #   auth: { use_azure_ad: true }

auto_include_builtin_models: true
models:
  - id: claude-opus-4-8
    label: Claude Opus 4.8
    upstream_model:
      anthropic: claude-opus-4-8
      # bedrock: us.anthropic.claude-opus-4-8
      # anthropicAws: claude-opus-4-8
      # vertex: claude-opus-4-8
      # foundry: <your-opus-deployment-name>
  - id: claude-sonnet-4-6
    label: Claude Sonnet 4.6
    upstream_model:
      anthropic: claude-sonnet-4-6
  - id: claude-haiku-4-5
    label: Claude Haiku 4.5
    upstream_model:
      anthropic: claude-haiku-4-5

managed:
  policies:
    - match: { groups: [contractors] }
      cli:
        availableModels: [claude-haiku-4-5]
        # 将 Default 选择器选项限制为 availableModels,而不是
        # tier 默认值,以免 contractors 使用默认选项时遇到 400。
        enforceAvailableModels: true
        # allow 会自动批准这些工具,但不会阻止其余工具。
        # 添加 deny 规则以限制工具。
        permissions: { allow: [Read, Grep] }
    - match: {}
      cli:
        availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]
        permissions:
          allow: [Read, Grep, Bash, Edit]
          deny: ["WebFetch"]
        env: { HTTP_PROXY: http://proxy.example.com:8080 }

telemetry:
  forward_to:
    - url: https://otel.internal.example.com:4318
      headers:
        Authorization: Bearer ${OTEL_TOKEN}

客户端托管设置

以上内容用于配置网关服务器。开发者计算机如何连接网关则需要在每台设备上单独配置,具体通过 Claude Code 的托管设置完成。网关无法自行推送这些键,因为正是这些键告诉客户端网关位于何处。

对于 CLI,请在各操作系统的 managed-settings.json 中设置以下两个键:

{
  "forceLoginMethod": "gateway",
  "forceLoginGatewayUrl": "https://claude-gateway.internal.example.com"
}

将该文件部署到每台设备,通常可通过 MDM 平台完成。不同平台使用不同的文件路径:

平台路径
macOS/Library/Application Support/ClaudeCode/managed-settings.json,或 com.anthropic.claudecode 托管偏好设置域
Linux 和 WSL/etc/claude-code/managed-settings.json
WindowsC:\Program Files\ClaudeCode\managed-settings.json,或通过 HKLM 注册表使用组策略

forceLoginGatewayUrlforceLoginMethod"gateway" 值仅在管理员控制的托管层级中生效。开发者在自己的 ~/.claude/settings.json 中设置这些值不起作用。

博极客AI是专业人工智能学习平台,提供通俗易懂的AI入门教程、大模型应用、实战项目与行业动态,全站内容免费阅览,零基础也能轻松学AI,适配学生、职场新人及技术爱好者。

© 版权所有 2026 博极客AI,保留一切权利。