はじめに
Terraformは、様々なプラットフォーム上のインフラストラクチャリソースを定義、プロビジョニング、および管理することができる人気のあるインフラストラクチャコードツールです。Terraformの中核となるのが、リソースブロックで、特定のプロバイダーにおけるリソースの望ましい状態を定義するために使用されます。
さらに、Terraform Dataは既存のインフラストラクチャリソースから情報を取得するために使用されます。
この記事では、Terraform ResourceとDataについて詳しく説明します。
Terraformリソース
Terraformの中核となるのが、リソースブロックで、特定のプロバイダーにおけるリソースの望ましい状態を定義するために使用されます。
リソースブロックの理解
Terraformのリソースブロックとは、仮想マシン、データベース、ロードバランサーなどの特定のインフラストラクチャオブジェクトを定義する構成ブロックです。オブジェクトの望ましい状態と、作成および管理するために必要なプロバイダー固有の詳細を指定します。リソースブロックは、次の構文を使用して定義されます。
resource "provider_type" "resource_name" {
argument1 = value1
argument2 = value2
...
}
provider_type
パラメータは、AWSやGoogleなどのプロバイダーの名前を指定し、resource_name
パラメータはリソースの名前を指定します。argument
パラメータは、リソースの望ましい状態を定義するために使用されます。
リソース構成構文
リソースブロックの構成構文は、プロバイダー固有であり、作成されるリソースの種類に依存します。例えば、AWSでEC2インスタンスを作成するための単純なリソースブロックを考えてみます。
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
}
この例では、aws_instance
がプロバイダータイプであり、example
がリソース名であることがわかります。ami
とinstance_type
パラメータは、EC2インスタンスの所望の状態を指定するために使用されます。tags
パラメータは、インスタンスにメタデータを追加するために使用されます。
リソースの依存関係と実行順序
Terraformでは、リソース同士に依存関係を設定することができます。つまり、あるリソースの作成には他のリソースが存在する必要がある場合があります。Terraformは、依存関係に基づいてリソースの作成順序を自動的に決定します。作成するリソースがまだ存在しない依存関係がある場合、Terraformは依存関係が作成されるまで待機し、その後に依存するリソースを作成します。
例えば、AWSでセキュリティグループを作成するためのリソースブロックを考えてみます。
resource "aws_security_group" "example" {
name_prefix = "example-"
description = "Example security group"
vpc_id = aws_vpc.example.id
ingress {
from_port = 0
to_port = 65535
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
この例では、aws_vpc.example.id
が、以前に作成されたVPCリソースに依存するように設定されています。Terraformは、セキュリティグループを作成する前に、必要に応じてVPCリソースを作成します。
Terraformデータソース
Terraform Dataは、既存のインフラリソースから情報を取得するために使用されます。
データソースの理解
Terraformにおけるデータソースとは、EC2インスタンスやセキュリティグループなど、既存のインフラリソースから情報を取得するための構成ブロックです。データソースは次の構文を使用して定義されます。
data "provider_type_resource_type" "data_source_name" {
argument1 = value1
argument2 = value2
...
}
provider_type
パラメータは、AWSやGoogleなどのプロバイダーの名前を指定します。resource_type
パラメータは、データを取得するリソースの種類を指定します。data_source_name
パラメータは、データソースに名前を付けます。引数パラメータは、取得するデータを定義するために使用されます。
データ構成構文
データソースの構成構文はプロバイダーに依存し、取得されるリソースの種類に依存します。例えば、AWSでEC2インスタンスの情報を取得するための単純なデータソースを考えてみます。
data "aws_instance" "example" {
instance_id = "i-0123456789abcdef0"
}
この例では、aws_instance
はプロバイダータイプであり、example
はデータソース名です。instance_id
パラメータは、情報を取得するEC2インスタンスのIDを指定するために使用されます。
データ依存関係と実行順序
Terraformのデータソースは、他のリソースに依存することができます。これは、データソースの作成に他のリソースが存在する必要があることを意味します。Terraformは、依存関係に基づいてデータソースの作成順序を自動的に決定します。データソースがまだ作成されていないリソースに依存する場合、Terraformは依存関係が作成されるまでデータソースの作成を待機します。
例えば、AWSでVPCの情報を取得するデータソースを考えてみます。
data "aws_vpc" "example" {
id = aws_subnet.example.vpc_id
}
この例では、aws_subnet.example.vpc_id
は以前に作成されたサブネットリソースに依存することを定義しています。Terraformはデータソースが作成される前にサブネットリソースが作成されるようにします。
リソースブロックでデータ出力を使用
Terraformでは、データソースで取得したデータをリソースブロックで参照するためにデータ出力を使用できます。例えば、AWSでEC2インスタンスを作成し、データソースで取得したVPC IDを参照するリソースブロックを考えてみます。
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
subnet_id = aws_subnet.example.id
tags = {
Name = "example-instance"
}
}
data "aws_vpc" "example" {
id = aws_subnet.example.vpc_id
}
output "vpc_id" {
value = data.aws_vpc.example.id
}
この例では、aws_subnet.example.id
がEC2インスタンスのサブネットIDを指定するために使用されます。data.aws_vpc.example.id
はデータソースで取得したVPC IDを参照するために使用されます。output
ブロックはVPC IDの名前付き出力を定義するために使用されます。
まとめ
Terraformは、宣言的なアプローチを用いてクラウドインフラストラクチャリソースを定義し、管理するための人気のあるインフラストラクチャコードツールです。このツールは、リソースとデータソースという2つの主要なコンポーネントに基づいて構築されています。
リソースは、特定のプロバイダー(例えば、仮想マシンやロードバランサーなど)の特定のリソースの所望の状態を定義するために使用されます。リソースブロックは、プロバイダー固有の構文を使用して定義され、お互いに依存することができます。Terraformは、依存関係に基づいてリソースの作成の順序を自動的に決定し、1つのリソースの作成が他のリソースの存在を必要としないようにします。
一方、データソースは、既存のインフラストラクチャリソース(例えば、EC2インスタンスやセキュリティグループなど)から情報を取得するために使用されます。データソースは、プロバイダー固有の構文を使用して定義され、他のリソースに依存することができます。Terraformは、依存関係に基づいてデータソースの作成の順序を自動的に決定し、データソースの作成に他のリソースの存在が必要でないようにします。
データ出力は、リソースブロック内でデータソースで取得したデータを参照するために使用できます。これにより、開発者は既存のインフラストラクチャリソースから情報を取得してリソース作成に使用することができます。
Terraformのリソースとデータソースを理解することで、開発者はクラウドインフラストラクチャリソースのプロビジョニング、構成、および管理を自動化し、効率的かつ信頼性の高い方法でインフラストラクチャリソースを定義および管理することができます。
参考