Bird
Raised Fist0
Terraformcloud~5 mins

Provider aliases for multi-region 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
When you want to manage resources in multiple cloud regions using Terraform, you need a way to tell Terraform which region to use for each resource. Provider aliases let you configure multiple versions of the same provider, each set to a different region, so you can deploy resources across regions in one Terraform project.
When you want to deploy a virtual machine in us-east-1 and another in us-west-2 within the same Terraform configuration.
When you manage a database in one region and a storage bucket in another region for latency or compliance reasons.
When you need to test your infrastructure in multiple regions without duplicating your Terraform code.
When you want to keep your infrastructure organized but still use one Terraform state file for multiple regions.
When you want to automate disaster recovery by deploying resources in a secondary region.
Config File - main.tf
main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

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

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

resource "aws_s3_bucket" "east_bucket" {
  bucket = "example-bucket-east-12345"
  acl    = "private"
}

resource "aws_s3_bucket" "west_bucket" {
  provider = aws.west
  bucket   = "example-bucket-west-12345"
  acl      = "private"
}

The terraform block sets the AWS provider version.

The first provider "aws" block configures the default AWS provider for the us-east-1 region.

The second provider "aws" block uses the alias "west" to configure AWS for the us-west-2 region.

The aws_s3_bucket.east_bucket resource uses the default provider and creates a bucket in us-east-1.

The aws_s3_bucket.west_bucket resource specifies provider = aws.west to use the aliased provider and creates a bucket in us-west-2.

Commands
This command initializes the Terraform working directory, downloads the AWS provider plugin, and prepares Terraform to manage resources.
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. All Terraform commands should now work.
This command shows what Terraform will create or change. It verifies that the configuration is valid and previews the resources to be created in both regions.
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.east_bucket will be created + resource "aws_s3_bucket" "east_bucket" { + acl = "private" + bucket = "example-bucket-east-12345" + id = (known after apply) } # aws_s3_bucket.west_bucket will be created + resource "aws_s3_bucket" "west_bucket" { + acl = "private" + bucket = "example-bucket-west-12345" + id = (known after apply) } Plan: 2 to add, 0 to change, 0 to destroy.
This command applies the planned changes and creates the S3 buckets in both regions without asking for confirmation.
Terminal
terraform apply -auto-approve
Expected OutputExpected
aws_s3_bucket.east_bucket: Creating... aws_s3_bucket.west_bucket: Creating... aws_s3_bucket.east_bucket: Creation complete after 2s [id=example-bucket-east-12345] aws_s3_bucket.west_bucket: Creation complete after 2s [id=example-bucket-west-12345] Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
→
-auto-approve - Skips interactive approval before applying changes
This command lists all resources Terraform manages in the current state, showing both buckets in different regions.
Terminal
terraform state list
Expected OutputExpected
aws_s3_bucket.east_bucket aws_s3_bucket.west_bucket
Key Concept

If you remember nothing else from this pattern, remember: provider aliases let you configure multiple regions by naming each provider separately and assigning resources to the right one.

Common Mistakes
Not specifying the provider alias in the resource block for the second region.
Terraform will use the default provider for all resources, causing resources to be created in the wrong region.
Always add the provider attribute with the correct alias, like provider = aws.west, to resources meant for the non-default region.
Using the same bucket name in both regions.
S3 bucket names must be globally unique, so Terraform will fail to create the second bucket if the name is reused.
Use unique bucket names for each region to avoid conflicts.
Summary
Define multiple provider blocks with different regions using aliases.
Assign resources to the correct provider using the provider attribute with the alias.
Use terraform init, plan, and apply to deploy resources across regions in one configuration.

Practice

(1/5)
1. What is the main purpose of using provider aliases in Terraform when working with multiple regions?
easy
A. To configure multiple providers with different regions in the same Terraform project
B. To create multiple resources in the same region automatically
C. To avoid using providers in Terraform
D. To deploy resources only in the default region

Solution

  1. Step 1: Understand provider aliases concept

    Provider aliases allow defining multiple configurations of the same provider, each with different settings like region.
  2. Step 2: Recognize multi-region use case

    Using aliases lets you deploy resources to different regions by specifying which provider alias to use.
  3. Final Answer:

    To configure multiple providers with different regions in the same Terraform project -> Option A
  4. Quick Check:

    Provider aliases = multi-region config [OK]
Hint: Aliases let you set different regions per provider [OK]
Common Mistakes:
  • Thinking aliases create resources automatically
  • Confusing aliases with resource names
  • Assuming aliases remove the need for providers
2. Which of the following is the correct syntax to define a provider alias for AWS in the us-west-2 region?
easy
A. provider "aws.west" { region = "us-west-2" }
B. provider "aws" { alias = "west" region = "us-west-2" }
C. provider "aws" { region = "us-west-2" } alias = "west"
D. provider "aws" { region = "us-west-2"; alias = "west" }

Solution

  1. Step 1: Recall correct provider block syntax

    Provider blocks use key-value pairs inside braces, with each pair separated by new lines or spaces, no semicolons.
  2. Step 2: Identify correct order and syntax

    The alias attribute must be inside the provider block along with region, separated by new lines or spaces, no semicolons.
  3. Final Answer:

    provider "aws" { alias = "west" region = "us-west-2" } -> Option B
  4. Quick Check:

    Alias and region inside provider block without semicolons [OK]
Hint: Put alias and region inside provider block, no semicolons [OK]
Common Mistakes:
  • Using semicolons inside provider block
  • Placing alias outside the provider block
  • Incorrect order with alias after block
3. Given the following Terraform snippet, what region will the aws_instance resource be created in?
provider "aws" {
  region = "us-east-1"
}

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

resource "aws_instance" "example" {
  provider = aws.west
  ami      = "ami-123456"
  instance_type = "t2.micro"
}
medium
A. us-east-1
B. Region is not specified, so error occurs
C. us-west-2
D. Default region of AWS CLI

Solution

  1. Step 1: Identify provider alias usage in resource

    The resource uses provider = aws.west, which refers to the aliased provider with region us-west-2.
  2. Step 2: Confirm region of aliased provider

    The alias "west" is configured with region "us-west-2", so the resource will be created there.
  3. Final Answer:

    us-west-2 -> Option C
  4. Quick Check:

    Resource uses aliased provider region [OK]
Hint: Resource uses provider alias region, not default [OK]
Common Mistakes:
  • Assuming default provider region is used
  • Confusing alias name with region
  • Thinking AWS CLI config affects Terraform provider region
4. You wrote this Terraform code but get an error: Invalid provider configuration. What is wrong?
provider "aws" {
  region = "us-east-1"
}

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

resource "aws_s3_bucket" "bucket" {
  provider = aws.east
  bucket   = "my-bucket"
}
medium
A. The alias must be declared as alias = "east" inside the provider block
B. You cannot have two providers with the same region
C. The resource should not specify a provider alias
D. The alias name must be different from the provider name

Solution

  1. Step 1: Check alias syntax

    The alias is declared outside the provider block after the closing brace, which causes the invalid configuration error.
  2. Step 2: Correct placement

    The alias attribute must be inside the provider block along with the region.
  3. Final Answer:

    The alias must be declared as alias = "east" inside the provider block -> Option A
  4. Quick Check:

    Alias must be inside provider block [OK]
Hint: Alias must be inside provider block exactly [OK]
Common Mistakes:
  • Defining alias outside provider block
  • Using same alias for multiple providers
  • Not specifying provider in resource
5. You want to deploy an AWS EC2 instance in us-east-1 and an S3 bucket in us-west-2 using provider aliases. Which Terraform configuration correctly sets up the providers and assigns them to the resources?
hard
A. provider "aws" { region = "us-east-1" } provider "aws" { alias = "west" region = "us-west-2" } resource "aws_instance" "example" { provider = aws.west ami = "ami-abc123" instance_type = "t2.micro" } resource "aws_s3_bucket" "bucket" { bucket = "my-bucket" }
B. provider "aws" { alias = "east" region = "us-east-1" } provider "aws" { alias = "west" region = "us-west-2" } resource "aws_instance" "example" { provider = aws.west ami = "ami-abc123" instance_type = "t2.micro" } resource "aws_s3_bucket" "bucket" { provider = aws.west bucket = "my-bucket" }
C. provider "aws" { region = "us-east-1" alias = "east" } provider "aws" { region = "us-west-2" alias = "west" } resource "aws_instance" "example" { provider = aws.east ami = "ami-abc123" instance_type = "t2.micro" } resource "aws_s3_bucket" "bucket" { provider = aws.west bucket = "my-bucket" }
D. provider "aws" { region = "us-east-1" } provider "aws" { alias = "west" region = "us-west-2" } resource "aws_instance" "example" { ami = "ami-abc123" instance_type = "t2.micro" } resource "aws_s3_bucket" "bucket" { provider = aws.west bucket = "my-bucket" }

Solution

  1. Step 1: Define providers with and without alias

    Default provider is for us-east-1 (no alias). Aliased provider "west" is for us-west-2.
  2. Step 2: Assign providers to resources

    EC2 instance uses default provider (us-east-1). S3 bucket uses aliased provider aws.west (us-west-2).
  3. Step 3: Verify resource provider assignments

    Resource aws_instance has no provider attribute, so uses default. Resource aws_s3_bucket specifies provider = aws.west.
  4. Final Answer:

    The configuration using a default provider for us-east-1 and an aliased provider for us-west-2 -> Option D
  5. Quick Check:

    Default provider for us-east-1, alias for us-west-2 [OK]
Hint: Default provider for main region, alias for others, assign in resource [OK]
Common Mistakes:
  • Assigning alias to default provider
  • Not specifying provider for multi-region resources
  • Using alias inside default provider block