Best Practice quản lý Provider & Credentials – Bài 4

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.txt
  • chuong-1.txt
  • chuong-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ẽ:

  1. Khởi tạo AWS provider
  2. AWS provider gọi AWS SDK
  3. AWS SDK kiểm tra các biến môi trường tiêu chuẩn:
    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY
    • AWS_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.

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em