LoginSignup
9
2

More than 1 year has passed since last update.

【Terraform】outputを使ってModule間で変数を共有する

Last updated at Posted at 2022-12-02

Qiita Advent Callendar企画 新卒エンジニアによる全部俺カレンダー2022 3日目投稿記事です。

概要

TerraformでAWSリソースを新規作成する際、module間で変数を共有したい時がある。
しかし、terraform plan 実行時、moduleから他のmoduleの値を参照すると...

module.xxx is a object, known only after apply

といったエラーが発生し、参照できない。

そこでoutputブロックを活用してmodule間で変数を共有できるようにする。

outputを使ってみる

今回は例として、「ECSとCodeDeploy間で変数を共有する」という形でoutputを活用してみます。

ディレクトリ構成は以下の通り。

.
├── modules
│   ├── ecs
│   │   ├── outputs.tf
│   │   ├── variables.tf
│   │   └── main.tf
│   └── codedeploy
│       ├── outputs.tf
│       ├── variables.tf
│       └── main.tf
└── main.tf

① ECSのクラスターを定義

modules/ecs/main.tf
resource "aws_ecs_cluster" "cluster" {
  name = "hoge-cluster"
}

② ECSのクラスター名をCodeDeployで共有するために、outputでクラスター名を共有

modules/ecs/outputs.tf
output "cluster_name" {
    value = aws_ecs_cluster.cluster.name
}

③ main.tfでモジュールを定義

main.tf
module "ecs" {
    source = "./modules/ecs"
}

module "codedeploy" {
    source = "./modules/codedeploy"
    # ここでoutputで定義した変数をcodedeployモジュールに渡す
    cluster_name = module.ecs.cluster_name
}

④ codedeploy側でvariableブロックを使用して、変数cluster_nameを受け取るように設定する。

modules/codedeploy/variables.tf
variable "cluster_name" {
  type = string
} 

⑤ ECSのクラスター名をcode deployモジュールで参照する

modules/codedeploy/main.tf
resource "aws_codedeploy_app" "app" {
  compute_platform = "ECS"
  name             = "${var.cluster_name}-app"
}

これでECSとcodedeploy間で変数が共有できるようになり、問題なくplan/applyの実施・ECS/Code Deployの新規作成が同時に行えるようになります。

参考

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2