質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Q&A

解決済

1回答

2449閲覧

【Terraform】validationでMissing required argumentが出る

YumiSakura

総合スコア101

Terraform

Terraformは、インフラ構築のためのツールです。AWS/DigitalOcean/GoogleCloudといった様々なインフラに対応。インフラ構成のコード管理や変更の作業などの手間を自動化し、インフラ構築の効率化を図ることができます。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

0グッド

0クリップ

投稿2022/06/11 05:13

実現したいこと

Terraform Planを通したい

前提

フォルダ構成は下記の通りです。
(stg,prodはdevと同じ構成)

git管理フォルダ └env | └dev | └main.tf | └variables.tf | └terraform.tfvars | └stg | └prod | └modules  └vpc └main.tf └variables.tf └output.tf └ec2 └main.tf └variables.tf └output.tf └aurora └main.tf └variables.tf

発生している問題・エラーメッセージ

│Error: Missing required argument │ on main.tf line 31, in module "aurora": │ 31: module "aurora" { │The argument "private_sub1" is required, but no definition was found. │Error: Missing required argument │ on main.tf line 31, in module "aurora": │ 31: module "aurora" { │The argument "private_sub2" is required, but no definition was found.

エラー対象のコード

ec2/outputs.tf
output "env" { value = var.env } output "vpc_id" { value = "aws_vpc.vpc.id" } output "private_sub1" { value = "aws_subnet.private1.id" } output "private_sub2" { value = "aws_subnet.private2.id" }
dev/main.tf
terraform { required_version = ">= 0.12" backend "s3" { bucket = "dev-terraform-module" key = "terraform.tfstate" region = "ap-northeast-1" } } provider "aws" { region = "ap-northeast-1" } # variables.tfの値を参照する # vpcモジュールを呼び出す module "vpc" { source = "../../module/vpc" env = var.env cidr = var.cidr } # ec2モジュールを呼び出す module "ec2" { source = "../../module/ec2" env = var.env vpc_id = aws_vpc.vpc.id } #auroraモジュールを呼び出す module "aurora" { source = "../../module/aurora" env = var.env vpc_id = aws_vpc.vpc.id }
aurora/variables.tf
riable "env" { type = string } variable "vpc_id" { type = string } variable "private_sub1" { type = string } variable "private_sub2" { type = string }
aurora/main.tf
# セキュリティグループ作成 resource "aws_security_group" "sg_aurora" { name = "sg_aurora" vpc_id = var.vpc_id tags = { Name = "${var.env}-sg_aurora" } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } #許可するセキュリティルール resource "aws_security_group_rule" "sb_rule_aurora" { type = "ingress" from_port = 3306 to_port = 3306 protocol = "tcp" #inしていいセキュリティグループID source_security_group_id = aws_security_group.sg_ec2.id #このセキュリティルールの関連付け対象であるセキュリティグループ security_group_id = aws_security_group.sg_aurora.id } # dbサブネットグループ作成 resource "aws_db_subnet_group" "db_group" { name = "tf_db_group" subnet_ids = [var.private_sub1, var.private_sub2] tags = { Name = "terraform module subnet group" } } # auroraリソース作成 resource "aws_rds_cluster" "aurora_terraform_module" { cluster_identifier = "aurora-cluster" engine = "aurora-mysql" engine_version = "5.7.mysql_aurora.2.10.2" database_name = "mydb" #username,passwordは変えています master_username = "・・・・" master_password = "・・・・" db_subnet_group_name = aws_db_subnet_group.db_group.name vpc_security_group_ids = aws_security_group.sg_aurora.id }

調べた、実践したこと

ec2/outputs.tfの値がdev/main.tfに渡され、auroraリソースを作成するためにmodule/auroraを参照
module/aurora/variables.tfで値を受け取り、aurora/main.tfを参照してリソースを作成する

といった流れを想定し、ec2/outputs.tfmodule/aurora/variables.tfの種類を揃えてgithubにpushしましたが、エラーになりました。

お願いしたいこと

ec2/outputs.tfmodule/aurora/variables.tfの種類を揃えましたが、エラーが出てしまいます。
コードのミスや解決方法を教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

auroraのmoduleでprivate_sub1のvariableが宣言されています。

aurora/variables.tf

variable "private_sub1" { type = string }

しかしながら、moduleブロックでprivate_sub1の値が渡されていません。

dev/main.tf

module "aurora" { source = "../../module/aurora" env = var.env vpc_id = aws_vpc.vpc.id }

そのため、The argument "private_sub1" is required, but no definition was found.のエラーが出力されています。

private_sub1の値をmoduleブロックの引数で渡す必要があります。当然ですがprivate_sub2についても同様です。

投稿2022/06/11 05:48

jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YumiSakura

2022/06/11 06:51

わかりやすい回答ありがとうございます。 module/aurora/variables.tfはec2/outputs.tfの値を参照するのではなく、おおもとのdev/main.tfにあるmoduleブロックのprivate_sub1を参照する ということでしょうか? vpc→ec2→auroraの順で作成するようdev/main.tfに記述しているので、順番に参照する、 今回であればec2の内容をauroraが参照すると認識しておりました。
jhashimoto

2022/06/11 07:16 編集

module/auroraの内部でaws_db_subnet_group.db_groupのsubnet_idsにprivate_sub1/private_sub2をセットしていますから、private_sub1/private_sub2には2つのサブネットIDを渡すmodule仕様と推測します。そのサブネットIDをどこからどうやって取得するかは全体の設計・実装次第なので、当方にはわかりません。
jhashimoto

2022/06/11 07:29

Terraformの仕様に関わることなら回答できますが、moduleの設計思想(例えば、各moduleの責務, I/O仕様)については設計者しかわからないので、こちらでは何とも申し上げられないです。
YumiSakura

2022/06/12 03:19

理解が浅いため、混乱させる質問をしてしまいすみません。 勘違いしておりました、module間の値の受け渡しを記述されたoutput順に参照すると思っていました。 認識の間違いを修正できて感謝です!
jhashimoto

2022/06/12 03:52

先に基礎を押さえた方が悩まずに済むかと思います。書籍なら「基礎から学ぶ Terraform」がコンパクトにまとまっていて、わかりやすかったです。ご参考まで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問