Upgrade Aiven Provider for Terraform from v2 to v3
Learn how to upgrade Aiven Terraform Provider v2 to v3.
Major changes in v3
Aiven Terraform Provider has a detailed changelog but the main additions in v3 are:
- Generic
aiven_vpc_peering_connection
replaced with provider specific resources - Generic
aiven_service_user
replaced with service specific resources - Generic
aiven_database
replaced with service specific resources
Upgrade Aiven Terraform Provider to v3
Update the Aiven Terraform Provider by editing the providers block of your script to include the latest version of the Aiven Terraform Provider (v3.8.1 at the time of writing):
terraform {
required_providers {
aiven = {
source = "aiven/aiven"
version = ">=3.0.0, < 4.0.0"
}
}
}
You might need to run terraform init -upgrade
for the provider version
upgrade to take place.
Update to provider specific VPC peering connection resource syntax
V3 of the Aiven Terraform Provider moves away from using
aiven_vpc_peering_connection
as a resource, and instead provides
provider specific resources such as
aiven_azure_vpc_peering_connection
.
Since aiven_vpc_peering_connection
and the new one such as
aiven_azure_vpc_peering_connection
are different kinds of resources,
rewriting the code would cause destructive actions. These steps
will preserve your resources.
Also note that running terraform state mv <a> <b>
is not
recommended because these are different resource types.
Backup your Terraform state file terraform.tfstate
(if available),
just in case of potential rollback.
To safely make this change you will:
- Change the code
- Remove old resource from the state
- Import already existing resource to the Terraform state.
-
To change from the old
aiven_vpc_peering_connection
to the newaiven_azure_vpc_peering_connection
resource, the resource type should be changed. Any references toaiven_vpc_peering_connection.foo.*
should be updated to instead readaiven_azure_vpc_peering_connection.foo.*
instead.The output looks like:
- resource "aiven_vpc_peering_connection" "foo" {
vpc_id = data.aiven_project_vpc.vpc.id
- peer_cloud_account = "Azure subscription ID"
- peer_vpc = "Azure virtual network name of the peered VPC"
peer_azure_app_id = "Azure app registration id in UUID4 form"
peer_azure_tenant_id = "Azure tenant id in UUID4 form"
peer_resource_group = "Azure resource group name of the peered VPC"
}
+ resource "aiven_azure_vpc_peering_connection" "foo" {
vpc_id = data.aiven_project_vpc.vpc.id
+ azure_subscription_id = "Azure subscription ID"
+ vnet_name = "Azure virtual network name of the peered VPC"
peer_azure_app_id = "Azure app registration id in UUID4 form"
peer_azure_tenant_id = "Azure tenant id in UUID4 form"
peer_resource_group = "Azure resource group name of the peered VPC"
} -
Check the current state of the world:
terraform state list | grep azure
-
Remove the resource from the control of Terraform:
terraform state rm aiven_vpc_peering_connection.foo
tipUse the
-dry-run
flag to see this change before it is actually made -
Add the resource back to Terraform by importing it as a new resource with the new type:
terraform import aiven_azure_vpc_peering_connection.foo project_name/vpc_id/azure_subscription_id/vnet_name
-
Check that the import is going to run as you expect:
terraform plan
-
Apply the new configuration:
terraform apply
noteYou can follow a similar approach to update
aiven_database
andaiven_service_user
resources, which have been deprecated in v3 of the provider.