Jon Sud
Jon Sud

Reputation: 11671

In Terraform is there a way to use different provider for module?

I using https://github.com/cloudposse/terraform-aws-acm-request-certificate to generate certificate using terraform and aws.

Is there a way to use different provider for module?

I mean in the first module I want to do it in region us-east-1, and the other I want to do it in us-east-2.

But since I have one provider, this is possible to do with terraform in single file or single directory?

provider "aws" {
  version = "~> 2.12.0"
  profile = "..."
  region  = "us-east-1"
}

module "example_com" {
  # Should be in us-east-1
  source                            = "git::https://github.com/cloudposse/terraform-aws-acm-request-certificate.git?ref=master"
  domain_name                       = "example.com"
  process_domain_validation_options = false
  ttl                               = "300"
  subject_alternative_names         = ["*.example.com"]
}

module "cdn_example_com" {

  # Should be in us-east-2
  source                            = "git::https://github.com/cloudposse/terraform-aws-acm-request-certificate.git?ref=master"
  domain_name                       = "cdn.example.com"
  process_domain_validation_options = false
  ttl                               = "300"
}

Something like:

provider "aws" "aws-east-1" {
  version = "~> 2.12.0"
  profile = "..."
  region  = "us-east-1"
}

provider "aws" "aws-east-2" {
  version = "~> 2.12.0"
  profile = "..."
  region  = "us-east-2"
}

module "example_com" {
  provider = "aws-east-1"

  source                            = "git::https://github.com/cloudposse/terraform-aws-acm-request-certificate.git?ref=master"
  domain_name                       = "example.com"
  process_domain_validation_options = false
  ttl                               = "300"
  subject_alternative_names         = ["*.example.com"]
}

module "cdn_example_com" {

  provider = "aws-east-2"

  # Should be in us-east-2
  source                            = "git::https://github.com/cloudposse/terraform-aws-acm-request-certificate.git?ref=master"
  domain_name                       = "cdn.example.com"
  process_domain_validation_options = false
  ttl                               = "300"
}

Upvotes: 2

Views: 1185

Answers (2)

Marcin
Marcin

Reputation: 238867

Based on the terraform documation you can create different providers and "pass" them to modules.

In your case, this could be the following:

provider "aws" {
  version = "~> 2.12.0"
  profile = "..."
  region  = "us-east-1"
}


# create second provider with alias of "us-east-2" 
provider "aws" {
  version = "~> 2.12.0"
  profile = "..."
  region  = "us-east-2"
  alias   = "us-east-2" 
}

#
# Then for your modules
#

# use default provider
module "example_com" {

  source                            = "git::https://github.com/cloudposse/terraform-aws-acm-request-certificate.git?ref=master"
  domain_name                       = "example.com"
  process_domain_validation_options = false
  ttl                               = "300"
  subject_alternative_names         = ["*.example.com"]
}


# use non-default provider
module "cdn_example_com" {

   providers = {
    aws = aws.us-east-2
  }

  # Should be in us-east-2
  source                            = "git::https://github.com/cloudposse/terraform-aws-acm-request-certificate.git?ref=master"
  domain_name                       = "cdn.example.com"
  process_domain_validation_options = false
  ttl                               = "300"
}

Upvotes: 2

Prashanna
Prashanna

Reputation: 1001

The below link might come in handy to solve your purpose

Multi region terraform

Upvotes: 2

Related Questions