简体   繁体   中英

Terraform optional provider for optional resource

I have a module where I want to conditionally create an s3 bucket in another region. I tried something like this:

resource "aws_s3_bucket" "backup" {
   count = local.has_backup ? 1 : 0
   provider = "aws.backup"
   bucket = "${var.bucket_name}-backup"
   versioning { 
     enabled = true
   }
}

but it appears that I need to provide the aws.backup provider even if count is 0. Is there any way around this?

NOTE: this wouldn't be a problem if I could use a single provider to create buckets in multiple regions, see https://github.com/terraform-providers/terraform-provider-aws/issues/8853

Based on your description, I understand that you want to create resources using the same "profile", but in a different region. For that case I would take the following approach:

Create a module file for you s3_bucket_backup, in that file you will build your "backup provider" with variables.

# Module file for s3_bucket_backup
provider "aws" {
  region  = var.region
  profile = var.profile
  alias   = "backup"
}

variable "profile" {
  type            = string
  description     = "AWS profile"
}

variable "region" {
  type            = string
  description     = "AWS profile"
}

variable "has_backup" {
  type            = bool
  description     = "AWS profile"
}

variable "bucket_name" {
  type            = string
  description     = "VPC name"
}

resource "aws_s3_bucket" "backup" {
   count          = var.has_backup ? 1 : 0
   provider       = aws.backup
   bucket         = "${var.bucket_name}-backup"
}

In your main tf file, declare your provider profile using local variables, call the module passing the profile and a different region

# Main tf file
provider "aws" {
  region      = "us-east-1"
  profile     = local.profile
}

locals {
  profile     = "default"
  has_backup  = false
}

module "s3_backup" {
  source            = "./module"
  profile           = local.profile
  region            = "us-east-2"
  has_backup        = true
  bucket_name       = "my-bucket-name"
}

And there you have it, you can now build your s3_bucket_backup using the same "profile" with different regions.

In the case above, the region used by the main file is us-east-1 and the bucket is created on us-east-2.

If you set has_backup to false, it won't create anything.

Since the "backup provider" is build inside the module, your code won't look "dirty" for having multiple providers in the main tf file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM