참고
# good
'resource' "aws_route_table" "public" {}
# bad
'resource' "aws_route_table" "public_route_table" {}
# bad
'resource' "aws_route_table" "public_aws_route_table" {}
this
를 쓰자. (e.g. AWS VPC 모듈에서는 aws_nat_gateway
타입은 단일 리소스이고 aws_route_table
타입은 리소스를 여러 개 만들 수 있는데 이 경우에 aws_route_table
은 더 설명할 수 있는 이름을 써야 하므로 private
, public
, database
등으로 사용해야 함.-
를 쓰자. (e.g. RDS instance의 내부 DNS name)tags
, depends_on
, lifecycle
인자를 해당 resource에서 지원하고 필요한 경우에는 이 언급 순서로 마지막에 꼭 넣고 각 인자마다 빈 칸 하나를 꼭 개행하자.### good
resource "aws_nat_gateway" "this" {
count = 2
allocation_id = "..."
subnet_id = "..."
tags = {
Name = "..."
}
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
}
### bad
resource "aws_nat_gateway" "this" {
count = 2
tags = "..."
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
allocation_id = "..."
subnet_id = "..."
}
count
/ for_each
인자로 조건문을 사용할 때, length
등의 표현식보다는 boolean 값을 쓰자.### outputs.tf
resource "aws_nat_gateway" "that" { # Best
count = var.create_public_subnets ? 1 : 0
}
resource "aws_nat_gateway" "this" { # Good
count = length(var.public_subnets) > 0 ? 1 : 0
}
name
, description
, default
등을 활용하자.list()
나 map()
이면 변수 이름을 복수형으로 하자.description
, type
, default
, validation
순서로 key를 정렬하자.description
은 무조건 넣기.type
으로 object()
는 각 key 마다 정적인 타입을 지정해줘야 하는게 아니라면 되도록 쓰지말고 간단한 타입(e.g. number
, string
, list()
, map()
, any
)을 지정해주자.object()
에서 각 필드들이 똑같은 자료형을 갖는다고 하면 map(map(string))
처럼 사용하자.object()
에서 특정 depth에 대한 type validation을 안하고 싶다거나 하나의 key에 여러 개의 자료형을 허용해야 한다면 any
자료형을 쓰자.{}
값은 map 뿐만이 아니라 object 자료형도 될 수 있는데 tomap(…)
을 통해 map 자료형으로 만들어 주자. 추가적으로 여기서 object 자료형으로 만들어주는 방법은 없음.모듈 밖에서 사용한다는 것을 감안하여 일관되고 이해가능하게 작성하자. 예를 들면, 해당 속성의 type이나 attribute를 입력하자.
output의 이름에는 포함하고 있는 속성이 뭔지도 나타내야 함. 보통 정해진 형식이 있음.
output 이름의 권고되는 구조
{name}_{type}_{attribute}
{name}
: provider prefix 없이 resource나 data source의 이름. (e.g. aws_subnet
→ subnet
, aws_vpc
→ vpc
){type}
: 리소스의 타입.{attribute}
: output에 의해 리턴되는 속성.output의 리턴값이 보간 함수(interpolation func, "${}"(중괄호) 안에 위치한 변수)를 쓰거나 리소스 여러 개를 활용한다면 가능한한 일반적이고 포괄적인 이름을 쓰자.
output의 리턴값이 list라면 복수형 이름을 쓰자.
description은 무조건 넣기.
민감한 인자는 설정하지 말자.
element(concat(…))
보다 try()
를 쓰자.
e.g.
// good
output "security_group_id" {
description = "The ID of the security group"
value = try(aws_security_group.this[0].id, aws_security_group.name_prefix[0].id, "")
}
// good : Use plural name if the returning value is a list
output "rds_cluster_instance_endpoints" {
description = "A list of all cluster instance endpoints"
value = aws_rds_cluster_instance.this.*.endpoint
}
// bad
output "this_security_group_id" {
description = "The ID of the security group"
value = element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), [""]), 0)
}