Danh sách bài viết trong series Terraform Associate (003)
- Bài 0: Giới Thiệu Series Và Tổng Quan Về Chứng Chỉ Terraform Associate (003)
- Bài 1: Terraform Là Gì? Tổng Quan Và Vai Trò Trong IaC
- Bài 2: Cài Đặt Terraform Trên Các Hệ Điều Hành
- Bài 3: Terraform Workflow: Init, Plan, Apply, Destroy
- Bải 4: Terraform CLI Nâng Cao: Lệnh Taint, Import, Refresh
- Bài 5: Quản Lý Provider Trong Terraform
- Bài 6: Quản Lý Resource Trong Terraform
- Bài 7: Sử Dụng Biến (Variables) Trong Terraform
- Bài 8: Sử Dụng Output Trong Terraform
- Bài 9: Hiểu Terraform State Quản Lý Trạng Thái Hạ Tầng
- Bài 10: Sử Dụng Remote State Với Backend Như S3 Trong Terraform
- Bài 11: Terraform Workspace Quản Lý Nhiều Môi Trường
- Bài 12: Terraform Module: Mô-đun Hóa Cấu Hình
- Bài 13: Terraform Data Sources Truy Vấn Thông Tin Hạ Tầng
- Bài 14: Quản Lý Vòng Đời Tài Nguyên Với Terraform
- Bài 15: Tự Động Hóa Và Tích Hợp CI/CD Với Terraform
- Bài 16: Xử Lý Lỗi Và Debug Trong Terraform
- Bài 17: Tối Ưu Hóa Hiệu Suất Với Terraform
- Bài 18: Bảo Mật Cấu Hình Terraform
- Bài 19: Triển Khai Hạ Tầng Đa Vùng Với Terraform
- Bài 20: Triển Khai Hạ Tầng Serverless Với Terraform
- Bài 21: Triển Khai Hạ Tầng Container Với Terraform (ECS, EKS)
- Bài 22: Triển Khai Hạ Tầng Multi-Cloud Với Terraform
- Bài 23: Tổng Kết Series Và Chuẩn Bị Cho Kỳ Thi Terraform Associate (003)
Biến (Variables) Trong Terraform Là Gì?
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
sangus-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ạyterraform 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ếnregion
.
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:
-
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!
-
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.
-
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" ]
-
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 blockvariable
với thuộc tínhdefault
. - “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ớierror_message
được khai báo trong validation.
- “Làm thế nào để khai báo biến với giá trị mặc định?”
- 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.