Bài 7: Sử Dụng Biến (Variables) Trong Terraform


Danh sách bài viết trong series Terraform Associate (003)

Biến (Variables) Trong Terraform Là Gì?

f14a3bd2-12c6-43e7-a909-536cac86662d

Biến (variables) trong Terraform là các tham số cho phép bạn truyền giá trị động vào file cấu hình, giúp mã linh hoạt và tái sử dụng được. Biến thường được sử dụng để tùy chỉnh các giá trị như vùng (region), loại máy ảo (instance type), hoặc tên tài nguyên mà không cần sửa trực tiếp file .tf. Có nhiều loại biến trong Terraform, bao gồm biến đầu vào (input variables), biến môi trường (environment variables), và biến được định nghĩa trong file cấu hình. Hiểu và sử dụng biến hiệu quả là kỹ năng quan trọng được kiểm tra trong kỳ thi Terraform Associate (003), đặc biệt liên quan đến mục tiêu 7 (Read, Generate, and Modify Configuration).

Vai Trò Của Biến Trong Quản Lý Hạ Tầng

Biến đóng vai trò quan trọng trong quản lý hạ tầng với Terraform:

  • Tái sử dụng mã: Sử dụng cùng file cấu hình cho nhiều môi trường (dev, staging, prod) bằng cách thay đổi giá trị biến.
  • Tính linh hoạt: Dễ dàng thay đổi cấu hình (VD: đổi region từ us-east-1 sang us-west-2) mà không cần sửa file chính.
  • Bảo mật thông tin nhạy cảm: Sử dụng biến để truyền thông tin như access key, tránh hardcode trực tiếp trong mã.
  • Tích hợp CI/CD: Biến hỗ trợ truyền giá trị từ pipeline (VD: GitHub Actions) để tự động hóa triển khai.

Các Loại Biến Trong Terraform

Biến Đầu Vào (Input Variables)

  • Mô tả: Biến đầu vào được khai báo bằng block variable, cho phép người dùng truyền giá trị khi chạy Terraform.
  • Ví dụ:
    variable "region" {
    type        = string
    description = "AWS region to deploy resources"
    default     = "us-east-1"
    }
  • Ý nghĩa: Biến region có thể được gán giá trị khi chạy terraform apply.

Biến Môi Trường (Environment Variables)

  • Mô tả: Biến môi trường được đặt bằng tiền tố TF_VAR_ để truyền giá trị vào Terraform.
  • Ví dụ:
    export TF_VAR_region="us-west-2"
  • Ý nghĩa: Terraform tự động nhận giá trị us-west-2 cho biến region.

Biến Được Định Nghĩa Trong File Terraform

  • Mô tả: Giá trị biến có thể được định nghĩa trong file terraform.tfvars hoặc *.auto.tfvars.
  • Ví dụ (file terraform.tfvars):
    region = "us-east-1"
    instance_type = "t2.micro"
  • Ý nghĩa: Terraform tự động đọc giá trị từ file này khi chạy.

Khai Báo Và Sử Dụng Biến

Khai Báo Biến Trong File Variables.tf

  • File variables.tf:

    variable "region" {
    type        = string
    description = "AWS region to deploy resources"
    default     = "us-east-1"
    }
    
    variable "instance_type" {
    type        = string
    description = "EC2 instance type"
    default     = "t2.micro"
    }
    
    variable "instance_count" {
    type        = number
    description = "Number of EC2 instances"
    default     = 1
    }
  • Ý nghĩa: Khai báo các biến với kiểu dữ liệu, mô tả, và giá trị mặc định.

Gán Giá Trị Biến Trong File Terraform.tfvars

  • File terraform.tfvars:
    region        = "us-east-1"
    instance_type = "t2.micro"
    instance_count = 2
  • Ý nghĩa: Ghi đè giá trị mặc định của biến.

Sử Dụng Biến Trong Resource

  • File main.tf:

    provider "aws" {
    region     = var.region
    access_key = "YOUR_ACCESS_KEY"
    secret_key = "YOUR_SECRET_KEY"
    }
    
    resource "aws_instance" "web_server" {
    count         = var.instance_count
    ami           = "ami-0c55b159cbfafe1f0"
    instance_type = var.instance_type
    tags = {
      Name = "WebServer-${count.index}"
    }
    }
    
    output "instance_ids" {
    value = aws_instance.web_server[*].id
    }
  • Ý nghĩa: Sử dụng var.<tên_biến> để tham chiếu biến trong resource.

Ghi Đè Biến Qua Dòng Lệnh

  • Ví dụ: Ghi đè biến khi chạy terraform apply:
    terraform apply -var "region=us-west-2" -var "instance_count=3" -auto-approve
  • Ý nghĩa: Ghi đè giá trị biến trực tiếp qua dòng lệnh.

Xác Thực Và Mặc Định Biến

Gán Giá Trị Mặc Định
  • Ví dụ:
    variable "instance_count" {
    type    = number
    default = 1
    }
  • Ý nghĩa: Nếu không gán giá trị, Terraform dùng giá trị mặc định là 1.

Xác Thực Biến Với Validation

  • Ví dụ:

    variable "instance_count" {
    type        = number
    description = "Number of EC2 instances"
    default     = 1
    
    validation {
      condition     = var.instance_count > 0 && var.instance_count <= 5
      error_message = "Instance count must be between 1 and 5."
    }
    }
  • Output khi giá trị không hợp lệ (VD: instance_count = 6):

    Error: Invalid value for variable
    
    Instance count must be between 1 and 5.
    
    This was checked by the validation rule at variables.tf:6,3-13.
  • Ý nghĩa: Đảm bảo giá trị biến hợp lệ trước khi chạy.

Ví Dụ Thực Tế: Sử Dụng Biến Để Triển Khai Tài Nguyên

  • File variables.tf:

    variable "region" {
    type        = string
    description = "AWS region to deploy resources"
    default     = "us-east-1"
    }
    
    variable "instance_type" {
    type        = string
    description = "EC2 instance type"
    default     = "t2.micro"
    }
    
    variable "instance_count" {
    type        = number
    description = "Number of EC2 instances"
    default     = 1
    
    validation {
      condition     = var.instance_count > 0 && var.instance_count <= 5
      error_message = "Instance count must be between 1 and 5."
    }
    }
  • File terraform.tfvars:
    region        = "us-east-1"
    instance_type = "t2.micro"
    instance_count = 2
  • File main.tf:

    provider "aws" {
    region     = var.region
    access_key = "YOUR_ACCESS_KEY"
    secret_key = "YOUR_SECRET_KEY"
    }
    
    resource "aws_s3_bucket" "data_bucket" {
    bucket = "my-unique-bucket-20230518-${var.region}"
    tags = {
      Name = "DataBucket-${var.region}"
    }
    }
    
    resource "aws_instance" "web_server" {
    count         = var.instance_count
    ami           = "ami-0c55b159cbfafe1f0"
    instance_type = var.instance_type
    tags = {
      Name = "WebServer-${count.index}-${var.region}"
    }
    
    depends_on = [aws_s3_bucket.data_bucket]
    }
    
    output "bucket_name" {
    value = aws_s3_bucket.data_bucket.bucket
    }
    
    output "instance_ids" {
    value = aws_instance.web_server[*].id
    }
  • Quy trình:

    1. terraform init: Output:

      Initializing provider plugins...
      - Finding hashicorp/aws versions matching "~> 5.0"...
      - Installing hashicorp/aws v5.17.0...
      - Installed hashicorp/aws v5.17.0 (signed by HashiCorp)
      
      Terraform has been successfully initialized!
    2. terraform plan: Output:

      Terraform will perform the following actions:
      
      # aws_s3_bucket.data_bucket will be created
      + resource "aws_s3_bucket" "data_bucket" {
       + bucket = "my-unique-bucket-20230518-us-east-1"
       + id     = (known after apply)
       + tags   = {
           + "Name" = "DataBucket-us-east-1"
         }
      }
      
      # aws_instance.web_server[0] will be created
      + resource "aws_instance" "web_server" {
       + ami           = "ami-0c55b159cbfafe1f0"
       + instance_type = "t2.micro"
       + tags          = {
           + "Name" = "WebServer-0-us-east-1"
         }
       + id            = (known after apply)
      }
      
      # aws_instance.web_server[1] will be created
      + resource "aws_instance" "web_server" {
       + ami           = "ami-0c55b159cbfafe1f0"
       + instance_type = "t2.micro"
       + tags          = {
           + "Name" = "WebServer-1-us-east-1"
         }
       + id            = (known after apply)
      }
      
      Plan: 3 to add, 0 to change, 0 to destroy.
    3. terraform apply -auto-approve: Output:

      aws_s3_bucket.data_bucket: Creating...
      aws_s3_bucket.data_bucket: Creation complete after 5s [id=my-unique-bucket-20230518-us-east-1]
      
      aws_instance.web_server[0]: Creating...
      aws_instance.web_server[1]: Creating...
      aws_instance.web_server[0]: Creation complete after 45s [id=i-0abcdef123456789]
      aws_instance.web_server[1]: Creation complete after 45s [id=i-1abcdef123456789]
      
      Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
      
      Outputs:
      bucket_name = "my-unique-bucket-20230518-us-east-1"
      instance_ids = [
      "i-0abcdef123456789",
      "i-1abcdef123456789"
      ]
    4. Ghi đè biến qua dòng lệnh:

      terraform apply -var "instance_count=3" -auto-approve

      Output:

      aws_instance.web_server[0]: Still exists...
      aws_instance.web_server[1]: Still exists...
      aws_instance.web_server[2]: Creating...
      aws_instance.web_server[2]: Creation complete after 45s [id=i-2abcdef123456789]
      
      Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Lưu Ý Quan Trọng Khi Sử Dụng Biến

  • Ưu tiên giá trị biến: Terraform ưu tiên giá trị theo thứ tự: dòng lệnh > file terraform.tfvars > file *.auto.tfvars > giá trị mặc định.
  • Bảo mật thông tin nhạy cảm: Không lưu thông tin nhạy cảm (VD: access key) trong file terraform.tfvars, sử dụng biến môi trường hoặc HashiCorp Vault.
  • Kiểu dữ liệu chính xác: Đảm bảo giá trị biến khớp với kiểu dữ liệu (VD: type = number không thể gán giá trị chuỗi).
  • Tên biến rõ ràng: Đặt tên biến mô tả (VD: instance_count thay vì count) để dễ hiểu.
  • Validation cẩn thận: Sử dụng validation để kiểm tra giá trị biến, tránh lỗi runtime.

Liên Hệ Với Chứng Chỉ Terraform Associate (003)

Kỳ thi Terraform Associate (003) kiểm tra khả năng sử dụng biến. Bạn cần nắm:

  • Câu hỏi mẫu:
    • “Làm thế nào để khai báo biến với giá trị mặc định?”
      Đáp án: Sử dụng block variable với thuộc tính default.
    • “File nào dùng để gán giá trị biến tự động?”
      Đáp án: terraform.tfvars hoặc *.auto.tfvars.
    • “Output khi biến không hợp lệ với validation là gì?”
      Đáp án: Thông báo lỗi với error_message được khai báo trong validation.
  • Thực hành: Kỳ thi có thể yêu cầu nhận diện cấu hình biến hoặc dự đoán kết quả khi dùng biến trong resource.

Kết Luận

Sử dụng biến trong Terraform giúp mã linh hoạt, tái sử dụng, và dễ quản lý. Hiểu cách khai báo, gán giá trị, xác thực biến, và thực hành với ví dụ thực tế sẽ giúp bạn tự tin thi đỗ Terraform Associate (003). Ở bài tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng output trong Terraform.

Điều hướng chuỗi bài viết<< Bài 6: Quản Lý Resource Trong Terraform
>> Bài 8: Sử Dụng Output Trong Terraform

Bài viết khác

Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm