The AWS provider is the most widely used Terraform provider. Errors commonly stem from authentication, region configuration, service endpoints, and quota limits.
Understanding AWS Provider Errors
Common AWS provider errors:
``
Error: error configuring Terraform AWS Provider: no valid credential sources
Error: InvalidRegion: region "us-west-x" not found
Error: RequestError: send request failed: connection refused
Error: Throttling: Rate exceeded
Issue 1: Credential Authentication Failures
AWS credentials not found or invalid.
Error Example:
``
Error: error configuring Terraform AWS Provider: no valid credential sources
for Terraform AWS Provider found.
Solution:
Configure credentials properly:
Method 1: AWS CLI configuration:
``bash
aws configure
aws configure list # Verify configuration
Method 2: Environment variables: ```bash export AWS_ACCESS_KEY_ID="AKIA..." export AWS_SECRET_ACCESS_KEY="secret..." export AWS_DEFAULT_REGION="us-east-1"
# Optional: session token for temporary credentials export AWS_SESSION_TOKEN="token..." ```
Method 3: Shared credentials file: ```bash # ~/.aws/credentials [default] aws_access_key_id = AKIA... aws_secret_access_key = secret...
[production] aws_access_key_id = AKIA... aws_secret_access_key = secret... ```
```hcl provider "aws" { region = "us-east-1" # Uses default profile automatically }
# Or specify profile provider "aws" { region = "us-east-1" profile = "production" } ```
Method 4: IAM role assumption: ```hcl provider "aws" { region = "us-east-1"
assume_role { role_arn = "arn:aws:iam::123456789012:role/TerraformRole" session_name = "terraform-session" external_id = "unique-external-id" } } ```
Method 5: EC2/ECS instance metadata:
``hcl
# On EC2 with IAM role attached - automatic
provider "aws" {
region = "us-east-1"
# Credentials from instance metadata service
}
Issue 2: Region Configuration Errors
Invalid or unsupported region specified.
Error Example:
``
Error: InvalidRegion: region "us-west-x" not found
Valid regions: us-east-1, us-east-2, us-west-1, us-west-2...
Solution:
Use valid region names: ```hcl provider "aws" { region = "us-east-1" # Valid: us-east-1, us-east-2, us-west-1, us-west-2, etc. }
# Common valid regions # North America: us-east-1, us-east-2, us-west-1, us-west-2, ca-central-1 # Europe: eu-west-1, eu-west-2, eu-west-3, eu-central-1, eu-north-1 # Asia Pacific: ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-northeast-2 # South America: sa-east-1 ```
For multi-region deployments: ```hcl # Primary region provider provider "aws" { region = "us-east-1" alias = "primary" }
# Secondary region provider provider "aws" { region = "us-west-2" alias = "secondary" }
# Use providers explicitly resource "aws_s3_bucket" "primary_bucket" { provider = aws.primary bucket = "primary-bucket" }
resource "aws_s3_bucket" "secondary_bucket" { provider = aws.secondary bucket = "secondary-bucket" } ```
Issue 3: Service Endpoint Connectivity
Cannot reach AWS service endpoints.
Error Example:
``
Error: RequestError: send request failed
caused by: Post https://ec2.us-east-1.amazonaws.com/: dial tcp: connection refused
Solution:
Check network connectivity: ```bash # Test endpoint connectivity curl -I https://ec2.us-east-1.amazonaws.com curl -I https://s3.us-east-1.amazonaws.com
# Check if behind proxy env | grep -i proxy ```
Configure proxy if needed:
``bash
export HTTP_PROXY="http://proxy.company.com:8080"
export HTTPS_PROXY="http://proxy.company.com:8080"
export NO_PROXY="localhost,127.0.0.1,.internal.company.com"
Or in Terraform: ```hcl provider "aws" { region = "us-east-1"
custom_endpoint { ec2 = "https://ec2.us-east-1.amazonaws.com" s3 = "https://s3.us-east-1.amazonaws.com" } }
# For VPC endpoints (private connectivity) provider "aws" { region = "us-east-1"
endpoints { ec2 = "https://vpce-abc123-ec2.us-east-1.vpce.amazonaws.com" s3 = "https://vpce-abc123-s3.us-east-1.vpce.amazonaws.com" } } ```
Issue 4: Rate Limiting and Throttling
AWS API rate limits exceeded.
Error Example:
``
Error: Throttling: Rate exceeded
Error: Request limit exceeded for resource type: instance
Solution:
Enable retries: ```hcl provider "aws" { region = "us-east-1"
# Configure retry behavior retry_mode = "adaptive" # or "standard"
# Or use max_retries (deprecated but works) max_retries = 25 } ```
Reduce parallel operations:
``bash
terraform plan -parallelism=5 # Default is 10
terraform apply -parallelism=5
Use targeting for large deployments:
``bash
terraform apply -target=aws_instance.web -target=aws_instance.db
Add delays between operations: ```hcl resource "time_sleep" "wait_between_creates" { depends_on = [aws_instance.web]
create_duration = "30s" }
resource "aws_instance" "db" { depends_on = [time_sleep.wait_between_creates] ami = var.ami } ```
Issue 5: Service Quota Limits
Resource creation exceeds service quotas.
Error Example:
``
Error: VPC limit exceeded: maximum number of VPCs reached
Error: Instance limit exceeded: vCPU limit for instance type
Solution:
Check current quotas: ```bash aws service-quotas get-service-quota \ --service-code vpc \ --quota-code L-F678F1CE # VPCs per region
aws ec2 describe-instance-types \ --instance-types t3.micro \ --query 'InstanceTypes[0].VCpuInfo' ```
Request quota increase:
``bash
aws service-quotas request-service-quota-increase \
--service-code vpc \
--quota-code L-F678F1CE \
--desired-value 10
Or through AWS Support Center for increases not available via Service Quotas.
Use different instance types to avoid vCPU limits: ```hcl # Burstable instances share vCPU credits resource "aws_instance" "web" { instance_type = "t3.micro" # 2 vCPU credits }
# Use spot instances for additional capacity resource "aws_spot_instance_request" "worker" { instance_type = "t3.micro" spot_price = "0.01" } ```
Issue 6: Permission Denied Errors
Insufficient IAM permissions.
Error Example:
``
Error: AccessDenied: User is not authorized to perform: ec2:RunInstances
Solution:
Verify current permissions:
``bash
aws sts get-caller-identity
aws iam get-user --user-name terraform-user
aws iam list-attached-user-policies --user-name terraform-user
Create appropriate IAM policy:
``json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"s3:*",
"rds:*",
"iam:Get*",
"iam:List*",
"iam:CreateRole",
"iam:DeleteRole",
"iam:PutRolePolicy",
"iam:AttachRolePolicy"
],
"Resource": "*"
}
]
}
For least-privilege, use specific actions:
``json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:RunInstances",
"ec2:TerminateInstances"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:Region": "us-east-1"
}
}
}
]
}
Issue 7: Multi-Account Configuration
Issues with multiple AWS accounts.
Error Example:
``
Error: AccessDenied: Cross-account access denied
Solution:
Configure multiple providers for different accounts: ```hcl # Dev account provider "aws" { region = "us-east-1" alias = "dev"
assume_role { role_arn = "arn:aws:iam::DEV_ACCOUNT:role/TerraformRole" } }
# Prod account provider "aws" { region = "us-east-1" alias = "prod"
assume_role { role_arn = "arn:aws:iam::PROD_ACCOUNT:role/TerraformRole" } }
# Use providers per resource module "dev_vpc" { source = "./modules/vpc" providers = { aws = aws.dev } }
module "prod_vpc" { source = "./modules/vpc" providers = { aws = aws.prod } } ```
Issue 8: Provider Version Conflicts
Provider version incompatibility.
Error Example:
``
Error: Provider version 3.0 does not support resource type aws_s3_bucket_acl
Solution:
Update provider version: ```hcl terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" # Version 4.x for new resource types } } }
provider "aws" { region = "us-east-1" } ```
Reinitialize:
``bash
terraform init -upgrade
Verification Steps
Test AWS configuration: ```bash aws sts get-caller-identity aws ec2 describe-regions aws s3 ls
# Test in Terraform terraform console > provider("aws").region ```
Verify permissions:
``bash
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::ACCOUNT:user/terraform \
--action-names ec2:RunInstances \
--resource-arns "*"
Prevention Best Practices
- 1.Use IAM roles with least-privilege permissions
- 2.Enable retries for rate-limited operations
- 3.Configure multiple providers for multi-region/account
- 4.Keep provider version updated for new features
- 5.Use
terraform consoleto test provider configuration - 6.Monitor AWS service quotas proactively
- 7.Use
-parallelismflag for large deployments - 8.Test credentials with
aws sts get-caller-identitybefore Terraform