【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

[初心者必見] 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ファイルを作成することも可能だと思いますので、そちらの形式で作りたいなと思った方は是非してみてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# プロバイダの設定
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,470
X facebook はてなブックマーク pocket
【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

Ken

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