Open10
terraform_remote_stateを使った複数モジュール間の参照について整理
概要
別々のstateファイルに格納されているTerraformリソースを参照する時に使うterraform_remote_state
の使い方について整理する。
ディレクトリ構成
% tree
.
├── README.md
├── child-modules
│ ├── app
│ │ ├── README.md
│ │ ├── main.tf
│ │ ├── output.tf
│ │ └── variable.tf
│ ├── db
│ │ └── main.tf
│ ├── network
│ │ ├── README.md
│ │ ├── main.tf
│ │ ├── output.tf
│ │ └── variables.tf
│ └── presentation
│ ├── README.md
│ ├── main.tf
│ ├── output.tf
│ ├── remote_state.tf
│ └── variables.tf
└── root-modules
├── prod
│ ├── app
│ │ ├── main.tf
│ │ ├── output.tf
│ │ └── provider.tf
│ ├── db
│ │ ├── main.tf
│ │ └── provider.tf
│ ├── network
│ │ ├── main.tf
│ │ ├── output.tf
│ │ └── provider.tf
│ └── presentation
│ ├── main.tf
│ ├── output.tf
│ └── provider.tf
└── stg
ネットワークモジュール
子モジュールのVPCリソース
main.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = var.NW-name
cidr = var.cidr
#サブネット設定
azs = var.azs
public_subnets = var.public_subnets
private_subnets = var.private_subnets
database_subnets = var.database_subnets
#NAT-GW作成可否
enable_nat_gateway = var.enable_nat_gateway
single_nat_gateway = var.single_nat_gateway
}
output.tf
output "VPC_info" {
value = module.vpc
}
variables.tf
variable "NW-name" {
type = string
description = "VPC resource name"
}
variable "cidr" {
type = string
default = "10.0.0.0/16"
description = "VPC CIDR"
}
variable "azs" {
type = list(string)
default = ["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"]
description = "Available Zones"
}
variable "public_subnets" {
type = list(string)
default = null
description = "Public Subnets"
}
variable "private_subnets" {
type = list(string)
default = null
description = "Private Subnets"
}
variable "database_subnets" {
type = list(string)
default = null
description = "Database Subnets"
}
variable "enable_nat_gateway" {
type = bool
default = false
description = "NAT-GW作成"
}
variable "single_nat_gateway" {
type = bool
default = false
description = "VPC内にNAT-GWを一つだけ作成する"
}
親モジュールのVPCリソース
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
module "prod-network" {
source = "../../../child-modules/network"
NW-name = "Prod-VPC"
cidr = "10.0.0.0/16"
public_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
private_subnets = ["10.0.11.0/24", "10.0.12.0/24", "10.0.13.0/24"]
database_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = false
single_nat_gateway = false
}
output.tf
output "VPC_id" {
value = module.prod-network.VPC_info.vpc_id
}
output "VPC_DBsubnets" {
value = module.prod-network.VPC_info.database_subnets
}
output "VPC_PublicSubnets" {
value = module.prod-network.VPC_info.public_subnets
}
output "VPC_PrivateSubnets" {
value = module.prod-network.VPC_info.private_subnets
}
モジュールの入れ子構造になっているのでややわかりにくいが、子モジュールの中でTerraform Registryで公開されているVPCモジュール[1]を呼び出して、VPCモジュール全体の出力情報を子モジュールのVPC_info
アウトプットに出力させている。
子モジュールのアウトプット情報をterraform apply
やCIパイプライン上に出力させるために親モジュールのアウトプットブロックで呼び出している。
出力されるアウトプット情報
- VPC_id
- VPC_DBsubnets
- VPC_PublicSubnets
- VPC_PrivateSubnets
presentation
ディレクトリに存在するALBモジュール情報に渡したい場合
このVPC情報を子モジュール側のpresentation
ディレクトリでterraform_remote_state
情報を記載する。
remote_state.tf
data "terraform_remote_state" "remote_network_stack_state" {
backend = "s3"
config = {
bucket = "terraform-state-XXXXXXXXXXXX"
key = "production/network/terraform.tfstate"
region = "ap-northeast-1"
}
}
子モジュールのALBリソース
main.tf
module "alb" {
source = "terraform-aws-modules/alb/aws"
version = "~> 8.0"
name = var.ALB-name
load_balancer_type = "application"
#terraform_remote_stateでNWリソースのstateファイル情報を参照している
vpc_id = data.terraform_remote_state.remote_network_stack_state.outputs.VPC_id
subnets = data.terraform_remote_state.remote_network_stack_state.outputs.VPC_PublicSubnets
security_group_rules = {
ingress_all_http = {
type = "ingress"
from_port = 80
to_port = 80
protocol = "tcp"
description = "HTTP web traffic"
cidr_blocks = ["0.0.0.0/0"]
}
ingress_all_https = {
type = "ingress"
from_port = 443
to_port = 443
protocol = "tcp"
description = "HTTPS web traffic"
cidr_blocks = ["0.0.0.0/0"]
}
egress_all = {
type = "egress"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
}
親モジュールのALBリソース
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
module "prod-presentation" {
source = "../../../child-modules/presentation"
ALB-name = "Prod-Web-ALB"
}
ALBを指定するVPC IDと配置するサブネットの場所を親モジュールのVPCディレクトリ内で生成したoutput.tf
から出力された内容をretemo_state.tf
で参照するように呼び出している。