命名規則
一般的な規則
リソース名、データソース名、変数名、出力など、すべての場所で
-
(ダッシュ)の代わりに_
(アンダースコア)を使用してください。UTF-8がサポートされていても、小文字とアルファベットを使用することを推奨します。
リソースとデータソースの引数
リソース名にリソースタイプを(部分的にも、完全にも)繰り返さないでください:
`resource "aws_route_table" "public" {}`
`resource "aws_route_table" "public_route_table" {}`
`resource "aws_route_table" "public_aws_route_table" {}`
より説明的で一般的な名前が利用できない場合、またはリソースモジュールがこのタイプのリソースを1つだけ作成する場合(例えば、AWS VPCモジュールでは
aws_nat_gateway
タイプのリソースは1つだけで、aws_route_table
タイプのリソースは複数あるため、aws_nat_gateway
はthis
という名前にし、aws_route_table
にはprivate
、public
、database
のようなより説明的な名前をつけるべき)、リソース名はthis
にすべきです。名前には常に単数名詞を使用してください。
引数の値の中や、人が目にする場所(例:RDSインスタンスのDNS名)では、
-
(ハイフン)を使用してください。リソースまたはデータソースのブロック内で、
count
/for_each
引数を最初の引数として一番上に記述し、その後に改行を入れて区切ってください。リソースでサポートされている場合は
tags
引数を実質的な最後の引数として記述し、必要に応じてその後にdepends_on
とlifecycle
を続けてください。これらはすべて空行1行で区切ってください。count
/for_each
引数で条件を使用する場合は、length
やその他の式を使用するのではなく、ブール値を使用することを推奨します。
resource
のコード例
resource
のコード例count
とfor_each
の使用方法
count
とfor_each
の使用方法resource "aws_route_table" "public" {
count = 2
vpc_id = "vpc-12345678"
# ... 残りの引数は省略
}
resource "aws_route_table" "private" {
for_each = toset(["one", "two"])
vpc_id = "vpc-12345678"
# ... 残りの引数は省略
}
resource "aws_route_table" "public" {
vpc_id = "vpc-12345678"
count = 2
# ... 残りの引数は省略
}
tags
の配置
tags
の配置resource "aws_nat_gateway" "this" {
count = 2
allocation_id = "..."
subnet_id = "..."
tags = {
Name = "..."
}
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
}
resource "aws_nat_gateway" "this" {
count = 2
tags = "..."
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
allocation_id = "..."
subnet_id = "..."
}
count
内の条件
count
内の条件resource "aws_nat_gateway" "that" { # 最適
count = var.create_public_subnets ? 1 : 0
}
resource "aws_nat_gateway" "this" { # 良い
count = length(var.public_subnets) > 0 ? 1 : 0
}
変数
リソースモジュールで車輪の再発明をしないでください:作業しているリソースの "Argument Reference" セクションで定義されている通りに、変数の
name
、description
、default
値を使用してください。変数のバリデーションサポートはかなり限定的です(例:他の変数へのアクセスや参照ができません)。多くの場合この機能は役に立たないので、それを考慮して計画してください。
型が
list(...)
またはmap(...)
の場合は、変数名に複数形を使用してください。変数ブロック内のキーは次の順序で並べてください:description、type、default、validation
明白だと思える場合でも、将来必要になるので、すべての変数に必ずdescriptionを含めてください。
各キーに厳密な制約が必要な場合を除き、
object()
のような特定の型よりも、シンプルな型(number
、string
、list(...)
、map(...)
、any
)の使用を推奨します。マップのすべての要素が同じ型(例:
string
)を持つ場合、または変換可能な場合(例:number
型はstring
に変換可能)は、map(map(string))
のような特定の型を使用してください。特定の深さから型バリデーションを無効にする場合や、複数の型をサポートする必要がある場合は、
any
型を使用してください。値
{}
は時にマップであり、時にオブジェクトです。オブジェクトを作成する方法がないため、マップを作成するにはtomap(...)
を使用してください。
出力
出力はスコープ外でも一貫性があり理解しやすいものにしてください(モジュールを使用するユーザーにとって、返される値の型と属性が明らかであるべきです)。
出力名は、含まれるプロパティを説明するものであり、通常望むよりも自由度は低くすべきです。
出力名の良い構造は
{name}_{type}_{attribute}
のようになります。ここで:{name}
はリソースまたはデータソース名ですdata "aws_subnet" "private"
の{name}
はprivate
ですresource "aws_vpc_endpoint_policy" "test"
の{name}
はtest
です
{type}
はプロバイダーのプレフィックスを除いたリソースまたはデータソースの型ですdata "aws_subnet" "private"
の{type}
はsubnet
ですresource "aws_vpc_endpoint_policy" "test"
の{type}
はvpc_endpoint_policy
です
{attribute}
は出力によって返される属性です例を参照してください。
出力が補間関数と複数のリソースを使用した値を返す場合、
{name}
と{type}
はできるだけ一般的にすべきです(プレフィックスとしてのthis
は省略すべき)。例を参照してください。返される値がリストの場合は、複数形の名前にすべきです。例を参照してください。
明白だと思える場合でも、すべての出力に必ず
description
を含めてください。すべてのモジュールのすべての場所でその出力の使用を完全に制御できない限り、
sensitive
引数の設定は避けてください。(0.13以前のバージョンでの従来のアプローチである)
element(concat(...))
よりも(Terraform 0.13以降で利用可能な)try()
を推奨します。
output
のコード例
output
のコード例セキュリティグループのIDを最大1つ返す場合:
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, "")
}
同じタイプの複数のリソースがある場合、出力名ではthis
を省略すべきです:
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)
}
返される値がリストの場合は、複数形の名前を使用してください
output "rds_cluster_instance_endpoints" {
description = "A list of all cluster instance endpoints"
value = aws_rds_cluster_instance.this.*.endpoint
}
Last updated