[初心者必見] 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
読み込み中...
6 票, 平均: 1.00 / 16
1,701
X facebook はてなブックマーク pocket

この記事をかいた人

About the author

Ken

2022年に新卒でビヨンドに入社
現在システムソリューション部に所属
大学院までは言語学勉強して、インフラエンジニアに挑戦
社内でビヨンド喫茶部という部活を設立して、毎日コーヒー・紅茶いれることにも熱を入れている