このトピックでは、リソースの依存関係について説明します。
インフラストラクチャを構築する際、依存関係グラフを視覚化してインフラストラクチャのアーキテクチャを理解できます。このグラフは、リソースがどのように接続され、相互に依存しているかを示します。
Terraform が実行されると、設定ファイルから自動的に依存関係グラフを構築し、実行計画を生成してリソースのステータスをリフレッシュします。次のコードは、ECS インスタンスを作成するために使用される設定ファイルの例です。
provider "alicloud" {
# Alibaba Cloud の認証情報とリージョン情報を設定します。
# Alibaba Cloud の認証情報を設定します。セキュリティ上の理由から、Alibaba Cloud の AccessKey と SecretKey をこのファイルに直接含めないことをお勧めします。環境変数または他の安全な方法を使用して認証情報を設定することをお勧めします。
# export ALICLOUD_ACCESS_KEY="<お使いの Alibaba Cloud AccessKey>"
# export ALICLOUD_SECRET_KEY="<お使いの Alibaba Cloud SecretKey>"
region = "cn-hangzhou"
}
# VPC を作成します。
resource "alicloud_vpc" "my_vpc" {
vpc_name = "main-vpc"
cidr_block = "10.0.0.0/16"
}
# vSwitch を作成します。
resource "alicloud_vswitch" "my_vswitch" {
vpc_id = alicloud_vpc.my_vpc.id
cidr_block = "10.0.1.0/24"
zone_id = "cn-hangzhou-h"
vswitch_name = "main-vswitch"
}
# セキュリティグループを作成します。
resource "alicloud_security_group" "my_sg" {
vpc_id = alicloud_vpc.my_vpc.id
name = "main-security-group"
}
# SSH アクセスを許可するセキュリティグループルールを追加します。
resource "alicloud_security_group_rule" "allow_ssh" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "22/22"
priority = 1
security_group_id = alicloud_security_group.my_sg.id
cidr_ip = "0.0.0.0/0"
}
# ECS インスタンスを作成します。
resource "alicloud_instance" "my_instance" {
instance_name = "Ubuntu20-Instance"
image_id = "ubuntu_20_04_x64_20G_alibase_20240508.vhd" # Ubuntu 20.04 のイメージ ID。
instance_type = "ecs.c6.large" # 2 vCPU と 4 GiB のメモリ。
security_groups = [alicloud_security_group.my_sg.id]
vswitch_id = alicloud_vswitch.my_vswitch.id
internet_charge_type = "PayByTraffic"
instance_charge_type = "PostPaid"
system_disk_category = "cloud_efficiency"
password = "Abc@12345" # ログインパスワードを設定します。
internet_max_bandwidth_out = 10 # 帯域幅を 0 より大きい値に設定すると、インターネット IP アドレスが自動的に割り当てられます。
tags = {
Name = "ubuntu20"
}
}ECS インスタンスの作成は、セキュリティグループと vSwitch に依存します。この依存関係は、security_groups および vswitch_id プロパティに値を割り当てることによって確立されます。Terraform が実行されると、この依存関係グラフを使用してリソース操作の正しい順序を決定します。複数のリソースが存在する複雑なシナリオでは、Terraform は依存関係のないリソースに対して操作を並行して実行します。
依存関係
Terraform は、暗黙的な依存関係と明示的な依存関係の 2 種類の依存関係をサポートしています。Terraform は暗黙的な依存関係を自動的に検出します。ただし、明示的な依存関係は手動で宣言する必要があります。
暗黙的な依存関係
あるリソースが別のリソースの属性に依存している場合、Terraform はこの関係を暗黙的な依存関係として推測できます。
この例では、vSwitch とセキュリティグループは VPC に依存します。ECS インスタンスは vSwitch とセキュリティグループに依存します。セキュリティグループルールはセキュリティグループに依存します。これらはすべて暗黙的な依存関係です。
Terraform は、プロパティ値の割り当てにおけるリファレンスを通じて暗黙的な依存関係を検出します。
たとえば、インスタンスの vswitch_id パラメーターは my_vswitch リソースを参照します。これにより、インスタンスリソースから vSwitch リソースへの暗黙的な依存関係が確立されます。
Terraform は、暗黙的な依存関係を推測してリソースの作成順序を決定します。このプロセスにより、設定ファイル内のすべてのリソースが正しい順序で作成されることが保証されます。
この例では、リソース間の依存関係と作成順序は次のグラフで示されます。
Terraform が設定を読み取ると、正しい順序でリソースを作成します。まず、VPC my_vpc が作成され、次に vSwitch my_vswitch とセキュリティグループ my_sg が作成されます。ECS インスタンス my_instance は最後に作成されます。すべてのリソースが作成されると、Terraform はそれらのプロパティをステータスファイルに保存します。my_vswitch と my_sg の vpc_id パラメーターを my_vpc の ID に設定します。また、my_vswitch と my_sg の ID を使用して、my_instance の vswitch_id と security_groups パラメーターを設定します。
明示的な依存関係
2 つのリソース間の依存関係が、データへの直接的なリファレンスを伴わないために Terraform から見えない場合があります。このような場合、設定コードで depends_on 引数を使用して依存関係を明示的に宣言する必要があります。
depends_on 引数を使用すると、Terraform がリソースを処理する順序をより詳細に制御できます。depends_on は任意のリソースまたはモジュールで使用でき、その値は同じ設定内の他のリソースへのリファレンスのリストである必要があります。
たとえば、上記の設定に基づいて、ポート 443 と 8080 のアクセスルールを追加する必要があるとします。また、ポート 8080 のルールがポート 443 のルールが作成された後にのみ作成されるようにしたいとします。この依存関係は Terraform からは見えないため、明示的に宣言する必要があります。depends_on を使用して、ポート 8080 のルールがポート 443 のルールに依存することを宣言できます。
depends_on 引数があるため、Terraform はポート 443 のアクセスルールがポート 8080 のアクセスルールの前に作成されることを保証します。terraform apply を実行すると、ポート 8080 のアクセスルールはポート 443 のアクセスルールの後に作成されます。
最後に、設定ファイルでリソースを定義する順序は実行順序に影響しないことに注意してください。したがって、あなたとあなたのチームにとって最も理にかなった方法で設定ファイルを整理できます。