2022.04.28  

【Terraform】モジュールを利用した際のoutputs.tfの作成

Terraform    

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が次のように定義されているとします。

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=リソース名.リソースに付けた名前.取得したいパラメータを設定します。

module/outputs.tf
output “vpc_id" {
  value = aws_vpc.vpc.id
}

下記はterraform applyを実行するディレクトリにあるnetwork.tfファイルです。
モジュール名がmodule "aws_vpc_test"だったとします。

network/network.tf
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と記述すれば値が取得できます。

network/outputs.tf
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で読み込む必要があります。

module/version.tf
# モジュール化したディレクトリにこの設定ファイルが必要
terraform {
  required_version = ">= 0.12"
}
network/config.tf
# ------------------------------
# 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"
}
database/config.tf
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.アウトプットデータ名で出力できます。

database/database.tf
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"
  }
}
コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信