🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Terraform

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

1747閲覧

aws terraformのRDS作成

vito

総合スコア1

Terraform

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2021/02/25 06:01

前提・実現したいこと

初めての投稿です。
ソースコードも書いたこともない初心者で、
terraformを使ってawsを練習で構築しております。
今実現したいのは、下記のテンプレートを利用してRDSを作成したい。

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

in resource "aws_db_subnet_group" "main": subnet_ids = aws_subnet.private_db1.id}","aws_subnet.private_db2.id An argument definition must end with a newline.

該当のソースコード

resource "aws_db_subnet_group" "main" {
name = "tf_dbsubnet"
description = "It is a DB subnet group on tf_vpc."
subnet_ids = ["${aws_subnet.private_db1.id}", "${aws_subnet.private_db2.id}"]
tags {
Name = "tf_dbsubnet"
}
}

試したこと

subnet_ids = ["${aws_subnet.private_db1.id}", "${aws_subnet.private_db2.id}"]
このテンプレートに従って必要事項を記入しましたが、エラーが表示されます。
「因数の定義は改行で終わる必要があります」のような意味だと思いますが、
どのように記入すればよいのかご教示お願いします。
また、「subnet_ids」とは何を指しているのでしょうか。「ids」に該当するコードが見当たらないので、あわせてご教示お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

subnet_idsはサブネットグループで指定するサブネットのidをリストで渡すパラメータです。

ドキュメントをご参照ください。
Resource: aws_db_subnet_group
まあ、ドキュメントには型が全く書かれてないので読みづらいですけど。

ここではまず、RDSを作る際にサブネットグループが必要で、そこで定義するサブネットも一緒にTerraformで定義していることを前提に書かれていますね。
ここでは書かれていませんが、コードの外でResourceとしてaws_subnetが定義されていて、aws_subnetで定義したサブネットのidをそのまま使用しています。
Resource: aws_subnet
ドキュメントのAttributes Referenceを見ると、リソースを定義したときにアウトプットとして利用できるパラメータたちが書いてあります。
ここではその中のidを利用していますね。
Terraformではこのように定義したリソースどうしを連携させることができます。

一方、Terraformで定義していないものの既に存在する、というリソースを使いたいというときはData Sourcesを使って既存のリソースを検索して使用することができます。
サブネットを検索したい場合aws_subnetのほか、aws_subnet_idsというデータソースがありますね。
前者はサブネットの詳細情報がほしいときに使うようで、今回使うとしたら後者のほうでしょう。
Data Source: aws_subnet
Data Source: aws_subnet_ids

いきなりTerraformを書くのは辛いので、まず手動でRDSを立ち上げてどんなリソースが必要になるのかを見るといいと思います。
実際に構築したものを今度はTerraformで定義してみる、とするとやりやすいかなと。
マネジメントコンソールはコンソール側でうまいことやってくれている部分をTerraformでは自分で定義しなければいけないのでそこはちょっと苦労するところです。

そして、記載いただいたサンプルは書き方が古いです。
古い書き方でも動きますが、今ではドキュメントにあるように変数は

subnet_ids = [aws_subnet.frontend.id, aws_subnet.backend.id]

のような書き方ができます。

参考
Terraform 0.11→0.12で追加された新機能

Terraform 0.12以前ではリソースの設定に変数や他のリソースの値を指定する場合、ami = "${var.ami_id}"のように"${}"で囲う必要がありました。Terraform 0.12ではami = var.ami_idのように定義できます。

個人的にも結構苦労しながら覚えたところなので、書きながら慣れていけるといいですね。

投稿2021/02/25 09:37

yu_1985

総合スコア7588

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

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

vito

2021/02/26 04:35

ご親切なご回答と解説ありがとうございます。当方、数回ですがコンソールはコンソール側でシンプルな構成を構築した環境で試してましたが、Terraformですとかなり難しいので挫折しそうな状況です。他の記事も参考にしましたが、正直書き方が古いまでの判断もできませんでした。下記のURLを参考にしておりますが、{}での閉じ方とでも言うのでしょうか、もうこの辺から理解に苦労します。 https://tech.recruit-mp.co.jp/infrastructure/post-10665/ 参考ULR記載の「DB サーバの設定」の項目で、「vpc_security_group_ids 」と「db_subnet_group_name」の記入の方法が今でもエラーが表示されます。 記憶では、「改行してください」のような内容だったのですが、この場合も、["${aws_security_group.db.id}"]のままだとエラー表示されたので、"${aws_security_group.db.id}"で試してもエラー表示なので、この書き方も躓いている項目です。 お時間があるときに該当のURLでの書き方や注意事項をご教示いただけますと大変助かります。 長文失礼いたしました。 resource "aws_db_instance" "db" { identifier = "tf_dbinstance" allocated_storage = 5 engine = "mysql" engine_version = "5.6.27" instance_class = "db.t1.micro" storage_type = "gp2" username = "${var.aws_db_username}" password = "${var.aws_db_password}" backup_retention_period = 1 vpc_security_group_ids = ["${aws_security_group.db.id}"] db_subnet_group_name = "${aws_db_subnet_group.main.name}" }
vito

2021/02/26 04:44

当方のTerraform versionは「Terraform v0.14.6」です。
yu_1985

2021/02/26 05:27

aws_security_group.db aws_db_subnet_group.main をどこにも定義していなければ、参照するリソースがないのでエラーになります。
vito

2021/03/02 00:05

ご回答ありがとうございます。回答に記載されていうようにコンソールから慣れてからTerraformで構築という流れで勉強していこうと思います。また、当方はAWS入門書と基礎からのネットワーク&構築の教材を購入しましたが、AWSを勉強にするにあたりまして、実機を触る他に推奨する勉強方法やサイトなどご教示いただけますと幸いです。よろしくお願いいたします。
yu_1985

2021/03/02 06:28

ちょっと古いですが、一昔前ならクラウドデザインパターンをAWSが公開してくれていたのでそれを一つずつなぞってみるのも悪くなかったです。 今となっては古いのと、サイト自体アクセスできたりできなかったりなのが残念ですが。 同じく古いですがそのクラウドデザインパターンを元にした書籍も出ています。 入門書もいいですが、ちゃんと公式に出されているものも読むようにしましょう。 典型的な設計パターン等はドキュメントにそのまま書いてあることもよくあります。 中には古いままのドキュメントが混ざってたり、最近は機械翻訳で読みづらいドキュメントが増えたのもやや残念ではありますが。 https://docs.aws.amazon.com/ja_jp/ また、毎月やっているWebinar(Blackbelt)の資料が公開されています。 各サービスの概要はそれぞれの資料を読むことで押さえられます。より詳細にはサービスのドキュメントを読んでください。 https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/ ただ、一番はそれらを読みながら実際に自分で構築してみることでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問