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

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

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

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

5741閲覧

【Terraform】module構成でMissing required argumentが出る

suzunashi

総合スコア16

Terraform

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2021/10/08 18:16

編集2021/10/08 18:34

前提

フォルダ構成は下記の通りです。

フォルダ └modules  └vpc.tf  └variables.tf  └output.tf main.tf conf.tf

コードは下記の通りです。

vpc.tf

resource "aws_vpc" "sample_vpc" { cidr_block = var.vpc_cider instance_tenancy = "default" enable_dns_support = true enable_dns_hostnames=true enable_classiclink_dns_support=false tags={ Environment="stage" Name="${var.tag_name}-${var.tag_name_plus}" Service="vpc" System="test" } } resource "aws_subnet" "sample_sub" { vpc_id = var.vpc_variable availability_zone = var.az cidr_block = var.subnet_cider tags={ Environment="stage" Name="${var.tag_name}-${var.tag_name_plus}" Service="sbn" System="test" } }

variables.tf

variable "tag_name" { default = "test" } variable "tag_name_plus" { type = string } #-------------- #VPC #-------------- variable "vpc_cider" { type = string } #-------------- #Subnet #-------------- variable "az" { type=string } variable "subnet_cider" { type=string } variable "vpc_variable" { type=string }

output.tf

output "vpc_id" { value = aws_vpc.sample_vpc.id } output "subnet_id" { value = aws_subnet.sample_sub.id }

main.tf

1. #-------------- 2. #VPC 3. #-------------- 4. module "demo_vpc" { 5. source = "./modules/vpc" 6. vpc_cider = "192.168.0.0/16" 7. tag_name_plus = "demo-v" 8. } 9. output "demo_vpc_id" { 10. value = module.demo_vpc.vpc_id 11. } 12. 13. #-------------- 14. #Subnet 15. #-------------- 16. module "demo_subnet" { 17. source = "./modules/vpc" 18. vpc_variable = var.demo_vpc_id 19. az = "ap-northeast-1a" 20. subnet_cider = "192.168.1.0/24" 21. tag_name_plus = "demo-s" 22. } 23. output "demo_subnet_id" { 24. value = module.demo_subnet.subnet_id 25. }

conf.tf

terraform { required_version=">=0.13" required_providers { aws={ source="hashicorp/aws" version="~>3.0" } } } provider "aws" { region = "ap-northeast-1" }

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

Error: Missing required argument on main.tf line 16, in module "demo_subnet": 16: module "demo_subnet" { The argument "vpc_cider" is required, but no definition was found.

お願いしたいこと

「demo_dubnet」の元になっている「sample_sub」にはvpc_cidrを設定していないのにエラーが出てしまいます。
コードのミスや解決方法を教えてください。

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

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

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

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

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

guest

回答2

0

lang

1module "demo_subnet" { 2 source = "./modules/vpc"

sourceに"./modules/vpc"を指定しています。sample_subモジュールの誤りかと。

投稿2021/10/08 19:13

編集2021/10/08 19:16
jhashimoto

総合スコア838

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

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

suzunashi

2021/10/09 03:34 編集

私のmoduleに対しての理解がなかったのかもしれません。 modules/vpc/vpc.tf内で複数のresourseを設定していた場合、複数のresourceから1つを選んで使用するみたいな使い方はできないのでしょうか? 下記の様に変更したら出ていたエラーが消えました。 >main.tf ``` module "demo_network" { source = "./modules/vpc" vpc_cider = "192.168.0.0/16" tag_name_vpc = "demo-v" vpc_variable = "var.demo_vpc_id" az = "ap-northeast-1a" subnet_cider = "192.168.1.0/24" tag_name_sub = "demo-s" } ```
jhashimoto

2021/10/09 04:30 編集

vpc.tfのコード見てませんでした。sample_vpcとsample_subの両方が定義されているのですね。失礼しました。 一般的には、variables.tfに制御用のパラメータを定義し、それを元にリソースをつくる/つくらないを制御することはできます。 ただし、今回のケースは、sample_subがsample_vpcに依存しているので、sample_subだけをつくることはできません。sample_subだけをつくりたい背景を説明してもらえれば、何か回答ができるかもしれません。
suzunashi

2021/10/09 07:08 編集

返信ありがとうございます。 今回moduleを利用する背景として、他システムでも利用できるように汎用的に作成しようと思っております。 その際resourceを定義する側(今回はvpc .tf側)でどこまで定義するかを模索しております。 ですのでsample_subだけを作るのは目的ではありません。 仮に1つのVPCに2つにパブリックサブネット(az は別)+2つのプライベートサブネット(az は別)を作成する場合の定義方法にベストプラクティスなどはあるのでしょうか?
guest

0

ベストアンサー

仮に1つのVPCに2つにパブリックサブネット(az は別)+2つのプライベートサブネット(az は別)を作成する場合の定義方法にベストプラクティスなどはあるのでしょうか?

VPCに特化したベストプラクティスは見たことがありませんが、一般的なModule設計のベストプラクティスなら、書籍「実践Terraform AWSにおけるシステム設計とベストプラクティス」の「22章 モジュール設計」にコンパクトにまとまっています。

サブネット作成をパラメータで制御する一例です。属性は最低限しか設定していません。azなど必要なパラメータは追加してください。

ディレクトリ

├── modules │ └── vpc │ ├── main.tf │ └── variables.tf └── vpc_sample ├── main.tf

vpcモジュール。

variables.tf

lang

1variable "vpc_name" { 2 type = string 3} 4 5variable "vpc_cidr" { 6 type = string 7} 8 9variable "pub_subnet" { 10 type = list(object({ 11 name = string 12 cidr = string 13 })) 14}

main.tf

lang

1resource "aws_vpc" "this" { 2 cidr_block = var.vpc_cidr 3 tags = { Name = var.vpc_name } 4} 5 6// public subnet 7resource "aws_subnet" "pub" { 8 for_each = { for i in var.pub_subnet : i.name => i } 9 vpc_id = aws_vpc.this.id 10 cidr_block = each.value.cidr 11 tags = { Name = each.value.name } 12 13 // NOTE: インターネットゲートウェイへのルーティングを設定 14}

モジュールを利用する。

vpc_sample/main.tf

lang

1module "vpc" { 2 source = "../modules/vpc" 3 4 vpc_name = "vpc-sample" 5 vpc_cidr = "172.16.0.0/16" 6 7 // パブリックサブネットを2つ作成する。 8 pub_subnet = [ 9 { 10 name = "subnet-sample1" 11 cidr = "172.16.0.0/20" 12 }, 13 { 14 name = "subnet-sample2" 15 cidr = "172.16.16.0/20" 16 } 17 ] 18}

参考: Terraformのfor_eachにmapのlistを渡してループしたい - Qiita

投稿2021/10/09 13:23

編集2021/10/09 20:53
jhashimoto

総合スコア838

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問