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 applyやCIパイプライン上に出力させるために親モジュールのアウトプットブロックで呼び出している。

出力されるアウトプット情報

  • VPC_id
  • VPC_DBsubnets
  • VPC_PublicSubnets
  • VPC_PrivateSubnets

ユータユータ

このVPC情報をpresentationディレクトリに存在するALBモジュール情報に渡したい場合

子モジュール側の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で参照するように呼び出している。