Reputation: 576
We have been using older versions of azurerm provider("~> 3.0.2") however to provision the "azurerm_private_dns_resolver" we need a new azurerm provider("~> 3.30.2").
The below terraform code throws the following error
Could not retrieve the list of available versions for provider hashicorp/azurerm: no available releases match the given constraints ~> 3.0.2, ~> 3.30.0
# Azure Provider source and version being used
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.30.0"
}
}
required_version = ">= 1.1.0"
}
# Configure the Microsoft Azure provider
provider "azurerm" {
version = "~> 3.0.2"
features {}
}
provider "azurerm" {
alias = "latest"
version = "~> 3.30.0"
features {}
}
module "az-resource-group" {
source = "./modules/resource_group/"
providers = {
azurerm = azurerm.latest
}
az_rg_name = "example-resources"
az_rg_location = "Central US"
}
Update: As mentioned, I tried to break the providers into module
Resource Group Module:
Still getting the same error.
Upvotes: 0
Views: 4491
Reputation: 1338
As of now, it is not possible to use the same provider with multiple versions in the same codebase. You can resolve this by having two options.
.
├── .terraform
│ └── providers
│ └── registry.terraform.io
│ └── hashicorp
│ └── azurerm
│ └── 3.0.2
│ └── darwin_amd64
│ └── terraform-provider-azurerm_v3.0.2_x5
├── .terraform.lock.hcl
├── latest_provider_directory
│ ├── .terraform
│ │ └── providers
│ │ └── registry.terraform.io
│ │ └── hashicorp
│ │ └── azurerm
│ │ └── 3.32.0
│ │ └── darwin_amd64
│ │ └── terraform-provider-azurerm_v3.32.0_x5
│ ├── .terraform.lock.hcl
│ ├── providers.tf
│ └── new_resource.tf
├── providers.tf
└── old_resource.tf
providers.tf
## provider config supports old versions.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0.2"
}
}
required_version = ">= 1.1.0"
}
# Configure the Microsoft Azure provider
provider "azurerm" {
features {}
}
## provider config supports new versions in latest_provider_directory to support resources with new provider versions.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.32.0"
}
}
required_version = ">= 1.1.0"
}
provider "azurerm" {
features {}
}
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.32.0" ## upgrading means updating this version from current to new(required) version.
}
}
required_version = ">= 1.1.0"
}
provider "azurerm" {
features {}
}
Note: Kindly init and run a plan on your existing code with the new provider version once you upgrade it and verifies that you get the below message either locally or done in pipelines.
No changes. Your infrastructure matches the configuration.
Also going through azurerm-terraform-provider-Changelog would be good to get more insights.
As a side note Version constraints inside provider configuration blocks are deprecated and will be removed in a future version of Terraform
Tested this warning with terraform version
1.3.5
Your new update module has an explicit provider config, which means that this module can only be used with the mentioned config. which can be a bit more flexible either by removing the provider config or to support multiple versions for both terraform and provider.
Use this Directory structure for your current state:
.
├── latest_provider_terraform_files_directory
│ ├── providers.tf
│ └── resource_group.tf
├── modules
│ └── resource_group.tf
└── old_provider_terraform_files_directory
├── providers.tf
└── resource_group.tf
Detailed directory structure:
.
├── latest_provider_terraform_files_directory
│ ├── .terraform
│ │ ├── modules
│ │ │ └── modules.json
│ │ └── providers
│ │ └── registry.terraform.io
│ │ └── hashicorp
│ │ └── azurerm
│ │ └── 3.32.0
│ │ └── darwin_amd64
│ │ └── terraform-provider-azurerm_v3.32.0_x5
│ ├── .terraform.lock.hcl
│ ├── providers.tf
│ └── resource_group.tf
├── modules
│ └── resource_group.tf
└── old_provider_terraform_files_directory
├── .terraform
│ ├── modules
│ │ └── modules.json
│ └── providers
│ └── registry.terraform.io
│ └── hashicorp
│ └── azurerm
│ └── 3.0.2
│ └── darwin_amd64
│ └── terraform-provider-azurerm_v3.0.2_x5
├── .terraform.lock.hcl
├── providers.tf
└── resource_group.tf
Upvotes: 3
Reputation: 5250
I believe you can use the alias feature to get around this https://developer.hashicorp.com/terraform/language/modules/develop/providers#provider-aliases-within-modules
will look something like below where you pass the right alias to the module
provider "azurerm" {
alias = "old"
version = "~> 3.0.2"
features {}
}
provider "azurerm" {
alias = "latest"
version = "~> 3.30.0"
features {}
}
module "az-resource-group" {
source = "./modules/resource_group/"
//Pass your preferred provider here
providers = {
azurerm = azurerm.latest
}
az_rg_name = "example-resources"
az_rg_location = "Central US"
}
Upvotes: 1