[初心者必見] ChatGPTにTerraformのコードを書いてもらった

5年ぶりくらいに風邪を引いてしまって、かなり応えているケンです。
AWSのサービスを使って、やや1年が経ちました。
コンソール上でEC2インスタンスなどを立ち上げて設定していくのもいいとは思ったのですが、インフラの実装もコード上で行っていくことが徐々に一般的になりつつあるように思います。そんな流れに則って私自身も、TerraformでAWSのリソースを立ち上げてみようと思いました。けれども、何事も最初は時間がかかりますよね。
なので、今回はChatGPTと一緒にTerraformのコードを作成して、手直しする形にしました。
環境情報
WSL2
windows 11
Terraform v1.2.5
今回構築したAWSの構成
試してみたPromptワード
今回試してみた、promptの入力は至ってシンプルです。
以下のようにAWSで構築をしたいと思っています。
VPC 1
Route table 1
Public subnet 2
Private subnet 2
EC2 1
ALB 1
RDS 1
こんな感じのpromptを入れてみるとChatGPTがぐわーーーって色々書いてくれます。
このままではTarget Groupが足りなかったり、RDSサブネットグループが足りなかったりするので、追加で足りない箇所を作ってもらったりします。
基本会話を続けたいときは、
上記のコードに、Target Groupを追加してください
のように、「上記の」とかというキーワードを付けると、名称とかを引き継いでくれるみたいです。
引き継いでくれないときは、コードをべた張りしたら嫌でもその名称で書いてくれます。あと、気になるときは、google検索などを使いながらこんな感じであっているかなとか調べたりします。
ChatGPTに手伝ってもらいながら書いたtfファイル
今回は分かりやすいようにするために、ファイルは一つにまとめて、なるべく変数なども使わないように作成しております。ChatGPTを使って変数などを使ってtfファイルを作成することも可能だと思いますので、そちらの形式で作りたいなと思った方は是非してみてください。
# プロバイダの設定
provider "aws" {
region = "ap-northeast-1"
}
# VPCの作成
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
# インターネットゲートウェイの作成
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.main.id
}
# パブリックサブネット1の作成
resource "aws_subnet" "public_subnet1" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
map_public_ip_on_launch = true
}
# パブリックサブネット2の作成
resource "aws_subnet" "public_subnet2" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.2.0/24"
availability_zone = "ap-northeast-1c"
map_public_ip_on_launch = true
}
# プライベートサブネット1の作成
resource "aws_subnet" "private_subnet1" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.3.0/24"
availability_zone = "ap-northeast-1a"
}
# プライベートサブネット2の作成
resource "aws_subnet" "private_subnet2" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.4.0/24"
availability_zone = "ap-northeast-1c"
}
# ルートテーブルの作成
resource "aws_route_table" "public_route_table" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
}
# パブリックサブネットにルートテーブルを関連付ける
resource "aws_route_table_association" "public_subnet1_association" {
subnet_id = aws_subnet.public_subnet1.id
route_table_id = aws_route_table.public_route_table.id
}
resource "aws_route_table_association" "public_subnet2_association" {
subnet_id = aws_subnet.public_subnet2.id
route_table_id = aws_route_table.public_route_table.id
}
# ALBの作成
resource "aws_lb" "alb" {
name = "test-alb"
subnets = [aws_subnet.public_subnet1.id, aws_subnet.public_subnet2.id]
internal = false
load_balancer_type = "application"
}
# EC2の作成
resource "aws_instance" "ec2" {
ami = "ami-03dceaabddff8067e"
instance_type = "t2.micro"
subnet_id = aws_subnet.public_subnet1.id
key_name = "hogehoge"
}
# ターゲットグループの作成
resource "aws_lb_target_group" "target_group" {
name = "my-target-group"
port = 80
protocol = "HTTP"
vpc_id = aws_vpc.main.id
target_type = "instance"
}
# ALBとターゲットグループの関連付け
resource "aws_lb_listener" "listener" {
load_balancer_arn = aws_lb.alb.arn
port = 80
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.target_group.arn
}
}
# ターゲットグループへのインスタンス登録
resource "aws_lb_target_group_attachment" "target_group_attachment" {
target_group_arn = aws_lb_target_group.target_group.arn
target_id = aws_instance.ec2.id
port = 80
}
# RDSの作成
resource "aws_db_instance" "rds" {
engine = "mysql"
instance_class = "db.t2.micro"
allocated_storage = 10
engine_version = "5.7"
identifier = "my-rds-instance"
username = "admin"
password = "hogehoge"
skip_final_snapshot = true
publicly_accessible = false
vpc_security_group_ids = [aws_security_group.rds_security_group.id]
db_subnet_group_name = aws_db_subnet_group.db_subnet_group.name
}
# RDSへのアクセスを許可するセキュリティグループの作成
resource "aws_security_group" "rds_security_group" {
vpc_id = aws_vpc.main.id
ingress {
from_port = 3306
to_port = 3306
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
# DBサブネットグループの作成
resource "aws_db_subnet_group" "db_subnet_group" {
name = "my-db-subnet-group"
description = "My DB Subnet Group"
subnet_ids = [aws_subnet.private_subnet1.id, aws_subnet.private_subnet2.id]
}
まとめ
初心者は、どのコードが正しいのかがわからないというデメリットはありますが、とりあえず数を経験してみて、こっちのほうが書きやすいなとか、見やすいなというのを徐々に理解していくやり方もありではないかなと思った今日この頃です。
また、ChatGPTで生成されたコードというのは完璧ではないので、今回であれば、terraform applyをした時にエラーが出ると思います。そうなってくると自分の手で修正する必要が必ず出てきます。
けれども、ここでめんどくさいとか思わずに、どこが間違っているのかを調査していくうちに「なるほど、こういう意味でエラーがでているの!!じゃあ、この書き方ダメだな。」とか段々とわかってくるのじゃないかなと思います。
なので、エラーが出ても諦めずに何度もトライして、リッチなエンジニアライフを満喫しましょ~~。
6