1. Terraform State là gì?
Terraform State là cơ chế mà Terraform sử dụng để lưu trữ thông tin về tài nguyên mà nó quản lý. State bao gồm thông tin về tất cả các tài nguyên đã được tạo ra bởi Terraform, bao gồm cả ID tài nguyên, thuộc tính và giá trị của chúng.
Terraform State được lưu trữ trong một tập tin có tên là “terraform.tfstate” hoặc “terraform.tfstate.d”. Nếu sử dụng remote backend, state được lưu trữ ở xa, ví dụ như trong Amazon S3 hoặc HashiCorp Consul.
2. Cú pháp khai báo.
terraform {
backend "backend_type" {
configuration_options
}
}
Với backend_type
là tên của backend bạn muốn sử dụng. configuration_options
là các tùy chọn cấu hình backend. Ví dụ, nếu bạn muốn sử dụng Amazon S3 làm backend, bạn có thể khai báo như sau:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "terraform.tfstate"
region = "us-east-1"
}
}
Trong đó:
s3
là tên của backend bạn muốn sử dụng.bucket
là tên của bucket S3 mà bạn muốn lưu trữ state.key
là tên file state trên S3.region
là khu vực AWS mà bucket S3 được lưu trữ.
Nếu bạn muốn sử dụng Consul làm backend, bạn có thể khai báo như sau:
terraform {
backend "consul" {
address = "consul.service.consul:8500"
path = "terraform/state"
}
}
Trong đó:
consul
là tên của backend bạn muốn sử dụng.address
là địa chỉ của Consul server.path
là đường dẫn trong Consul để lưu trữ state.
3. Các lưu ý khi sử dụng Terraform State.
Khi sử dụng Terraform State, có một số lưu ý sau cần được lưu ý:
- Terraform State là rất quan trọng và cần được bảo vệ. Nó chứa tất cả các thông tin về các resource mà Terraform đang quản lý. Nếu Terraform State bị mất hoặc bị thay đổi một cách không đúng đắn, thì sẽ ảnh hưởng đến quá trình quản lý các resource của Terraform. Do đó, cần đảm bảo rằng Terraform State được lưu trữ an toàn và không bị mất hoặc bị thay đổi một cách không đúng đắn.
- Nên sử dụng các backend hỗ trợ locking, để đảm bảo rằng chỉ một người dùng có thể thay đổi Terraform State một cách an toàn. Nếu nhiều người dùng cùng thay đổi Terraform State, có thể dẫn đến việc xung đột và mất dữ liệu.
- Terraform State có thể lưu trữ trên nhiều backend khác nhau, chẳng hạn như Amazon S3, Google Cloud Storage, hoặc trong cơ sở dữ liệu. Việc chọn backend phù hợp phụ thuộc vào nhu cầu sử dụng và khả năng triển khai.
- Terraform State nên được backup định kỳ để đảm bảo rằng các thông tin về resource được lưu trữ an toàn và có thể khôi phục lại nếu cần.
- Khi xóa một resource, nó cần phải được xóa cả khỏi Terraform State để đảm bảo rằng không có dữ liệu thừa bị lưu trữ. Có thể sử dụng câu lệnh
terraform state rm
để xóa resource khỏi Terraform State. - Khi sử dụng module, Terraform State của module con sẽ được lưu trữ trong Terraform State của module cha. Việc quản lý Terraform State của module là rất quan trọng để đảm bảo tính nhất quán của toàn bộ hạ tầng được quản lý bởi Terraform.
- Terraform State sẽ được cập nhật mỗi khi chạy lệnh
terraform apply
. Việc cập nhật này sẽ cập nhật thông tin mới nhất của các resource mà Terraform quản lý vào Terraform State. - Điều chỉnh state có thể gây ra sự cố: Việc sửa đổi state một cách không cẩn thận có thể gây ra sự cố, nhất là khi các tài nguyên có liên quan được quản lý bởi các công cụ bên ngoài.
- Terraform không quản lý state của tài nguyên bên ngoài: Terraform không thể quản lý state của tài nguyên bên ngoài, do đó, nếu có sự thay đổi trong state của một tài nguyên bên ngoài, bạn cần phải cập nhật state của Terraform bằng tay.
- Terraform State Locking: Terraform State Locking là một tính năng giúp tránh xung đột khi nhiều người cùng làm việc trên cùng một state. Tính năng này sử dụng khóa để đảm bảo rằng chỉ có một người có thể sửa đổi state của Terraform tại một thời điểm.
- Backup Terraform State: Để đảm bảo an toàn, bạn nên định kỳ sao lưu state của Terraform và lưu trữ nó ở một nơi an toàn. Nếu state bị mất hoặc bị hỏng, bạn có thể khôi phục lại từ bản sao lưu.
- State là nhạy cảm với bảo mật: State có thể chứa thông tin nhạy cảm như mật khẩu hoặc thông tin xác thực. Bạn nên đảm bảo rằng state được bảo vệ và chỉ được truy cập bởi những người có quyền truy cập.
- Điều chỉnh state không phải là giải pháp lâu dài: Đôi khi, điều chỉnh state có thể giúp khắc phục sự cố ngay lập tức, tuy nhiên, việc thực hiện điều này thường không phải là giải pháp lâu dài.
- Khi sử dụng Terraform State là nó có thể trở nên rất lớn và khó quản lý khi triển khai một số hạ tầng phức tạp. Điều này có thể dẫn đến thời gian triển khai chậm hơn và các lỗi không mong muốn. Để giải quyết vấn đề này, có thể sử dụng các kỹ thuật như state partitioning (phân chia trạng thái) hoặc state compression (nén trạng thái) để giảm kích thước của Terraform State. Ngoài ra, việc sử dụng các công cụ quản lý trạng thái bên ngoài như HashiCorp Consul, Amazon S3 hay Google Cloud Storage cũng có thể giúp quản lý Terraform State một cách hiệu quả hơn.
- Luôn luôn cần phải cẩn thận khi thay đổi thông tin của các tài nguyên đã được tạo. Nếu bạn thay đổi thông tin một tài nguyên trong hệ thống và không cập nhật lại trạng thái của Terraform State, Terraform có thể không nhận ra thay đổi đó và sẽ không thực hiện bất kỳ thay đổi nào trên tài nguyên đó trong khi chạy các lệnh apply hoặc destroy. Do đó, cần cẩn thận đảm bảo rằng Terraform State của bạn được cập nhật đầy đủ và chính xác khi thực hiện thay đổi trên hệ thống.
- Khi sử dụng Terraform State là cần đảm bảo rằng tất cả các thành viên trong nhóm đang làm việc với cùng một phiên bản của state để tránh sự xung đột và mất dữ liệu. Nếu nhiều người đang làm việc trên cùng một file state, có thể xảy ra tình huống khi một người cập nhật file state còn người khác cập nhật file state trong cùng một thời điểm, dẫn đến sự xung đột và mất dữ liệu.
Để giải quyết vấn đề này, có thể sử dụng các giải pháp như sử dụng một hệ thống quản lý phiên bản như Git để đồng bộ hóa các thay đổi với Terraform State hoặc sử dụng một dịch vụ quản lý state được cung cấp bởi các nhà cung cấp đám mây, chẳng hạn như AWS S3 bucket cho việc lưu trữ Terraform State của các tài nguyên AWS.
4. Các ví dụ minh hoạ.
– Ví dụ 1:
Đây là một ví dụ về việc khai báo Terraform State cho một virtual machine trong KVM:
resource "libvirt_domain" "example" {
name = "example-vm"
memory = 1024
vcpu = 2
disk {
volume_id = libvirt_volume.example.id
}
network_interface {
network_name = "example-network"
}
}
resource "libvirt_volume" "example" {
name = "example-disk"
capacity = 10
format_type = "qcow2"
}
terraform {
backend "local" {
path = "terraform.tfstate"
}
}
Trong ví dụ này, chúng ta khai báo một máy ảo và một ổ đĩa cho máy ảo đó. Sau đó, chúng ta sử dụng Terraform để lưu trữ trạng thái của những thay đổi mà chúng ta thực hiện trên máy ảo và ổ đĩa đó. Bằng cách sử dụng backend “local”, Terraform sẽ lưu trữ trạng thái của tài nguyên trong file terraform.tfstate tại thư mục hiện tại. Từ đó, Terraform có thể kiểm tra trạng thái hiện tại của tài nguyên và cập nhật lại các tài nguyên đó khi chúng ta thực hiện các lệnh như terraform plan và terraform apply.
Ví dụ 2:
Ví dụ về Terraform State trong AWS là khi ta sử dụng module aws_s3_bucket
để tạo một Amazon S3 bucket. Khi tạo, Terraform sẽ lưu trạng thái của bucket đó trong file state để theo dõi các thay đổi sau này.
Ví dụ dưới đây sẽ tạo một Amazon S3 bucket và sử dụng Terraform State để lưu trữ trạng thái:
resource "aws_s3_bucket" "example" {
bucket = "example-bucket"
acl = "private"
}
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "example-bucket/terraform.tfstate"
region = "us-east-1"
}
}
Trong đoạn code trên, chúng ta đã khai báo một resource aws_s3_bucket
có tên là "example"
với tên bucket là "example-bucket"
và ACL là "private"
. Sau đó, ta đã cấu hình backend sử dụng Amazon S3 để lưu trữ Terraform State. State sẽ được lưu trữ trong bucket có tên là "my-terraform-state"
và key là "example-bucket/terraform.tfstate"
, trong khu vực "us-east-1"
.
Sau khi Terraform thực thi, nếu trạng thái của bucket thay đổi, Terraform sẽ cập nhật trạng thái này trong file state và theo dõi các thay đổi này. Khi chúng ta thực hiện terraform apply
sau khi đã thay đổi một số giá trị, Terraform sẽ sử dụng state để so sánh với cấu hình hiện tại và chỉ thực hiện các thay đổi cần thiết để đưa hệ thống về trạng thái mới.