Skip to main content

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"
}
}
}
tip

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.

warning

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.

tip

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.
  1. To change from the old aiven_vpc_peering_connection to the new aiven_azure_vpc_peering_connection resource, the resource type should be changed. Any references to aiven_vpc_peering_connection.foo.* should be updated to instead read aiven_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"
    }
  2. Check the current state of the world:

    terraform state list | grep azure
  3. Remove the resource from the control of Terraform:

    terraform state rm aiven_vpc_peering_connection.foo
    tip

    Use the -dry-run flag to see this change before it is actually made

  4. 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
  5. Check that the import is going to run as you expect:

    terraform plan
  6. Apply the new configuration:

    terraform apply
    note

    You can follow a similar approach to update aiven_database and aiven_service_user resources, which have been deprecated in v3 of the provider.