Bird
Raised Fist0
Terraformcloud~7 mins

Multiple provider configurations in Terraform - Commands & Configuration

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Sometimes you need to manage resources in different cloud accounts or regions. Multiple provider configurations let you connect to more than one place at the same time using Terraform.
When you want to create resources in two different AWS regions in the same Terraform project.
When you manage infrastructure for two separate AWS accounts from one Terraform setup.
When you need to test changes in a staging environment while keeping production separate.
When you want to organize resources by provider settings without mixing them.
When you need to use different credentials or settings for the same cloud provider.
Config File - main.tf
main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
  alias  = "use1"
}

provider "aws" {
  region = "us-west-2"
  alias  = "usw2"
}

resource "aws_s3_bucket" "bucket_use1" {
  provider = aws.use1
  bucket   = "example-bucket-use1"
  acl      = "private"
}

resource "aws_s3_bucket" "bucket_usw2" {
  provider = aws.usw2
  bucket   = "example-bucket-usw2"
  acl      = "private"
}

This Terraform file sets up two AWS providers with different regions using aliases. The provider blocks define connection details for each region. The resource blocks create two S3 buckets, each using a different provider alias to specify which region to create the bucket in.

Commands
This command initializes the Terraform project, downloads the AWS provider plugin, and prepares the working directory.
Terminal
terraform init
Expected OutputExpected
Initializing the backend... Initializing provider plugins... - Finding hashicorp/aws versions matching "~> 4.0"... - Installing hashicorp/aws v4.60.0... - Installed hashicorp/aws v4.60.0 (signed by HashiCorp) Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure.
This command shows what Terraform will do. It checks the configuration and shows the resources it will create in each AWS region.
Terminal
terraform plan
Expected OutputExpected
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # aws_s3_bucket.bucket_use1 will be created + resource "aws_s3_bucket" "bucket_use1" { + acl = "private" + bucket = "example-bucket-use1" + id = (known after apply) } # aws_s3_bucket.bucket_usw2 will be created + resource "aws_s3_bucket" "bucket_usw2" { + acl = "private" + bucket = "example-bucket-usw2" + id = (known after apply) } Plan: 2 to add, 0 to change, 0 to destroy.
This command applies the changes to create the S3 buckets in both AWS regions without asking for confirmation.
Terminal
terraform apply -auto-approve
Expected OutputExpected
aws_s3_bucket.bucket_use1: Creating... aws_s3_bucket.bucket_usw2: Creating... aws_s3_bucket.bucket_use1: Creation complete after 2s [id=example-bucket-use1] aws_s3_bucket.bucket_usw2: Creation complete after 2s [id=example-bucket-usw2] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
→
-auto-approve - Skip interactive approval before applying changes
This command lists all resources Terraform is managing, showing both buckets created in different regions.
Terminal
terraform state list
Expected OutputExpected
aws_s3_bucket.bucket_use1 aws_s3_bucket.bucket_usw2
Key Concept

If you remember nothing else from this pattern, remember: use provider aliases to tell Terraform which provider configuration to use for each resource.

Common Mistakes
Not using aliases for multiple provider blocks of the same type
Terraform cannot distinguish between providers without aliases and will give an error.
Always assign a unique alias to each provider block when using multiple configurations of the same provider.
Forgetting to specify the provider alias in resource blocks
Resources will default to the unnamed provider and may be created in the wrong region or account.
Specify the provider with the alias in each resource block using the syntax: provider = aws.alias_name.
Summary
Define multiple provider blocks with unique aliases to connect to different regions or accounts.
Use the provider alias in resource blocks to control where resources are created.
Run terraform init to prepare, terraform plan to preview, and terraform apply to create resources.

Practice

(1/5)
1. What is the main purpose of using multiple provider configurations in Terraform?
easy
A. To reduce the size of Terraform state files
B. To speed up Terraform plan execution
C. To manage resources in different cloud accounts or regions
D. To automatically backup Terraform configurations

Solution

  1. Step 1: Understand provider role

    Providers in Terraform define where resources are created, such as cloud accounts or regions.
  2. Step 2: Purpose of multiple providers

    Using multiple providers allows managing resources across different accounts or regions simultaneously.
  3. Final Answer:

    To manage resources in different cloud accounts or regions -> Option C
  4. Quick Check:

    Multiple providers = manage multiple accounts/regions [OK]
Hint: Multiple providers = multiple accounts or regions [OK]
Common Mistakes:
  • Thinking multiple providers speed up execution
  • Confusing providers with state file management
  • Assuming providers handle backups
2. Which Terraform syntax correctly defines a second AWS provider with an alias named east?
easy
A. provider "aws" { alias = "east" region = "us-east-1" }
B. provider "aws" { region = "us-east-1", alias = "east" }
C. provider "aws" { region = "us-east-1" } alias = "east"
D. provider "aws" alias = "east" { region = "us-east-1" }

Solution

  1. Step 1: Check provider block syntax

    The alias attribute must be inside the provider block, before or after region.
  2. Step 2: Validate provider "aws" { alias = "east" region = "us-east-1" }

    provider "aws" { alias = "east" region = "us-east-1" } correctly places alias = "east" inside the provider block with region.
  3. Final Answer:

    provider "aws" { alias = "east" region = "us-east-1" } -> Option A
  4. Quick Check:

    Alias inside provider block = correct syntax [OK]
Hint: Alias must be inside provider block braces [OK]
Common Mistakes:
  • Placing alias outside provider block
  • Using alias without quotes
  • Misordering block elements causing syntax errors
3. Given this Terraform snippet:
provider "aws" {
  region = "us-west-2"
}

provider "aws" {
  alias  = "east"
  region = "us-east-1"
}

resource "aws_s3_bucket" "bucket1" {
  bucket = "west-bucket"
}

resource "aws_s3_bucket" "bucket2" {
  provider = aws.east
  bucket   = "east-bucket"
}

Which region will bucket2 be created in?
medium
A. us-west-2
B. us-east-2
C. us-west-1
D. us-east-1

Solution

  1. Step 1: Identify provider for bucket2

    bucket2 uses provider = aws.east, which refers to the aliased provider with region us-east-1.
  2. Step 2: Confirm region of aliased provider

    The alias "east" is set with region = "us-east-1".
  3. Final Answer:

    us-east-1 -> Option D
  4. Quick Check:

    Aliased provider region = us-east-1 [OK]
Hint: Resource uses aliased provider region [OK]
Common Mistakes:
  • Assuming default provider region applies
  • Ignoring provider alias in resource
  • Confusing region names
4. What is wrong with this Terraform configuration snippet?
provider "aws" {
  region = "us-west-2"
}

provider "aws" {
  alias = "east"
  region = "us-east-1"
}

resource "aws_instance" "example" {
  provider = aws.east
  ami      = "ami-123456"
  instance_type = "t2.micro"
}

resource "aws_instance" "example2" {
  provider = aws.west
  ami      = "ami-654321"
  instance_type = "t2.micro"
}
medium
A. The provider alias 'east' is missing region
B. The alias 'west' is not defined for any provider
C. The resource 'example' is missing provider assignment
D. The provider block syntax is invalid

Solution

  1. Step 1: Check provider aliases defined

    Only alias 'east' is defined; no alias 'west' exists.
  2. Step 2: Identify usage of undefined alias

    Resource 'example2' uses provider = aws.west, which is undefined and causes an error.
  3. Final Answer:

    The alias 'west' is not defined for any provider -> Option B
  4. Quick Check:

    Undefined alias causes error [OK]
Hint: Check all provider aliases are defined before use [OK]
Common Mistakes:
  • Assuming default provider applies to aliased names
  • Missing alias attribute in provider block
  • Incorrect provider block syntax
5. You want to deploy resources to two AWS accounts: Account A in us-west-2 and Account B in us-east-1. You have two provider blocks with aliases west and east. How do you ensure that an S3 bucket resource is created in Account B using Terraform?
hard
A. Set provider = aws.east in the S3 bucket resource block
B. Set region = "us-east-1" inside the S3 bucket resource block
C. Use alias = "east" inside the S3 bucket resource block
D. Create a new provider block inside the S3 bucket resource

Solution

  1. Step 1: Understand provider alias usage

    To deploy to Account B, the resource must use the provider with alias 'east'.
  2. Step 2: Assign provider alias to resource

    Setting provider = aws.east in the resource block directs Terraform to use that provider configuration.
  3. Final Answer:

    Set provider = aws.east in the S3 bucket resource block -> Option A
  4. Quick Check:

    Resource provider = aliased provider [OK]
Hint: Assign provider alias in resource block to target account [OK]
Common Mistakes:
  • Trying to set region inside resource instead of provider
  • Using alias attribute inside resource block incorrectly
  • Defining provider block inside resource block