この記事で達成できること
- Terraform Registryを効率的に検索・活用できるようになります
- EC2インスタンスの作成を例に、実践的なTerraform開発手法を習得できます
想定読者
- 以下のような本でTerraformの構文を学んだことのある人
- Terraformの構文は学んだが、AWSリソースを記そうとしたときに何を元に書けば良いかわからない人
注意事項
- 今回はあくまでTerraform Registryと仲良くなるための方法を記すものなので、作成するリソースはシンプルにEC2インスタンスとします
- VPC/subnetなどのリソースは事前に作成済みを前提としています
- stateファイルはローカルに保持する前提で記載をしていますが、本番環境ではS3などのクラウドストレージに配置することが望ましいです
実行環境
- MacOS Sequoia 15.0.1
- Terraform 1.8.2
- AWS接続に必要なIAMロールまたは認証情報が設定済み
- AWS CLI a2.15.42
Terraform Registryの効率的な使い方
※一気に4スタートでもOK
-
ということでAWSのProviderページに到着します
- このページに直接遷移してもOK
- AWS Provider
-
terraform { required_providers { aws = { source = "hashicorp/aws" version = "5.73.0" } } } provider "aws" { # Configuration options }
-
今回作成したいリソース名で検索する
-
Resourceの中から作成したいリソース名をクリックする
-
aws_instanceセクションを作成する
terraform { required_providers { aws = { source = "hashicorp/aws" version = "5.73.0" } } } provider "aws" { # Configuration options } resource "aws_instance" "web" { }
- "aws_instance"
- AWSリソースの種類
- "web"
- Terraformコード内で"aws_instance"を一意に示す
- "aws_instance"
-
Example Usageの中から、上の項目に合致する項目を取得する
terraform { required_providers { aws = { source = "hashicorp/aws" version = "5.73.0" } } } provider "aws" { # Configuration options } resource "aws_instance" "web" { ami = data.aws_ami.ubuntu.id instance_type = "t3.micro" tags = { Name = "HelloWorld" } }
-
Argument Referenceの中で"(Required)"と記載があるものをpickし、Example Usageの中で必要な項目を確認する
- EC2の場合はRequiredがないため、極論、項番9の内容を指定するだけでEC2インスタンスが作成できる
- RequiredはEBSの以下を参照
-
Example Usageでは不足している、追加で指定したい項目をArgument Referenceの中からpickする
- EC2の中でよく使われるだろう、、と思われるのは以下
-
ami
- 例として、AmazonLinux2023を直指定する場合は"ami-03f584e50b2d32776"
-
instance_type
- 例として、"t3.micro"
-
subnet_id
- 例として、"subnet-xxxxxxxxxxxxxxxxx"
- 正しいsubnet IDはGUIやdataセクションを用いて指定すること
-
ami
- 上記を組み込むと以下にようになる
terraform { required_providers { aws = { source = "hashicorp/aws" version = "5.73.0" } } } provider "aws" { # Configuration options } resource "aws_instance" "web" { # 東京リージョンのAmazon Linux 2023 ami = "ami-03f584e50b2d32776" instance_type = "t3.micro" subnet_id = "subnet-xxxxxxxxxxxxxxxxx" tags = { Name = "HelloWorld" } }
- EC2の中でよく使われるだろう、、と思われるのは以下
-
ここまで書ければ、あとはTerraformコマンドを実行すればOK
% terraform init # 初期化とプロバイダーのインストール % terraform fmt # コードのフォーマット % terraform plan # 実行計画の確認 % terraform apply # リソースの作成
まとめ
- 以上が、実際にTerraformでリソースを記載する際に、0からコードを記載する例です
- 実際には1リソースだけをわざわざ作成するコードを書く、、ということはほぼなく、dataセクションで既存のリソースを参照したり、複数リソースを組み合わせることが多いです
- 今回の内容を元に、重厚なコードを記載できるようになる方が増えると嬉しいです