Configuring Terraform and the provider version to use
The default behavior of Terraform is that, when executing the terraform init
command, the version of the Terraform binary (also called the Command-Line Interface (CLI)) used is the one installed on the local workstation. In addition, this command downloads the latest version of the providers used in the code.
Also, as we learned in Chapter 1, Setting Up the Terraform Environment, in the Upgrading Terraform providers recipe, this command creates the Terraform dependencies file, .terraform.lock.hcl
.
However, for compatibility reasons, it is always advisable to avoid surprises so that you can specify which version of the Terraform binary is going to be used in the Terraform configuration. The following are some examples:
- A Terraform configuration that uses language constructs introduced in version 0.12 must be executed with that or a greater version
- A Terraform configuration that contains new features, such as
count
andfor_each
, in modules must be executed with Terraform version 0.13 or greater
For more details about the HCL syntax, read the documentation at https://www.terraform.io/docs/configuration/syntax.html.
In the same way and for the same reasons of compatibility, we may want to specify the provider version to be used.
In this recipe, we will learn how to specify the Terraform version, as well as the provider version, that will be used.
Getting ready
To start this recipe, we will write a basic Terraform configuration file that contains the following code:
variable "resource_group_name" {
default = "rg_test"
}
resource "azurerm_resource_group" "rg" {
name = var.resource_group_name
location = "westeurope"
}
resource "azurerm_public_ip" "pip" {
name = "bookip"
location = "westeurope"
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Dynamic"
domain_name_label = "bookdevops"
}
The source code of this Terraform configuration is available at https://github.com/PacktPublishing/Terraform-Cookbook-Second-Edition/blob/main/CHAP02/version/specific-version.tf.
This example code provides resources in Azure (a resource group and a public IP address).
For more details about the Terraform azurerm
provider, read the following documentation: https://registry.terraform.io/providers/hashicorp/azurerm.
This Terraform configuration contains the improvements that were made to the HCL 2.0 language since Terraform 0.12 using the new interpolation syntax.
For more details about these HCL enhancements, go to https://www.slideshare.net/mitchp/terraform-012-deep-dive-hcl-20-for-infrastructure-as-code-remote-plan-apply-125837028.
Finally, when executing the terraform plan
command with this configuration, we get the following error messages:
Figure 2.1: A Terraform plan without a specified version
This means that, currently, this Terraform configuration is not compatible with the latest version of the provider (version 2.56).
Now, we need to be aware of the following compliances:
- This configuration can only be executed if Terraform 0.13 (or higher) is installed on the local workstation.
- Our current configuration can be executed even if the
azurerm
provider evolves with breaking changes.
Regarding the new features provided by Terraform 0.13, read the change log at https://github.com/hashicorp/terraform/blob/master/CHANGELOG.md and the upgrade guide at https://developer.hashicorp.com/terraform/language/v1.1.x/upgrade-guides/0-13.
The source code of this recipe is available at https://github.com/PacktPublishing/Terraform-Cookbook-Second-Edition/tree/main/CHAP02/version.
How to do it…
First, we specify the Terraform version to be installed on the local workstation:
- In the Terraform configuration, add the following block:
terraform { required_version = ">= 0.13,<=1" }
- To specify the provider source and version to use, we need to add the
required_provider
block inside the sameterraform
block configuration:terraform { ... required_providers { azurerm = { version = "2.10.0" } } }
How it works…
When executing the terraform
init
command, Terraform will check that the version of the installed Terraform binary that executes the Terraform configuration corresponds to the version specified in the required_version
property of the terraform
block.
If it matches, it won’t throw an error as it is greater than version 0.13. Otherwise, it will throw an error:
Figure 2.2: Terraform version incompatibility
Regarding the specification of the provider version, when executing the terraform init
command, if no version is specified, Terraform downloads the latest version of the provider. Otherwise, it downloads the specified version, as shown in the following two screenshots.
The following screenshot shows the provider plugin that will be downloaded from the specified source
without us specifying the required version
(at the time of writing, the latest version of the provider is 3.17.0):
Figure 2.3: Terraform init downloads the latest version of the provider
As we can see, the specific version of the azurerm
provider (3.17.0) has been downloaded.
In addition, the following screenshot shows the azurerm
provider plugin that will be downloaded when we specify the required version (2.10.0):
Figure 2.4: Terraform init downloads the specified provider version
As we can see, the specified version of the azurerm
provider (2.10.0) has been downloaded.
For more details about the required_version
block and provider versions, go to https://www.terraform.io/docs/configuration/terraform.html#specifying-required-provider-versions.
In the required_version
block, we also add the source
property, which was introduced in version 0.13 of Terraform and is documented at https://www.terraform.io/language/upgrade-guides/0-13#explicit-provider-source-locations.
There’s more…
In this recipe, we learned how Terraform downloads the azurerm
provider in several ways. What we did here applies to all providers you may wish to download.
It is also important to mention that the version of the Terraform binary that will be used is specified in the Terraform state file. This is to ensure that nobody applies this Terraform configuration with a lower version of the Terraform binary, thus ensuring that the format of the Terraform state file conforms with the correct version of the Terraform binary.
In the next recipe, we will implement a provider alias to use multiple instances of the same provider.
See also
- For more information about the properties of the Terraform block, go to https://www.terraform.io/language/settings.
- For more information about the properties of the providers, go to https://www.terraform.io/language/providers/configuration.
- More information about Terraform binary versioning is documented at https://www.terraform.io/plugin/sdkv2/best-practices/versioning.