Chuyển đến nội dung chính

Terraform: "Hello Terraform!" đầu tiên trên VS Code - Part 2

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

Lệnh này phải được chạy đầu tiên trong một thư mục cấu hình Terraform mới. 
> 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. 
flowchart TD A[📁 1. Tạo thư mục dự án] --> B[📄 2. Viết file main.tf] B --> C["🧩 3. Khai báo provider (vd: docker, azurerm...)"] C --> D["⚙️ 4. Khai báo resource (vd: docker_container, vm...)"] D --> E[🚀 5. terraform init] E --> F[🔍 6. terraform validate] F --> G[📋 7. terraform plan] G --> H[✅ 8. terraform apply] H --> I["🌐 9. Resource được tạo (provision)"] I --> J[🧹 10. terraform destroy để dọn dẹp] style A fill:#e7f3ff,stroke:#6fa3ef,stroke-width:2px style J fill:#ffe7e7,stroke:#ff6b6b,stroke-width:2px

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

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.