Quy luật đặt tên (Naming conventions) trong terraform.

 Naming conventions là quy ước đặt tên, nó áp dụng cho tất cả các ngon ngữ lập trình trong đó terraform không là ngoại lệ dù terraform không phải là ngôn ngữ lập trình. 

Terraform là một công cụ phần mềm dùng để thực hiện việc pháp triển hạ tầng dươi những mã code. 

Terraform cung cấp luồng làm việc dưới dạng command line để quản lý hàng trăm các dịch vụ đám mây. 

Terraform hệ thống hóa các API của dịch vụ đám mây thông qua những file cấu hình định nghĩa. 

Vậy trong terraform thì quy định đặt tên như thế nào ? 

Quy định chung: 

1. Dùng dấu gạch dưới _(underscore) thay vì dùng dấu gạch giưã (- dash) cho tất cả như: tên tài nguyên, tên dữ liệu nguồn data source, tên biến và outputs. 

2. Chỉ sử dụng ký tự thường (không ký tự hoa) và số.


Tài nguyên và data source argument.

1. Không lặp lại kiểu tài nguyên trong tên tài nguyên. 

   Nên sử dụng: resource "aws_route_table" "public" {}

   Không nên sử dụng:  resource "aws_route_table" "public_route_table" {}

   Không nên sử dụng: resource "aws_route_table" "public_aws_route_table" {}


2. Tên tài nguyên nên có tên là this nếu không có nhiều descriptive và tên biến chung. 

Ví dụ  có một kiểu resource aws_nat_gateway và có nhiều kiểu aws_route_table nên aws_nat_gateway nên có tên là this và aws_route_table có descriptive là private, public hay database.

3. Luôn sử dụng danh từ số ít của các tên.

4. Sử dụng dấu gạch ngang - cho các giá trị nhưng DNS names, RDS instances.

5. Sử dụng count trong một block như một argument đầu tiên, ví dụ :

main.tf
resource "aws_route_table" "public" {
count = "2"
vpc_id = "vpc-12345678"
# ... remaining arguments omitted
}

Và :

main.tf
resource "aws_route_table" "public" {
vpc_id = "vpc-12345678"
count = "2"
# ... remaining arguments omitted
}

6. Sử dũng tag cho những rerource tiếp theo sau là depends_on and lifecycle

Ví dụ: 

main.tf
resource "aws_nat_gateway" "this" {
count = "1"
allocation_id = "..."
subnet_id = "..."
tags = {
Name = "..."
}
depends_on = ["aws_internet_gateway.this"]
lifecycle {
create_before_destroy = true
}
}

 Và: 

main.tf
resource "aws_nat_gateway" "this" {
count = "1"
tags = "..."
depends_on = ["aws_internet_gateway.this"]
lifecycle {
create_before_destroy = true
}
allocation_id = "..."
subnet_id = "..."
}

7. Khi sử dụng điều kiện trong count thì sư dung giá trị boolean, ví dụ: 


main.tf
count = "${length(var.public_subnets) > 0 ? 1 : 0}"

và : 

main.tf
count = "${var.create_public_subnets}"

8. Trong điều kiển đảo ngược thì không mở đầu bằng một biến khác khi không thật sự cần thiết. 

sử dụng: 1 - boolean value

Ví dụ: count = "${1 - var.create_public_subnets}"

Biến:

Không tự phát minh ra những biến khác trong các module resource, mà sử dụng cùng tên biến, mô tả ,

định nghĩa trong phần "Argument Reference" của tài nguyên đó mà bạn đang làm việc.

Gán type = "list" nếu có một định nghĩa : default = []

Gán type = "map" nếu có một định nghiã: default = {}

Sử dụng hình thức số nhiều của tên biến khi nó là list hoặc map

Khi định nghĩa biến sắp xếp theo khóa thì theo thứ tự : description , type, default

Luôn thêm mô tả cho tất cả các biến thậm chí bạn biến đó dã tường minh.

Outputs:

Tên củả output là rất quan trọng vì tên làm chúng ta dễ hiểu

1. Gợi ý chung cho tên của những output là các gía trị output nên được mô tả đầy đủ.

2. Có một cấu trúc tốt cho tên các output {name}_{type}_{attribute}

outputs.tf
output "security_group_id" {
description = "The ID of the security group"
value = "${element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), list("")), 0)}"
}
output "another_security_group_id" {
description = "The ID of web security group"
value = "${element(concat(aws_security_group.web.*.id, list("")), 0)}"
}

3. Nếu output ra la giá trị với phép nội suy thì : dùng this ví dụ như :

outputs.tf
output "this_security_group_id" {
description = "The ID of the security group"
value = "${element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.this_name_prefix.*.id), list("")), 0)}"
}

và:

outputs.tf
output "security_group_id" {
description = "The ID of the security group"
value = "${element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), list("")), 0)}"
}
output "another_security_group_id" {
description = "The ID of web security group"
value = "${element(concat(aws_security_group.web.*.id, list("")), 0)}"
}

  4. Nếu giá trị trả về là một list thì tên nên là số nhiều ví dụ:

outputs.tf
output "this_rds_cluster_instance_endpoints" {
description = "A list of all cluster instance endpoints"
value = ["${aws_rds_cluster_instance.this.*.endpoint}"]
}

5. Luôn sử dụng description cho tất cả các output thậm chí bạn thấy nó là đã rõ ràng


Nhận xét

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

Trang web medium.com chết, vì sao ?

Cách sử dụng sys.argv trong python.

Thiết kế một RESTful API bằng python và flask.