[初心者必見] 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をした時にエラーが出ると思います。そうなってくると自分の手で修正する必要が必ず出てきます。
けれども、ここでめんどくさいとか思わずに、どこが間違っているのかを調査していくうちに「なるほど、こういう意味でエラーがでているの!!じゃあ、この書き方ダメだな。」とか段々とわかってくるのじゃないかなと思います。
なので、エラーが出ても諦めずに何度もトライして、リッチなエンジニアライフを満喫しましょ~~。