诊断并排查 Azure Cosmos DB 的“已禁止”异常的问题

适用范围: NoSQL

HTTP 状态代码 403 表示已禁止完成请求。

防火墙阻止请求

数据平面请求可通过以下 3 个路径到达 Azure Cosmos DB。

  • 公共 Internet (IPv4)
  • 服务终结点
  • 专用终结点

当数据平面请求被阻止并出现“403 禁止访问”错误时,错误消息会详述请求已通过前面 3 个路径中的哪一个到达 Azure Cosmos DB。

  • Request originated from client IP {...} through public internet.
  • Request originated from client VNET through service endpoint.
  • Request originated from client VNET through private endpoint.

解决方案

了解请求预期通过哪个路径到达 Azure Cosmos DB。

  • 如果错误消息显示请求未通过预期路径到达 Azure Cosmos DB,则问题可能与客户端设置有关。 按照文档仔细检查客户端设置。
  • 如果请求通过预期路径到达了 Azure Cosmos DB,则系统会阻止请求,因为未为帐户配置源网络标识。 请根据请求到达 Azure Cosmos DB 的路径检查帐户的设置。
    • 公共 Internet:检查帐户的公用网络访问和 IP 范围筛选器配置。
    • 服务终结点:检查帐户的公用网络访问和虚拟网络筛选器配置。
    • 专用终结点:检查帐户的专用终结点配置和客户端的专用 DNS 配置。 存在此问题的原因可能是访问帐户所使用的专用终结点是为其他帐户设置的。

如果最近更新了帐户的防火墙配置,请记住应用更改最多需要 15 分钟。

分区键超出存储

在这种情况下,通常会看到如下错误:

Response status code does not indicate success: Forbidden (403); Substatus: 1014
Partition key reached maximum size of {...} GB

解决方案

此错误表示当前分区设计和工作负载尝试存储超过给定分区键值的允许数据量。 容器中的逻辑分区数没有限制,但每个逻辑分区可以存储的数据大小有限。 可以联系支持人员了解具体情况。

不允许非数据操作

尝试使用 Microsoft Entra ID 标识执行非数据操作时,会出现这种情况。 在这种情况下,通常会看到如下错误:

Operation 'POST' on resource 'calls' is not allowed through Azure Cosmos DB endpoint
Forbidden (403); Substatus: 5300; The given request [PUT ...] cannot be authorized by AAD token in data plane.

解决方案

通过 Azure 资源管理器、Azure 门户、Azure CLI 或 Azure PowerShell 执行该操作。 如果使用 Azure Functions Azure Cosmos DB 触发器,请确保触发器的 CreateLeaseContainerIfNotExists 属性未设置为 true。 使用 Microsoft Entra 标识可阻止任何非数据操作,例如创建租用容器。