Terraformでモジュールを使用した構成で、output上手く出力できず、迷ったのでメモ書きします。
次のディレクトリ構成で、networkディレクトリからterraform apply
を実行し、module/vpc.tf
で定義しているaws_vpc
のidを取得したいとします。
├module
| ├── vpc.tf
| ├── version.tf
| ├── variables.tf
| └──outputs.tf
└network
├── network.tf
├── config.tf
└──outputs.tf
結論
module/vpc.tfが次のように定義されているとします。
resource "aws_vpc" "vpc" {
cidr_block = var.cidr_block_value
instance_tenancy = "default"
enable_dns_support = true
enable_dns_hostnames = true
assign_generated_ipv6_cidr_block = false
tags = {
Name = "vpc1”
}
}
次に、module/outputs.tfでvalue=リソース名.リソースに付けた名前.取得したいパラメータ
を設定します。
output “vpc_id" {
value = aws_vpc.vpc.id
}
下記はterraform apply
を実行するディレクトリにあるnetwork.tfファイルです。
モジュール名がmodule "aws_vpc_test"
だったとします。
module "aws_vpc_test {
source = "../module/vpc"
cidr_block_value = "192.168.0.0/16"
tags = {
Name = vpc_id
}
}
この時moduleディレクトで定義したアウツプットの値を取得したい時は、module.<呼び出し元module名>.<module/output.tfで設定した変数>
を設定します。
今回の例では、下記のようにmodule.aws_vpc_test.vpc_id
と記述すれば値が取得できます。
output "vpc_id" {
value = module.aws_vpc_test.vpc_id
}
※ aws_vpc_test
は以降のコードで定義
outputの結果を利用してterraform applyする
余談ですがdata "terraform_remote_state"
を利用すると先で出力したoutputの結果を他のterraform apply
でも使用することができます。
この例では、network
ディレクトリのoutputの結果をdatabase
に渡します。
├module
| ├── vpc.tf
| ├── version.tf
| ├── variables.tf
| └──outputs.tf
├network
| ├── network.tf
| ├── config.tf
| └──outputs.tf
└database
├── database.tf
├── config.tf
└──outputs.tf
使用するには事前にS3にoutputの結果が出力されているterraform.tfstate
を保存しておき、config.tf
で読み込む必要があります。
# モジュール化したディレクトリにこの設定ファイルが必要
terraform {
required_version = ">= 0.12"
}
# ------------------------------
# Terraform configuration
# ------------------------------
terraform {
required_version = ">=0.13"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">3.0"
}
}
# ------------------------------
# tfstate
# ------------------------------
# S3にterraform.tfstateを保存する設定
backend "s3" {
# backetは事前に作成しておく必要がある
bucket = "tfstate-lab"
key = "aws/network/terraform.tfstate"
region = "ap-northeast-1"
}
}
# ------------------------------
# provider
# ------------------------------
provider "aws" {
profile = "lab"
region = "ap-northeast-1"
}
terraform {
required_version = "~> 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
# S3にterraform.tfstateを保存する設定
backend "s3" {
# backetは事前に作成しておく必要がある
bucket = "tfstate-lab"
key = "aws/database/terraform.tfstate"
region = "ap-northeast-1"
}
}
provider "aws" {
region = var.region
}
# outputで出力した結果を受け取る(S3に保存したtfstateファイルから取得する)
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "tfstate-lab"
key = "aws/network/terraform.tfstate"
region = "ap-northeast-1"
}
}
上記で読み込んだ情報はdata.terraform_remote_state.リモートステートに指定した名前.outputs.アウトプットデータ名
で出力できます。
resource "aws_db_subnet_group" "mysql_subnet_group" {
name = "mysql-subnet-standalone"
tags = {
Name = "${var.project}-${var.enviroment}-mysql-option-standalone"
# 出力箇所
VPC = "data.terraform_remote_state.network.outputs.vpc_id"
}
}