Traffine I/O

日本語

2023-03-16

異なるTerraformディレクトリからのOutputの使用方法

異なるTerraformディレクトリからのOutputの使用方法

異なるTerraformディレクトリからのOutputを使用するためには、2つの主な方法があります。

  • 別のディレクトリの適用結果をハードコードする
    もっとも簡単な方法は、別のディレクトリからのOutput結果を直接別のディレクトリの変数(var)にハードコードすることです。これにはOutput結果をコピーしてTerraformの設定ファイルに直接貼り付ける作業が含まれます。

  • リモートステートを使用する
    2番目の方法は、terraform_remote_stateデータソースを使用して、異なるディレクトリに格納されたステートデータにアクセスすることです。これは、ステートファイルがS3バケットのようなリモートバックエンドに格納されている場合に特に便利です。

ハードコード

ハードコードとは、別のディレクトリからのOutput結果を直接別のディレクトリの変数に挿入する方法です。言い換えると、必要なデータを直接Terraformの設定ファイルにコピーして貼り付けることです。このアプローチでは、必要なデータの取得以外に追加のセットアップや設定は必要ありません。

次の例を考えてみます。

dir_a/main.tf
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_amain.tfファイルでVPCが作成され、そのIDが出力されています。このOutputを以下のようにdir_b/main.tfにハードコードできます。

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_adir_bという2つのディレクトリがそれぞれ独自のTerraformの設定を持っています。

dir_a/main.tf
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内にサブネットを作成したいとします。

dir_b/main.tf
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を再実行する必要があります。

参考

https://developer.hashicorp.com/terraform/language/state/remote-state-data
https://book.st-hakky.com/docs/terraform-over-multiple-directories/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!