異なるTerraformディレクトリからのOutputの使用方法
異なるTerraformディレクトリからのOutputを使用するためには、2つの主な方法があります。
-
別のディレクトリの適用結果をハードコードする
もっとも簡単な方法は、別のディレクトリからのOutput結果を直接別のディレクトリの変数(var)にハードコードすることです。これにはOutput結果をコピーしてTerraformの設定ファイルに直接貼り付ける作業が含まれます。 -
リモートステートを使用する
2番目の方法は、terraform_remote_stateデータソースを使用して、異なるディレクトリに格納されたステートデータにアクセスすることです。これは、ステートファイルがS3バケットのようなリモートバックエンドに格納されている場合に特に便利です。
ハードコード
ハードコードとは、別のディレクトリからのOutput結果を直接別のディレクトリの変数に挿入する方法です。言い換えると、必要なデータを直接Terraformの設定ファイルにコピーして貼り付けることです。このアプローチでは、必要なデータの取得以外に追加のセットアップや設定は必要ありません。
次の例を考えてみます。
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"
tags = {
"Name" = "my-vpc-dir1"
}
}
output "vpc_id" {
value = aws_vpc.main.id
}
この例では、dir_a
のmain.tf
ファイルでVPCが作成され、そのIDが出力されています。このOutputを次のようにdir_b/main.tf
にハードコードできます。
variable "vpc_id" {
default = "vpc-abcdefgh" # Hardcoded VPC ID from Directory A
}
resource "aws_subnet" "main" {
vpc_id = var.vpc_id # Using the hardcoded VPC ID
cidr_block = "10.0.1.0/24"
tags = {
"Name" = "my-subnet-dir2"
}
}
ハードコードの利点は、そのシンプルさです。これは直感的で、必要なデータの取得以外に追加の設定や構成はほとんど必要ありません。一般的には、小規模から中規模のプロジェクトに対して効率的です。
ただし、ハードコードはスケーラビリティに欠けるため、大規模な開発には適していない場合があります。
リモートステート
Terraformでは、「ステート」とはインフラストラクチャリソースの記録です。デフォルトでは、Terraformはステートをterraform.tfstate
という名前のファイルにローカルに保存します。ただし、より大規模なプロジェクトやチームで作業する場合は、ステート情報をリモートバックエンドに格納することを推奨します。リモートバックエンドを使用すると、チームはステートファイルを共有の中央位置に格納し、バージョニング、ロック、その他の重要な機能を提供できます。
リモートステートは、S3バケットなどのリモートデータストアに格納されるtfstate
ファイルのことです。Terraformは、異なるディレクトリに格納されたステートデータにアクセスするためのterraform_remote_state
データソースを提供しており、大規模なプロジェクトやTerraformの設定を整理する場合に特に便利です。
terraform_remote_state
データソースを利用するには、Terraformの設定ファイルにdata
ブロックを定義し、バックエンドのタイプとその構成を指定する必要があります。
次の例を考えてみます。
data "terraform_remote_state" "vpc" {
backend = "s3"
config = {
bucket = "my-terraform-state"
key = "vpc/terraform.tfstate"
region = "us-west-2"
}
}
output "vpc_id" {
value = data.terraform_remote_state.vpc.outputs.vpc_id
}
この例では、S3バケットに格納されたリモートステートファイルにアクセスしています。バケット名はmy-terraform-state
であり、ステートファイルはvpc/terraform.tfstate
のキーの下に格納されています。output
ブロックは、そのリモートステートに格納されたvpc_id
を参照しています。
次の例を考えてみます。dir_a
とdir_b
という2つのディレクトリがそれぞれ独自のTerraformの設定を持っています。
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"
tags = {
"Name" = "my-vpc-dir1"
}
}
output "vpc_cidr" {
value = aws_vpc.main.cidr_block
}
dir_a
では、VPCが作成され、そのCIDRブロックが出力されています。次に、dir_b
でこのVPC内にサブネットを作成したいとします。
data "terraform_remote_state" "vpc" {
backend = "s3"
config = {
bucket = "my-app-terraform-state"
key = "dir_a/terraform.tfstate"
region = "ap-northeast-1"
}
}
resource "aws_subnet" "main" {
vpc_id = data.terraform_remote_state.vpc.outputs.vpc_id
cidr_block = "10.0.1.0/24"
tags = {
"Name" = "my-subnet-dir2"
}
}
dir_b
では、terraform_remote_state
データソースを使用してS3バケット内のdir_a
のステートファイルにアクセスしています。VPCのIDは、サブネットの作成に使用されます。
リモートステートの機能は非常に便利ですが、過度な使用や誤用は複雑さを引き起こす可能性があることに注意してください。また、リモートステートデータソースの変更は、構成を更新するためにterraform init
を再実行する必要があります。
参考