Trong quá trình thiết kế và triển khai hạ tầng, có bao giờ bạn đã nghe đến thuật ngữ monolithic infrastructure configuration chưa, mình nghĩ nó bắt nguồn từ micro service, vì bây giờ với các công cụ IaC, chúng ta hoàn toàn có thể đạt được điều đó.
Monolithic infrastructure configuration
Khi bạn tạo resource thông qua Terraform, thì Terraform sẻ tạo ra một file state.tf để lưu lại toàn bộ trạng thái của hạn tầng.
Những resource liên quan và phụ thuộc vào nhau sẽ dựa vào file này để lấy thông tin của nhau. Cách làm này về cơ bản là không có gì sai, nhưng giả sử bạn deploy một service mới và nó phụ thuộc vào service management, và sau này bạn có nhu cầu update management thì resource service sẽ bị ảnh hưởng, hoặc bạn sẽ dễ gặp vấn đề phụ thuộc vòng tròn…vv
Giữ cho resource tách biệt
Trong seri “Bộ khung Terraform” mình đã sử dụng Terragrunt để tạo nên sự tách biệt giữa các modules(service), nhưng có thể đói với một số bạn đọc sẻ cảm thấy terrafrunt phức tạp, kể từ phiên bản Terraform 0.13, tính năng remote_state_data đã được thêm vào.
Thay vì thông thường các resource sẽ được một file state quản lý, thì bây giờ mỗi resource sẽ có một file state riêng.
Giả sử mình có hạn tầng như sau
.
├── management
│ ├── outputs.tf
│ ├── route53.tf
│ └── vpc.tf
├── qa-1
│ ├── api-gateway.tf
│ └── data.tf
├── qa-2
│ ├── api-gateway.tf
│ └── data.tf
└── qa-3
├── api-gateway.tf
└── data.tf
output "route53_zone_id" {
value = "${aws_route53_zone.zone.zone_id}"
}
Để tham chiếu điều này từ một resource khác, mình sẽ làm như thế này.
data "terraform_remote_state" "management" {
backend = "s3"
config {
bucket = "craig-godden-payne-terraform-remote-state"
key = "Infrastructure/management/terraform.tfstate"
region = "eu-west-1"
}
}
"${data.terraform_remote_state.management.route53_zone_id}"