解决资源提供程序注册的错误

本文描述了当你使用尚未在 Azure 订阅中用过的资源提供程序时发生的资源提供程序注册错误。 使用 Bicep 文件或 Azure 资源管理器模板(ARM 模板)部署资源时会发生错误。 如果 Azure 不会自动注册资源提供程序,可以手动注册。

症状

部署资源时,可能会收到以下错误代码和消息:

Code: NoRegisteredProviderFound
Message: No registered resource provider found for location {location}
and API version {api-version} for type {resource-type}.

或者,可能收到类似的消息,指出:

Code: MissingSubscriptionRegistration
Message: The subscription is not registered to use namespace {resource-provider-namespace}

错误消息应提供有关支持的位置和 API 版本的建议。 可以将模板更改为使用建议的值。 Azure 门户或命令行接口会自动注册大多数提供程序;但非全部。 如果以前未使用特定的资源提供程序,则可能需要注册该提供程序。

禁用虚拟机 (VM) 的自动关闭功能时,可能会收到类似如下的错误消息:

Code: AuthorizationFailed
Message: The client '<identifier>' with object id '<identifier>' does not have authorization to perform
action 'Microsoft.Compute/virtualMachines/read' over scope ...

对于不在 ARM 模板或 Bicep 文件中的资源提供程序,可能会发生意外错误。 部署创建其他支持资源的资源时,可能会发生此错误。 例如,模板中的资源添加监视或安全资源。 错误消息指出需注册的资源提供程序命名空间用于支持资源。

原因

可能会由于以下原因之一而收到这些错误:

  • 尚未为订阅注册所需的资源提供程序。
  • 资源类型不支持该 API 版本。
  • 资源类型不支持该位置。
  • 对于 VM 自动关闭,必须注册 Microsoft.DevTestLab 资源提供程序。

解决方案

可以使用 Azure CLI 来获取有关资源提供程序注册状态的信息,以及注册资源提供程序。

使用 az provider list 显示订阅资源提供程序的注册状态。 这些示例使用 --output table 参数筛选输出,以提高可读性。 可以忽略该参数,查看所有属性。

以下命令列出所有订阅的资源提供程序以及它们是 Registered 还是 NotRegistered

az provider list --output table

可以按注册状态筛选输出。 将查询值替换为 RegisteredNotRegistered

az provider list --query "[?registrationState=='Registered']" --output table

获取特定资源提供程序的注册状态:

az provider list --query "[?namespace=='Microsoft.Compute']" --output table

若要注册资源提供程序,请使用 az provider register 命令,并指定要注册的命名空间。

az provider register --namespace Microsoft.Cdn

若要获取资源类型的受支持位置,请使用 az provider show

az provider show --namespace Microsoft.Web --query "resourceTypes[?resourceType=='sites'].locations"

获取资源类型的受支持的 API 版本:

az provider show --namespace Microsoft.Web --query "resourceTypes[?resourceType=='sites'].apiVersions"