terraformにて、module間で値(variable,outputs)を渡す

0.12のフォーマット

値の受け渡し

terraformにて、variableを使って変数を表現するが、
moduleをまたいでの受け渡しをどうするか

フォルダ構成の例

├── main.tf
├── modules
│   ├── ec2
│   │   ├── ec2.tf
│   │   └── variables.tf
│   └── network
│       ├── network.tf
│       ├── outputs.tf
│       └── variables.tf

こんな風になっているとして
networkディレクトリとec2ディレクトリでデータを渡したいということ
vpcで作ったvpcのidをec2に渡したいというのが目的

渡し方

modules/network/network.tfにてvpcを定義

# aws_vpc
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true
}

modules/network/outputs.tfにてoutputsを定義(ファイルは分ける必要はないけど、ベストプラクティスとしてよくファイルは別に書かれている)

output "vpc_main" {
  value = aws_vpc.main
}

このようにvpcのresourceを返すことができる


これを、main.tfで受け渡す

module "network" {
  source = "./modules/network"
}

module "ec2" {
  source = "./modules/ec2"

  vpc_main       = module.network.vpc_main
}

vpc_main = module.network.vpc_mainこれがキモで、module.<module名>.<output名>で取得可能


そしてこれをec2モジュールで受ける
modules/ec2/variables.tf

# vpc information.
variable "vpc_main" {}

modules/ec2/ec2.tf

# aws_instance
resource "aws_instance" "app" {
  ami                    = "ami id"
  instance_type          = "t2.micro"
  subnet_id              = var.subnet_for_ec2.id
}

これで値が渡せる