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のクラスターを定義
resource "aws_ecs_cluster" "cluster" {
name = "hoge-cluster"
}
② ECSのクラスター名をCodeDeployで共有するために、outputでクラスター名を共有
output "cluster_name" {
value = aws_ecs_cluster.cluster.name
}
③ main.tfでモジュールを定義
module "ecs" {
source = "./modules/ecs"
}
module "codedeploy" {
source = "./modules/codedeploy"
# ここでoutputで定義した変数をcodedeployモジュールに渡す
cluster_name = module.ecs.cluster_name
}
④ codedeploy側でvariableブロックを使用して、変数cluster_name
を受け取るように設定する。
variable "cluster_name" {
type = string
}
⑤ ECSのクラスター名をcode deployモジュールで参照する
resource "aws_codedeploy_app" "app" {
compute_platform = "ECS"
name = "${var.cluster_name}-app"
}
これでECSとcodedeploy間で変数が共有できるようになり、問題なくplan/applyの実施・ECS/Code Deployの新規作成が同時に行えるようになります。
参考