Complete Terraform - part 4

Complete Terraform - part 4

·

5 min read

Terraform lifecycle Meta-Argument

Meta-argument "lifecycle" trong Terraform là một tính năng mạnh mẽ cho phép bạn quản lý vòng đời của tài nguyên Terraform một cách linh hoạt và chi tiết. Nó cung cấp khả năng kiểm soát các hành động khác nhau được thực hiện khi tạo, sửa đổi hoặc hủy tài nguyên.

Cách sử dụng Meta-Argument "lifecycle":

Để sử dụng meta-argument "lifecycle", bạn cần thêm khối lifecycle vào cấu hình tài nguyên Terraform của mình. Bên trong khối lifecycle, bạn có thể khai báo các hành động khác nhau cần thực hiện cho từng giai đoạn vòng đời của tài nguyên:

  • create_before: Hành động được thực hiện trước khi tạo tài nguyên.

  • create_after: Hành động được thực hiện sau khi tạo tài nguyên.

  • delete_before: Hành động được thực hiện trước khi xóa tài nguyên.

  • delete_after: Hành động được thực hiện sau khi xóa tài nguyên.

  • disable: Hành động được thực hiện khi tắt tài nguyên.

  • enable: Hành động được thực hiện khi bật tài nguyên.

Mỗi hành động có thể bao gồm các thuộc tính khác nhau để cấu hình chi tiết hơn. Ví dụ, bạn có thể chỉ định lệnh shell cần thực thi, thời gian chờ đợi trước khi thực thi hành động, v.v.

Terraform lifecycle meta-argument là các đối số được sử dụng để điều chỉnh vòng đời của một nguồn tài nguyên trong quá trình triển khai và quản lý bằng Terraform. Chúng cho phép bạn kiểm soát cách Terraform xử lý các thay đổi trong các tài nguyên đã triển khai.

Có hai meta-arguments chính trong lifecycle là create_before_destroyprevent_destroy.

  1. create_before_destroy: Đây là một meta-argument được sử dụng để xác định liệu Terraform có nên tạo ra nguồn tài nguyên mới trước khi hủy bỏ nguồn tài nguyên hiện tại hay không. Điều này giúp đảm bảo rằng sẽ có một phiên bản mới của tài nguyên sẵn sàng trước khi xóa phiên bản hiện tại, nhằm tránh trạng thái không gian trống hoặc mất dữ liệu.
resource "aws_instance" "example" {  
    ami           = "ami-0c94855ba95c71c99"  
    instance_type = "t2.micro"
    lifecycle {    
        create_before_destroy = true  }
}

Trong ví dụ này, khi Terraform nhận thấy rằng cần thay đổi tài nguyên aws_instance, nó sẽ tạo một phiên bản mới trước khi xóa phiên bản hiện tại. Điều này đảm bảo rằng luôn có một instance EC2 hoạt động trong quá trình triển khai, tránh trường hợp không có instance nào tồn tại.

  1. prevent_destroy: Đây là meta-argument được sử dụng để ngăn Terraform xóa tài nguyên một cách vô tình hoặc không đúng ý muốn. Bằng cách đặt giá trị true cho prevent_destroy, bạn yêu cầu Terraform xác nhận trước khi xóa tài nguyên.
resource "aws_s3_bucket" "example" {  
    bucket = "my-bucket"
    lifecycle {    
        prevent_destroy = true  }
}

Trong ví dụ này, khi bạn thực hiện lệnh terraform destroy để xóa bucket S3, Terraform sẽ hiển thị thông báo cảnh báo và yêu cầu xác nhận trước khi tiến hành xóa tài nguyên. Điều này giúp đảm bảo rằng tài nguyên không bị xóa một cách không cần thiết hoặc vô tình.

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_instance.instance: Creating...
aws_instance.instance: Still creating... [10s elapsed]
aws_instance.instance: Creation complete after 16s [id=i-00089623787956dbb]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Các meta-arguments trong lifecycle giúp kiểm soát và quản lý vòng đời của các nguồn tài nguyên trong Terraform, đảm bảo an toàn và tính nhất quán trong quá trình triển khai và quản lý hạ tầng của bạn.

  1. ignore_changes Thuộc tính ignore_changes trong Terraform được sử dụng để chỉ định các trường hoặc thuộc tính cụ thể của một nguồn tài nguyên mà Terraform nên bỏ qua khi so sánh và xác định sự thay đổi. Điều này cho phép bạn kiểm soát quá trình quản lý thay đổi cho các thuộc tính cụ thể, giúp tránh việc gây ra sự không cần thiết hoặc vô tình khiến Terraform thực hiện các thay đổi không mong muốn.

    Cú pháp của thuộc tính ignore_changes như sau:

     resource "aws_instance" "example" {  
         ami           = "ami-0c94855ba95c71c99"  
         instance_type = "t2.micro"
           lifecycle {    
                 ignore_changes = [attribute1,
                                   attribute2,
                                     ...    ]}
     }
    

    Trong đó:

    • attribute1, attribute2, ... là các thuộc tính mà bạn muốn bỏ qua khi Terraform kiểm tra sự thay đổi.

Ví dụ, giả sử bạn có một nguồn tài nguyên EC2 instance và bạn muốn bỏ qua bất kỳ thay đổi nào trong thuộc tính tags của instance này:

    resource "aws_instance" "example" {  
        ami           = "ami-0c94855ba95c71c99"  
        instance_type = "t2.micro"
        tags = { 
            Environment = "Production"    
            Project     = "MyProject"    
            Owner       = "John Doe"  }
      lifecycle { ignore_changes = [tag,]}
    }

Với cấu hình trên, khi Terraform thực hiện các lệnh apply hoặc plan, nếu thuộc tính tags của instance bị thay đổi, Terraform sẽ bỏ qua sự thay đổi này và không thực hiện các hành động liên quan đến việc cập nhật hay tái tạo nguồn tài nguyên.

Thuộc tính ignore_changes giúp bạn kiểm soát quá trình quản lý thay đổi cho các thuộc tính cụ thể trong Terraform, đảm bảo tính nhất quán và tránh các thay đổi không mong muốn.

  1.  resource "aws_instance" "example" {
    
       lifecycle {
         ignore_changes = all
       }
     }
    

Lưu ý:

  • Sử dụng ignore_changes một cách cẩn thận để tránh bỏ qua các thay đổi quan trọng đối với tài nguyên của bạn.

  • Việc sử dụng ignore_changes quá mức có thể khiến cơ sở hạ tầng Terraform của bạn trở nên khó quản lý và không nhất quán.