如何在使用AzureRM提供程序的Terraform中指定资源提供程序版本
Terraform配置Azure资源时指定API版本的方法
首先明确核心设计差异:
- 和ARM模板支持给单资源显式配置
apiVersion的逻辑不同,官方azurerm提供程序不开放单资源API版本的自定义配置入口。 - ARM模板本质是直接透传调用Azure RM REST API,所以必须显式声明调用的API版本;但
azurerm提供程序已经把所有支持资源的适配API版本封装在了提供程序的版本包内,你使用的azurerm提供程序版本,就决定了所有资源部署时默认调用的API版本,不需要额外给单个资源配置参数。
常规场景下匹配目标API版本的方式
你只需要在Terraform配置中明确锁定azurerm提供程序的版本即可,配置示例如下:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "=3.99.0" # 锁定到你需要的具体版本 } } } provider "azurerm" { features {} }
每个正式发布的azurerm版本都会在更新说明中标注内置的各资源API版本信息,你只要选择内置了你需要的目标API版本的提供程序版本即可,不需要额外调整单资源配置。
需要强制使用特定API版本的特殊场景处理
如果你需要用的API版本(多为新上线的预览版API)还没被当前稳定版azurerm提供程序封装支持,有两种可选方案:
- 方案1:升级
azurerm提供程序到已经适配了目标API版本的更高版本,优先选择正式发布的稳定版使用 - 方案2:使用
azapi提供程序做补充配置,这个提供程序的调用逻辑和ARM模板一致,支持手动指定任意资源的API版本,适合使用azurerm尚未覆盖的新功能/预览API,配置示例如下:
# 注意:type参数中@后面的部分就是你指定的API版本 resource "azapi_resource" "example_storage" { type = "Microsoft.Storage/storageAccounts@2023-05-01" name = "teststorage001" location = "chinaeast2" parent_id = azurerm_resource_group.example.id body = jsonencode({ sku = { name = "Standard_GRS" } kind = "StorageV2" properties = { supportsHttpsTrafficOnly = true } }) }
注意:非必要不推荐手动强制指定API版本,
azurerm封装的资源会自动做参数校验、状态同步、兼容性适配,手动指定API版本时这些能力会缺失,容易出现部署失败、配置漂移的问题。
内容的提问来源于stack exchange,提问作者Pradeep
相关产品推荐
相关产品推荐

