#VPC/サブネットとEC2を同時にapplyする方法#
こんにちは、Deliaです。
今回はTerraformで詰まった体験談です。
しらべてもサクッと解決できなかったので残します。。。
moduleは自分で作成したものを使用しています。
##0.前提##
$ t -v
Terraform v0.15.0
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v3.37.0
##1.手順##
###1. サブネットを作成するモジュールにoutputを定義###
受け取りたい値を「outoutブロック」で定義します。
ファイルは適宜分けても大丈夫です。
この例では「variableブロック」は分けています。
private_subnetsがユーザ定義ということに注意してください。
/module/VPC/main.tf
resource "aws_vpc" "main" {
cidr_block = var.main_vpc_cidr
instance_tenancy = "default"
}
resource "aws_subnet" "private_subnets" {
vpc_id = aws_vpc.main.id
cidr_block = var.private_subnets_cidr
}
# outputを定義するとモジュール呼び出し元で使える
output "subnets_id" {
value = "${aws_subnet.private_subnets.id}"
}
###2. ルート側で使用する###
アウトプットされた値を、さらにEC2作成用のモジュールに渡します。
/main.tf
module "VPC" {
source = "./module/VPC"
main_vpc_cidr = var.main_vpc_cidr
private_subnets_cidr = var.private_subnets_cidr
}
# private_subnets内にEC2インスタンスを作成したい為、IDを渡す
module "EC2" {
source = "./module/EC2"
subnet_ids = "${module.VPC.subnets_id}" # ここ
}
###3. モジュール側で使用する###
受け取って使用する。
/module/EC2/main.tf
resource "aws_instance" "AppServer01" {
ami = data.aws_ami.amazon_linux_2.id
instance_type = "t2.micro"
subnet_id = var.subnet_ids # ここ
tags = {
Name = "AppServer01"
}
}
/module/EC2/variables.tf
variable "subnet_ids" {
# default = ""
}
以上でできました。
#2.最後に#
3時間ほど調べまくってもできなくて、「もう明日にしよう、でも最後にコードをみておこう」
とした際に、スペルミスに気づきました。
フロー自体は簡単だと思いますので、参考にしていただければ幸いです。
にしても、順番に書かなくてもよしなにやってくれるの助かりますね(笑)