Я изо всех сил пытаюсь понять, как данные передаются в модули и из модулей в Terraform (v0.12.12). У меня есть простой пример, но я не могу понять, как данные должны передаваться между модулями. И большинство примеров, которые я могу найти, являются неполными или устаревшими.
Я создал простой пример с двумя модулями. Сетевой модуль, который создает vpc и подсеть, и вычислительный модуль, который создает экземпляр EC2. Я просто пытаюсь предоставить вычислительному модулю идентификатор подсети, в которой должен находиться экземпляр EC2. Но я не понимаю:
- как мне получить subnet_id из сетевого модуля, который создает подсеть для других модулей, которые могут ее использовать?
- Как заставить вычислительный модуль использовать subnet_id?
Базовая структура выглядит следующим образом
.
├── main.tf
└── modules
├── compute
│ └── main.tf
└── network
├── main.tf
└── output.tf
# main.tf
provider "aws" {
region = "eu-west-1"
}
module "m_network" {
source = "./modules/network"
}
# The problem is how to make that subnet id available to the compute module
# so the ec2 instance can be added to it?
module "m_compute" {
source = "./modules/compute"
# I wondered if the m_compute module should pass in a parameter, but
# Any attempt to pass a parameter gives an error: An argument "subnet_id" is not expected here.
#xxx = "xxx" # This fails to.
# subnet_id = module.m_network.subnet_id
}
resource "aws_vpc" "myvpc" {
cidr_block = "10.0.0.0/16"
}
# Create subnets in each availability zone to launch our instances into, each with address blocks within the VPC:
resource "aws_subnet" "myvpc_subnet" {
vpc_id = "${aws_vpc.myvpc.id}"
cidr_block = "10.0.1.0/24"
}
# Generates subnet attributes that can be passed to other modules
output "myvpc_subnet_id" {
description = "Subnet ID"
value = "${aws_subnet.myvpc_subnet.id}"
}
resource "aws_instance" "app" {
ami = "ami-13be557e"
instance_type = "t2.micro"
subnet_id = aws_subnet.myvpc_subnet_id # What should go here?
}