Bài 8: Sử Dụng Output Trong Terraform


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

Output Trong Terraform Là Gì?

3ac68607-6e1f-44e6-80cc-4384ed16480c

Output trong Terraform là các giá trị được định nghĩa để xuất thông tin từ tài nguyên hoặc dữ liệu sau khi triển khai hạ tầng. Output cho phép bạn trích xuất các chi tiết quan trọng, như ID máy ảo, địa chỉ IP công cộng, hoặc tên bucket S3, để sử dụng trong các kịch bản khác hoặc hiển thị cho người dùng. Output được khai báo trong block output trong file .tf và là một phần quan trọng trong việc quản lý và giám sát hạ tầng, một kỹ nă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 Output Trong Quản Lý Hạ Tầng

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

  • Trích xuất thông tin: Cung cấp thông tin về tài nguyên (VD: IP của EC2) mà không cần kiểm tra thủ công trên console.
  • Tích hợp với công cụ khác: Dùng output để truyền thông tin sang các công cụ CI/CD, module khác, hoặc script.
  • Giám sát và kiểm tra: Giúp xác nhận trạng thái tài nguyên sau khi áp dụng terraform apply.
  • Hỗ trợ nhiều môi trường: Dùng output để quản lý thông tin giữa các môi trường (dev, staging, prod).

Cấu Trúc Và Khai Báo Output

Cú Pháp Cơ Bản Của Output Block

Cú pháp cơ bản của một output block:

output "<NAME>" {
  value       = <EXPRESSION>
  description = "<DESCRIPTION>"
  sensitive   = <BOOLEAN>
}
  • <NAME>: Tên output, duy nhất trong dự án (VD: instance_id).
  • value: Giá trị trích xuất, thường là thuộc tính của resource (VD: aws_instance.web.id).
  • description: Mô tả mục đích của output.
  • sensitive: Đánh dấu output là nhạy cảm (VD: password) để ẩn khi hiển thị.

Các Thuộc Tính Quan Trọng Của Output

  • value: Bắt buộc, có thể là thuộc tính resource, biến, hoặc biểu thức (VD: var.region).
  • description: Tùy chọn, giúp người dùng hiểu ý nghĩa output.
  • sensitive: Tùy chọn, nếu true, giá trị sẽ bị ẩn trong output (VD: *sensitive value*).

Sử Dụng Output Với Resource

  • File main.tf (sử dụng với AWS):

    provider "aws" {
    region     = "us-east-1"
    access_key = "YOUR_ACCESS_KEY"
    secret_key = "YOUR_SECRET_KEY"
    }
    
    resource "aws_instance" "web_server" {
    ami           = "ami-0c55b159cbfafe1f0"
    instance_type = "t2.micro"
    tags = {
      Name = "WebServer"
    }
    }
    
    resource "aws_s3_bucket" "data_bucket" {
    bucket = "my-unique-bucket-20230518"
    tags = {
      Name = "DataBucket"
    }
    }
    
    output "instance_id" {
    value       = aws_instance.web_server.id
    description = "The ID of the EC2 instance"
    }
    
    output "instance_public_ip" {
    value       = aws_instance.web_server.public_ip
    description = "The public IP of the EC2 instance"
    }
    
    output "bucket_name" {
    value       = aws_s3_bucket.data_bucket.bucket
    description = "The name of the S3 bucket"
    sensitive   = false
    }
  • Ý nghĩa: Output trích xuất ID, IP công cộng của EC2, và tên bucket S3.

Truy Xuất Output Sau Khi Triển Khai

Xem Output Qua Lệnh Terraform Output

  • Input: Chạy lệnh sau khi terraform apply.
    terraform output
  • Output:
    instance_id = "i-1234567890abcdef0"
    instance_public_ip = "54.123.45.67"
    bucket_name = "my-unique-bucket-20230518"
  • Input: Xem output cụ thể.
    terraform output instance_public_ip
  • Output:
    54.123.45.67

Lưu Output Vào File

  • Input: Lưu output vào file JSON.
    terraform output -json > outputs.json
  • Output file outputs.json:
    {
    "instance_id": {
      "value": "i-1234567890abcdef0",
      "type": "string"
    },
    "instance_public_ip": {
      "value": "54.123.45.67",
      "type": "string"
    },
    "bucket_name": {
      "value": "my-unique-bucket-20230518",
      "type": "string"
    }
    }
  • Ý nghĩa: Dùng file JSON để tích hợp với script hoặc công cụ khác.

Sử Dụng Output Trong Nhiều Môi Trường

  • File main.tf (sử dụng biến và output cho nhiều môi trường):

    variable "environment" {
    type    = string
    default = "dev"
    }
    
    resource "aws_instance" "web_server" {
    ami           = "ami-0c55b159cbfafe1f0"
    instance_type = "t2.micro"
    tags = {
      Name = "WebServer-${var.environment}"
    }
    }
    
    output "instance_id_${var.environment}" {
    value       = aws_instance.web_server.id
    description = "The ID of the EC2 instance in ${var.environment} environment"
    }
  • Quy trình:
    1. terraform apply -var "environment=prod" -auto-approve.
    2. terraform output: Output:
      instance_id_prod = "i-0987654321fedcba0"
  • Ý nghĩa: Output tự động điều chỉnh theo môi trường.

Ví Dụ Thực Tế: Sử Dụng Output Để Trích Xuất Thông Tin

  • File variables.tf:

    variable "region" {
    type        = string
    description = "AWS region to deploy resources"
    default     = "us-east-1"
    }
    
    variable "instance_count" {
    type        = number
    description = "Number of EC2 instances"
    default     = 2
    }
  • File terraform.tfvars:
    region        = "us-east-1"
    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 = "t2.micro"
    tags = {
      Name = "WebServer-${count.index}-${var.region}"
    }
    
    depends_on = [aws_s3_bucket.data_bucket]
    }
    
    output "bucket_name" {
    value       = aws_s3_bucket.data_bucket.bucket
    description = "The name of the S3 bucket"
    }
    
    output "instance_ids" {
    value       = aws_instance.web_server[*].id
    description = "The IDs of the EC2 instances"
    }
    
    output "instance_public_ips" {
    value       = aws_instance.web_server[*].public_ip
    description = "The public IPs of the EC2 instances"
    }
  • 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 (tóm tắt):

      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)
      }
      
      # 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)
       + public_ip     = (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)
       + public_ip     = (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"
      ]
      instance_public_ips = [
      "54.123.45.67",
      "54.123.45.68"
      ]
    4. terraform output -json > outputs.json: Output file outputs.json:
      {
      "bucket_name": {
       "value": "my-unique-bucket-20230518-us-east-1",
       "type": "string"
      },
      "instance_ids": {
       "value": ["i-0abcdef123456789", "i-1abcdef123456789"],
       "type": "list"
      },
      "instance_public_ips": {
       "value": ["54.123.45.67", "54.123.45.68"],
       "type": "list"
      }
      }

Lưu Ý Quan Trọng Khi Sử Dụng Output

  • Giá trị nhạy cảm: Đánh dấu sensitive = true cho output chứa thông tin nhạy cảm (VD: mật khẩu) để tránh hiển thị.
  • Kiểm tra tính khả dụng: Chỉ trích xuất thuộc tính đã sẵn sàng (VD: public_ip chỉ có sau khi instance được tạo).
  • Tên output rõ ràng: Đặt tên mô tả (VD: instance_public_ip thay vì ip) để dễ hiểu.
  • Sao lưu state: File terraform.tfstate chứa thông tin output, sao lưu trước khi thay đổi cấu hình.
  • Lỗi truy xuất: Nếu terraform output báo lỗi (VD: “Output not found”), kiểm tra tên output hoặc chạy terraform apply lại.

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 output. Bạn cần nắm:

  • Câu hỏi mẫu:
    • “Lệnh nào dùng để xem output sau khi áp dụng?”
      Đáp án: terraform output.
    • “Cách khai báo output trích xuất ID của resource là gì?”
      Đáp án: output "name" { value = aws_instance.example.id }.
    • “Output nhạy cảm sẽ hiển thị như thế nào?”
      Đáp án: *sensitive value* nếu sensitive = true.
  • Thực hành: Kỳ thi có thể yêu cầu nhận diện cấu hình output hoặc dự đoán output khi áp dụng resource.

Kết Luận

Sử dụng output trong Terraform giúp trích xuất thông tin tài nguyên một cách hiệu quả, hỗ trợ quản lý và giám sát hạ tầng. Hiểu cách khai báo, truy xuất, 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 hiểu và quản lý Terraform State.

Điều hướng chuỗi bài viết<< Bài 7: Sử Dụng Biến (Variables) Trong Terraform
>> Bài 9: Hiểu Terraform State Quản Lý Trạng Thái Hạ Tầng

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