Recently I needed to create a backup vault resource in Cape Town region, but only if the region is enabled in the AWS account. Straight approach:
provider "aws" {
region = "af-south-1"
alias = "af-south-1"
}
resource "aws_backup_vault" "af_south_1" {
provider = aws.af-south-1
name = "default"
}
would throw exception if af-south-1 region is not enabled for the account. Terraform has the ability to create a resource only if certain condition is met (via count = meta property), but it cannot conditionally declare providers.
But we can conditionally redirect the provider.
Even though we cannot enable/disable AWS provider declaration, we can conditionally select region where it’s declared:
data "aws_regions" "current" {}
locals {
af_supported =
contains(data.aws_region.current.names, "af-south-1")
}
provider "aws" {
region = local.af_supported? "af-south-1" : "us-west-2"
alias = "af-south-1"
}
Here, if af-south-1 region is supported – AWS provider will be initialized in this region. Otherwise it will be initialized in us-west-2.
But we don’t want to create any resources in us-west-2, so we just add this condition to the resource declaration:
resource "aws_backup_vault" "af_south_1" {
count = local.af_supported? 1 : 0
provider = aws.af-south-1
name = "default"
}
If af-south-1 region is supported – the resource will be created (with the provider in the correct region). Otherwise resource creation will be skipped.
