When working with Terraform to manage your AWS infrastructure, it's crucial to understand how Terraform locates your AWS credentials. This process involves a specific hierarchy that prioritizes security and flexibility.
Terraform uses a specific hierarchy to locate your AWS credentials. It prioritizes environment variables, then checks for the AWS credentials file.
-
Environment Variables: Terraform first looks for the following environment variables:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
-
AWS_SESSION_TOKEN
(for temporary credentials)
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
-
AWS Credentials File: If environment variables aren't found, Terraform searches for credentials in ~/.aws/credentials
. This file should have the following format:
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
[profile_name]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
You can specify a different profile using the AWS_PROFILE
environment variable or the profile
argument within a provider block:
provider "aws" {
region = "us-west-2"
profile = "profile_name"
}
Important Considerations:
-
Never hardcode credentials directly in your Terraform code. This is a major security risk.
-
Avoid storing long-term credentials in the credentials file. Use temporary credentials obtained through AWS IAM roles or AWS SSO whenever possible.
-
The S3 backend for Terraform state storage requires separate credentials. Ensure you've configured these correctly, either through environment variables or the backend configuration itself.
-
Double-check file paths and permissions. Ensure Terraform has read access to your credentials file.
-
Use descriptive profile names to easily manage multiple AWS accounts.
-
Leverage tools like AWS Vault or HashiCorp Vault for secure credential storage and retrieval.
This code demonstrates how Terraform prioritizes AWS credentials. It shows how to set credentials using environment variables, AWS credentials file, and specifying profiles. It covers using the default profile, a specific profile, and setting the AWS_PROFILE environment variable. The example emphasizes security by recommending against committing credentials to version control and suggests using temporary credentials and tools like AWS Vault or HashiCorp Vault for production environments.
This example shows how Terraform prioritizes different methods for finding your AWS credentials.
1. Environment Variables:
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
terraform init
terraform apply
2. AWS Credentials File:
Create a file at ~/.aws/credentials
with the following content:
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
[dev]
aws_access_key_id = YOUR_DEV_ACCESS_KEY
aws_secret_access_key = YOUR_DEV_SECRET_KEY
a) Using the default profile:
# Uses credentials from the "default" profile in ~/.aws/credentials
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159c9e67027c"
instance_type = "t2.micro"
}
b) Specifying a profile:
# Uses credentials from the "dev" profile in ~/.aws/credentials
provider "aws" {
region = "us-west-2"
profile = "dev"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159c9e67027c"
instance_type = "t2.micro"
}
c) Using AWS_PROFILE environment variable:
export AWS_PROFILE="dev"
terraform init
terraform apply
This example uses the "dev" profile from your ~/.aws/credentials
file.
Important:
- Replace placeholders like
YOUR_ACCESS_KEY
with your actual credentials.
- Never commit your real AWS credentials to version control.
- This is a simplified example. For production environments, consider using temporary credentials and tools like AWS Vault or HashiCorp Vault for secure credential management.
-
Best Practices:
-
AWS IAM Roles: For applications running on EC2 instances, leverage IAM roles to grant the instance temporary credentials. This eliminates the need to manage credentials on the instance itself.
-
AWS SSO: For teams and organizations, AWS SSO provides centralized identity management and allows you to grant temporary credentials with fine-grained permissions.
-
HashiCorp Vault: For enhanced security, store your long-term AWS credentials in a secrets management tool like HashiCorp Vault. Terraform can integrate with Vault to dynamically retrieve credentials during deployments.
-
Troubleshooting:
-
Credential Chain: Familiarize yourself with the AWS credential chain to understand the order in which AWS SDKs and tools search for credentials. This can help diagnose issues related to incorrect credentials being used.
-
Verbose Logging: Enable verbose logging in Terraform (
TF_LOG=DEBUG
) to get more detailed information about the credential loading process.
-
AWS CLI: Use the AWS CLI (
aws configure list
) to verify that your AWS credentials are configured correctly outside of Terraform.
-
Advanced Usage:
-
Assume Role: Terraform allows you to assume an IAM role within your AWS account. This is useful for granting temporary, scoped access to specific resources.
-
External Data Sources: You can use Terraform's external data sources to fetch credentials from external systems, such as a secrets management service.
-
Security Reminders:
-
Regularly Rotate Credentials: Change your AWS access keys and secret keys periodically to minimize the impact of any potential compromise.
-
Principle of Least Privilege: Grant only the necessary permissions to your Terraform code and users. Avoid using overly permissive roles or credentials.
By following these best practices and understanding the nuances of Terraform's credential handling, you can ensure the security and reliability of your AWS infrastructure deployments.
Priority |
Method |
Description |
1 |
Environment Variables |
- AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN (for temporary credentials) |
2 |
AWS Credentials File (~/.aws/credentials ) |
- Uses [default] profile unless AWS_PROFILE environment variable or profile argument in provider block specifies otherwise. - Format: <br> [profile_name] <br> aws_access_key_id = YOUR_ACCESS_KEY <br> aws_secret_access_key = YOUR_SECRET_KEY <br>
|
- Never hardcode credentials in Terraform code.
-
Use temporary credentials (AWS IAM roles, AWS SSO) instead of long-term credentials.
-
Securely configure S3 backend credentials for Terraform state storage.
-
Verify file paths and permissions for Terraform to access credentials.
-
Use descriptive profile names for managing multiple AWS accounts.
-
Utilize tools like AWS Vault or HashiCorp Vault for secure credential storage and retrieval.
Understanding Terraform's AWS credential hierarchy is essential for secure and efficient infrastructure management. By prioritizing environment variables and offering options like the AWS credentials file and profile configuration, Terraform provides flexibility. However, always prioritize security by avoiding hardcoded credentials and leveraging temporary credentials through AWS IAM roles or AWS SSO whenever possible. For enhanced security, consider tools like AWS Vault or HashiCorp Vault. By adhering to best practices and understanding the nuances of Terraform's credential handling, you can ensure the security and reliability of your AWS infrastructure deployments.
-
amazon web services - Terraform AWS credentials file not found ... | May 2, 2016 ... I am trying to have my setup just use the credential file. I've checked that the environment variables are cleared and I have left the relevant variables inĀ ...
-
Terraform not finding aws credentials file? : r/Terraform | Posted by u/gex80 - 10 votes and 19 comments
-
Using Credential created by AWS SSO for Terraform - AWS ... | I read a lot of articles related with this issue, including this. I am little confused so I want to ask my understanding. Using credential create by AWS SSO and stored in ~/.aws/cli or ~/.aws/sso to deploy aws resource by terraform is not possible. is this correct? It seems there are possible way if you are trying to use aws-sdk-go, but just declare it in terraform file such as provider āawsā ā¦ with using aws_shared_credentials and profile is not working properly. please help me to un...
-
Terraform: Choosing credentials for a remote state file - Server Fault | Jun 26, 2018 ... The Terraform S3 Backend is different than the Terraform AWS Provider. The error message "No valid credential sources found for AWS Provider.
-
Boundary-worker.service not found after deploying boundary ... | Trying to run the boundary-reference-architecture deployment for aws, and Iāve been struggling for days. I guess I was supposed to know how to configure my ~/.aws/credentials file, but I didnāt. I work with multiple aws instances and terraform wasnāt hitting the one I wanted. If there is documentation about getting that right, I havenāt seen it. I got that working but wasted a lot of time getting there. I had a problem with line endings when I cloned the repo to my Windows 10 machine (detailed...
-
Never put AWS temporary credentials in the credentials file (or env ... | Please, Iām begging youāāālearn about how the AWS CLI and SDK retrieve and refresh credentials. There are such good options!
-
Error: configuring Terraform AWS Provider: no valid credential ... | My terraform setup was running fine with Jenkins but then suddenly I am seeing this error when running the Jenkinsfile (see below). But the problem is not with the Jenkinsfile because even when I run this without Jenkins now, I see the same error. The only modifications I was making was to the Jenkinsfile at the time where the config file and the credentials file were removed. I went to the /home/ubuntu/.aws/credentials and the file is completely missing (config file is also missing). How co...
-
Docs overview | hashicorp/aws | Terraform | Terraform Registry | Provider Configuration. Warning: Hard-coded credentials are not recommended in any Terraform configuration and risks secret leakage should this file ever beĀ ...
-
S3 backend fails to initialize using profile - AWS - HashiCorp Discuss | I have a very simple module using AWS (4.50.0) with terraform 1.3.7 with AWS credentials configured locally under a profile (e.g. āmyprofileā) When running with local state, all AWS commands use the profile correctly and succeed, however when I try to move the state to S3 using the same profile I get this error: Error: error configuring S3 Backend: no valid credential sources for S3 Backend found. Please see Backend Type: s3 | Terraform | HashiCorp Developer for more information about provi...