AWS Authentication

To deploy infrastructure on AWS using Terraform, you must authenticate Terraform to your AWS account. This guide covers real-life scenarios for local development, CI/CD pipelines, and multi-account setups, with best practices for security and automation.


1. Local Development: AWS CLI Credentials

The simplest way to authenticate is to use the AWS CLI. Configure your credentials with:

aws configure

This stores your credentials in ~/.aws/credentials and region in ~/.aws/config:

[default]
aws_access_key_id = AKIA...
aws_secret_access_key = ...
region = eu-west-1

Terraform will automatically use these credentials.

Best Practice: Use named profiles for multiple accounts:

[dev]
aws_access_key_id = ...
aws_secret_access_key = ...
region = us-east-1

[prod]
aws_access_key_id = ...
aws_secret_access_key = ...
region = eu-west-1

Reference a profile in your provider block:


2. CI/CD Pipelines: Environment Variables

For automation (GitHub Actions, GitLab CI, Azure Pipelines), use environment variables for credentials:

GitHub Actions Example:

GitLab CI Example:

Azure DevOps Example:


3. Advanced: Assume Role for Multi-Account/MFA

For organizations using AWS Organizations or requiring MFA, use the assume_role block:

Best Practice: Use short-lived credentials and roles for CI/CD, never long-lived root keys.


4. NixOS: Declarative AWS Credentials

Add credentials as environment variables in your NixOS configuration:

Or use agenix for encrypted secrets.


Best Practices

  • Use IAM roles and short-lived credentials for automation (never root keys)

  • Store secrets in a secure vault (GitHub/Azure/GitLab secrets, HashiCorp Vault, SSM Parameter Store)

  • Use named profiles for multi-account setups

  • Rotate credentials regularly

  • Enable MFA for all users

  • Use least privilege IAM policies


References

Tip: For cloud-native, secure, and auditable deployments, always use roles and secret managers instead of hardcoded credentials.


Last updated