Terraform có cơ chế tự động load tất cả các file .tf trong cùng một thư mục, do đó bạn có thể tách provider và credentials sang một file riêng. Điều này có nghĩa là, khi bạn đứng trong 1 thư mục và chạy:
terraform init terraform plan terraform apply
Terraform sẽ:
- Quét toàn bộ file có đuôi
.tf - Gộp nội dung của tất cả các file đó lại
- Xem chúng như một cấu hình duy nhất
Giống như viết 1 cuốn sách:
gioi-thieu.txtchuong-1.txtchuong-2.txt
Khi in sách máy in gom tất cả lại thành 1 cuốn
Terraform cũng vậy:
- Các file
.tf= các chương - Thư mục = 1 cuốn sách Terraform
Dựa trên cơ chế này, ở mức cơ bản, chúng ta có thể tách phần khai báo provider và credentials sang một file riêng. Cách làm này tốt hơn rất nhiều so với việc hard-code Access Key và Secret Key trực tiếp trong từng file resource, vì nó giúp:
- Giảm lặp code
- Dễ quản lý hơn
- Tránh phải sửa credentials ở nhiều nơi (đổi key → phải sửa nhiều file)
- Tránh lộ credentials
Các vấn đề khi không tách Provider và Credentials ra file riêng
Thực tế, hạ tầng cloud không tồn tại dưới dạng một project đơn lẻ. Một tổ chức thường có:
- Nhiều AWS account khác nhau (dev, staging, production)
- Nhiều project Terraform chạy song song
- Nhiều người hoặc pipeline cùng triển khai hạ tầng
Khi đó, nếu credentials vẫn nằm trong provider.tf, bạn sẽ gặp các vấn đề sau:
Thứ nhất, provider.tf vẫn là code
Dù đã tách riêng, provider.tf vẫn là một file Terraform và rất dễ bị:
- Commit nhầm lên Git
- Chia sẻ nhầm cho người không có quyền
- Lộ credentials khi backup hoặc copy source code
Thứ hai, provider.tf không linh hoạt cho nhiều AWS account
Giả sử:
- Ban ngày bạn deploy môi trường dev
- Buổi tối bạn deploy production
- Hoặc CI/CD pipeline deploy cho nhiều account khác nhau
Nếu dùng provider.tf, bạn buộc phải:
- Sửa file
- Hoặc tạo nhiều thư mục / nhiều bản copy code
- Hoặc dùng condition phức tạp
Thứ ba, CI/CD không chấp nhận credentials nằm trong source code
Trong pipeline CI/CD:
- Credentials thường được inject từ Secret Manager
- Hoặc từ biến môi trường của runner
- Hoặc từ IAM Role (trên AWS)
Pipeline không đọc credentials từ file .tf, và cũng không cho phép commit key vào repo. Vì vậy, cách dùng provider.tf chứa credentials gần như không dùng được trong CI/CD thực tế.
Terraform tự động đọc credentials như thế nào?
Khi bạn chạy terraform plan hoặc terraform apply, Terraform sẽ:
- Khởi tạo AWS provider
- AWS provider gọi AWS SDK
- AWS SDK kiểm tra các biến môi trường tiêu chuẩn:
AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_DEFAULT_REGION
Nếu các biến này tồn tại, Terraform tự động xác thực với AWS.
Thiết lập Credentials bằng Environment Variables (Best Practice)
Trên Linux hoặc macOS, bạn chỉ cần thiết lập một lần:
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY export AWS_DEFAULT_REGION=us-east-2
Sau đó có thể kiểm tra nhanh:
echo$AWS_ACCESS_KEY_ID echo$AWS_SECRET_ACCESS_KEY echo$AWS_DEFAULT_REGION
Nếu các giá trị được hiển thị, nghĩa là môi trường đã sẵn sàng để Terraform sử dụng.