Terraform là công cụ Infrastructure as Code (IaC) giúp bạn quản lý hạ tầng (server, container, cloud...) bằng code. Chúng ta sẽ đi qua các phần
- Cài extension HashiCorp Terraform cho VS Code
- Hiểu cú pháp cơ bản trong Terraform (HCL – HashiCorp Configuration Language)
- Hiểu về null provider và null_resource.
- Viết và chạy ví dụ đầu tiên — "Hello Terraform!"
- Thực thi các command Terraform quan trọng.
Cài đặt Extension Terraform trong VS Code
Trong Visual Studio Code, bạn nhấn Ctrl + Shift + X để mở Extensions, tìm "HashiCorp Terraform"
Sau khi cài xong, VS Code sẽ hỗ trợ:
- Tô màu cú pháp (syntax highlighting)
- Tự động gợi ý (intellisense)
- Kiểm tra lỗi cú pháp .tf
- Format code bằng lệnh Shift + Alt + F
Cú pháp Terraform (HCL)
Terraform dùng ngôn ngữ HCL – HashiCorp Configuration Language, có 3 thành phần chính:
- Blocks: là một đơn vị cấu hình cơ bản, được viết bằng Ngôn ngữ Cấu hình HashiCorp (HCL), dùng để xác định và quản lý các khía cạnh khác nhau của cơ sở hạ tầng. Các loại block phổ biến bao gồm resource (tài nguyên), provider (nhà cung cấp), variable (biến), và output. Block giúp định nghĩa các thành phần như máy ảo, mạng, hoặc các thiết lập nhà cung cấp đám mây, giúp cấu hình cơ sở hạ tầng một cách khai báo và có thể tái sử dụng.
- Labels Tên giúp bạn định danh resource hoặc provider
- Arguments: Cặp key = value, là các thuộc tính trong block.
Ví dụ:
resource "aws_instance" "web" {
ami = "ami-12345"
instance_type = "t2.micro"
}Giải thích
- resource là block
- "aws_instance" là loại tài nguyên
- "web" là label 2 (tên định danh)
- Bên trong {} là các arguments
Ví dụ
Trong ví dụ này, mình tạo file main.tf, nằm cùng folder với docker-compose.yaml.
Tạo file main.tf
terraform {
required_version = ">= 1.4.0"
required_providers {
null = {
source = "hashicorp/null"
version = "~> 3.0"
}
}
}File này mới chỉ định nghĩa yêu cầu Terraform (version, provider), chưa có resource nào để tạo ra.
Giải thích về null provider và null_resource
Trước khi đi tiếp, điều quan trọng là phải hiểu tại sao chúng ta lại cần null provider:
null provider: Đây là một provider đặc biệt, được HashiCorp tạo ra. Nó không quản lý bất kỳ hạ tầng thực tế nào (server, mạng, database). Mục đích chính của nó là cung cấp một tài nguyên giả (null_resource) để thực hiện các hành động tùy chỉnh.
null_resource: Là một tài nguyên rỗng (placeholder). Nó đóng vai trò là một bộ kích hoạt (trigger) để chạy các lệnh hoặc scripts thông qua các khối provisioner. Nó cho phép chúng ta thực hiện các hành động cục bộ hoặc từ xa như một phần của vòng đời Terraform.
Thêm vào file main.tf
resource "null_resource" "hello" {
provisioner "local-exec" {
command = "echo Hello Terraform"
}
}provisioner là một cơ chế trong Terraform được sử dụng để chạy các scripts hoặc lệnh trên tài nguyên sau khi nó được tạo (hoặc trước khi nó bị hủy). local-exec là một loại provisioner cụ thể, có nghĩa là lệnh sẽ được thực thi trên chính máy tính mà bạn đang chạy lệnh terraform apply.
Tóm lại: Provider giúp XÂY DỰNG (tạo) hạ tầng, còn Provisioner giúp THIẾT LẬP và CẤU HÌNH (chạy lệnh) bên trong hạ tầng đó.
terraform init — Khởi tạo workspace
> terraform init
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of hashicorp/null from the dependency lock file
- Using previously-installed hashicorp/null v3.2.4
Terraform has been successfully initialized!Terraform sẽ:
- 📂 Tạo thư mục .terraform/ trong cùng folder (nơi chứa plugin và cache)
- 📦 Tải về provider hashicorp/null phiên bản 3.x
- ✅ Kiểm tra bạn có đang dùng Terraform >= 1.4.0 không
- 🚫 Nhưng chưa tạo ra tài nguyên nào cả
Command terraform apply
Lệnh này áp dụng các thay đổi được định nghĩa trong file cấu hình. Chúng ta dùng tham số -auto-approve để bỏ qua bước xác nhận yes.
>terraform apply -auto-approve
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# null_resource.hello will be created
+ resource "null_resource" "hello" {
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
null_resource.hello: Creating...
null_resource.hello: Provisioning with 'local-exec'...
null_resource.hello (local-exec): Executing: ["cmd" "/C" "echo Hello Terraform"]
null_resource.hello (local-exec): Hello Terraform
null_resource.hello: Creation complete after 0s [id=2643957944648628529]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.Terraform sẽ:
- Đọc file .tf
- Lưu “trạng thái hiện tại” vào terraform.tfstate
- Thực thi resource (ở đây chỉ in dòng "Hello Terraform")
Terraform destroy
terraform destroy là một lệnh trong Terraform được sử dụng để xóa các tài nguyên được tạo ra bởi Terraform. Lệnh này sẽ xóa các tài nguyên được tạo ra bởi Terraform theo thứ tự ngược lại với thứ tự mà chúng được tạo ra>terraform destroy -auto-approve
null_resource.hello: Refreshing state... [id=7190218738645444700]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
- destroy
Terraform will perform the following actions:
# null_resource.hello will be destroyed
- resource "null_resource" "hello" {
- id = "7190218738645444700" -> null
}
Plan: 0 to add, 0 to change, 1 to destroy.
null_resource.hello: Destroying... [id=7190218738645444700]
null_resource.hello: Destruction complete after 0s
Destroy complete! Resources: 1 destroyed.Cuối cùng, terraform destroy giúp dọn dẹp toàn bộ tài nguyên đã tạo — trong ví dụ này là null_resource.hello. Lúc này Terraform sẽ xóa trạng thái liên quan khỏi file terraform.tfstate.
Như vậy, bạn đã hoàn thành vòng đời cơ bản của một cấu hình Terraform: init → apply → destroy.
Tóm lại:
- Provider = “Cầu nối” đến hạ tầng (Docker, Azure, AWS, v.v.)
- Resource = “Thực thể thật” bạn muốn tạo (container, VM, storage, v.v.)
- Provisioning = Giai đoạn Terraform chạy lệnh tạo hoặc xóa hạ tầng thật.
Tiếp theo, chúng ta có thể thử áp dụng tương tự với các provider “thật” như Azure, AWS hoặc Docker, để thấy Terraform phát huy sức mạnh tự động hóa hạ tầng thực sự.
Nhận xét
Đăng nhận xét