Skip to main content

Managing Terraform Providers

1. Declaring Provider Blocks

Property Value Description
source hashicorp/aws Registry path for the provider
version ~> 5.0 Version constraint for the provider
alias us_west Unique identifier for multiple provider instances

Example: Basic Provider Block

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

Example: Provider with Alias

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

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

2. Configuring Provider Settings

Setting Description Example
version Specifies the version of the provider to use "~> 3.0"
alias Allows multiple instances of the same provider alias = "us-west"
configuration Provider-specific configuration parameters region = "us-west-2"

Example: Provider Configuration

provider "aws" {
  region = "us-west-2"
  version = "~> 5.0"
}

provider "aws" {
  alias = "us-east"
  region = "us-east-1"
  version = "~> 5.0"
}
Note: Provider versions should be pinned to ensure consistent deployments across environments.

3. Using Multiple Provider Instances

Provider Alias Configuration Usage
aws.east provider "aws" {
  alias = "east"
  region = "us-east-1"
}
Used in resources with provider = aws.east
aws.west provider "aws" {
  alias = "west"
  region = "us-west-2"
}
Used in resources with provider = aws.west

Example: Using Different AWS Regions

resource "aws_instance" "web_east" {
  provider = aws.east
  ami = "ami-12345678"
  instance_type = "t2.micro"
}

resource "aws_instance" "web_west" {
  provider = aws.west
  ami = "ami-87654321"
  instance_type = "t2.micro"
}
Note: Aliases allow managing resources across multiple regions or accounts with the same provider type.

4. Setting Provider Version Constraints

Constraint Type Syntax Description Notes
Version version = "1.2.3" Exact version Useful for stable environments
Version Range version = ">= 1.0.0, < 2.0.0" Range of versions Allows minor updates but blocks major changes
Version Pinning version = "~> 1.2" Compatible with 1.2.x Allows patch updates but not minor changes
Version Wildcard version = ">= 1.0.0" Any version equal or greater Useful for development environments

Example: Provider Version Constraint

provider "aws" {
  region = "us-west-2"
  version = ">= 4.0.0, < 5.0.0"
}
Note: Version constraints are defined in the required_providers block or directly in the provider configuration. Using strict versioning ensures reproducible infrastructure.

5. Understanding Provider Requirements

Property Description Example
required_providers Defines the providers required for the configuration {"aws" = {"source" = "hashicorp/aws", "version" = ">= 4.0"}}
source Location of the provider (registry, local path, or custom) hashicorp/aws
version Version constraint for the provider >= 4.0, != 4.5.0

Example: Declaring a Provider Requirement

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 4.0"
    }
  }
}
Note: Terraform automatically downloads and manages required providers based on the required_providers block.

6. Configuring Provider Authentication

Authentication Method Configuration Notes
AWS IAM Roles
provider "aws" {
  region = "us-west-2"
  assume_role {
    role_arn = "arn:aws:iam::123456789012:role/terraform-role"
  }
}
Use IAM roles for secure credential handling
API Tokens
provider "github" {
  token = var.github_token
}
Token-based authentication for GitHub
Service Account Keys
provider "google" {
  credentials = file("service-account-key.json")
  project = "my-project"
}
Google Cloud service account key file
Environment Variables
provider "azuread" {
  client_id = var.client_id
  client_secret = var.client_secret
}
Use environment variables for sensitive data

Example: AWS Provider with IAM Role

provider "aws" {
  region = "us-west-2"
  assume_role {
    role_arn = "arn:aws:iam::123456789012:role/terraform-role"
  }
}

Example: GitHub Provider with Token

provider "github" {
  token = var.github_token
}

7. Installing Providers

Method Description Example
Using Terraform Registry Install providers from the official Terraform Registry
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}
Using Local Path Install a provider from a local directory or binary
terraform {
  required_providers {
    custom = {
      source = "./providers/custom"
    }
  }
}
Using HashiCorp Enterprise Use private provider registries in HCP Terraform
terraform {
  required_providers {
    aws = {
      source  = "app.terraform.io/company/aws"
      version = "~> 5.0"
    }
  }
}

Example: Installing AWS Provider

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-west-2"
}
Note: Terraform automatically downloads and installs providers specified in the required_providers block when you run terraform init.

8. Upgrading Providers

Note: Provider upgrades should be done carefully, especially in production environments. Always test upgrades in a staging environment first.
Command Description Notes
terraform init Reinitializes the Terraform configuration and upgrades providers to the latest versions specified in the configuration. Automatically downloads and installs the required provider versions.
terraform init -upgrade Forces Terraform to upgrade providers to the latest versions available, even if they are already installed. Useful when you want to ensure the latest version is used, regardless of existing installations.

Example: Upgrading Providers

terraform init -upgrade

Example: Specifying Provider Version Constraints

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 5.0.0, < 6.0.0"
    }
  }
}

Upgrade Best Practices

  • Always pin provider versions in production to ensure stability.
  • Use terraform init -upgrade to fetch the latest compatible versions.
  • Review release notes for breaking changes before upgrading.
  • Test upgrades in a non-production environment first.

9. Locking Provider Versions

Locking provider versions ensures consistent and reproducible infrastructure deployments by pinning to specific versions.

Method Description Example
terraform.lock.hcl Lock file generated by Terraform to record exact provider versions.
# Generated by Terraform
provider "registry.terraform.io/hashicorp/aws" {
  version = "5.0.0"
  constraints = ">= 5.0.0"
}
required_providers Explicitly define required provider versions in configuration.
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 5.0.0, < 6.0.0"
    }
  }
}

Example: Using provider version constraints

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 5.0.0, < 6.0.0"
    }
  }
}

resource "aws_instance" "example" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"
}
Note: The terraform.lock.hcl file should be committed to version control to ensure all team members and CI/CD systems use the same provider versions.

10. Using Custom Providers

Custom providers allow you to extend Terraform's functionality with providers not included in the official registry. These are typically used for niche or proprietary systems.

Provider Source Description
custom-provider ./providers/custom Local custom provider directory
examplecorp/terraform-provider-foo examplecorp/terraform-provider-foo Provider from a custom registry

Example: Using a Custom Provider

terraform {
  required_providers {
    custom = {
      source  = "./providers/custom"
      version = "1.0.0"
    }
  }
}

resource "custom_resource" "example" {
  name = "test"
}
Note: Custom providers must be built and made available in a local directory or registry before they can be used.

11. Configuring Provider Proxy Settings

Setting Description Value Type Default
http_proxy HTTP proxy URL for provider requests string None
https_proxy HTTPS proxy URL for provider requests string None
no_proxy Comma-separated list of hosts to bypass proxy string None

Example: Setting Proxy in Terraform Configuration

provider "aws" {
  region = "us-west-2"
  http_proxy = "http://proxy.example.com:8080"
  https_proxy = "https://proxy.example.com:8443"
  no_proxy = "localhost,127.0.0.1"
}
Note: Proxy settings can also be configured via environment variables HTTP_PROXY, HTTPS_PROXY, and NO_PROXY.

Was this article helpful?