【新手必看】ChatGPT 编写了 Terraform 代码

我是肯,我大概五年来第一次感冒了,所以感觉非常难受。
我开始使用AWS服务已经一年多了。
我原以为在控制台上启动和配置 EC2 实例会很方便,但现在看来,用代码实现基础设施似乎越来越普遍了。顺应这一趋势,我决定尝试用 Terraform 启动 AWS 资源。不过,万事开头难。
所以这次,我与 ChatGPT 一起创建了 Terraform 代码,然后对其进行了修改。
环境信息
WSL2
Windows 11
Terraform v1.2.5
本次构建的 AWS 配置
我尝试过的提示词
我这次尝试的提示输入非常简单。
我想在 AWS 上构建以下系统:
VPC 1
路线表 1
公共子网 2
私有子网 2
EC2 1
ALB 1
RDS 1
如果你输入这样的提示,ChatGPT 会为你输出很多信息。
目前目标组或 RDS 子网组数量不足,因此我们将要求您创建缺失的区域。
如果你想继续进行基本的对话,
在上面的代码中添加目标组。
似乎如果你添加像“above”这样的关键字,它就会继承名称等等。
如果他们不接手,我就直接粘贴代码,不管我愿不愿意,他们都会用那个名字写出来。另外,如果我不确定,我会用谷歌搜索确认一下是否正确。
借助 ChatGPT 编写的 tf 文件
为了便于理解,我已将这些文件合并成一个,并尽可能避免使用变量。我认为也可以使用 ChatGPT 创建带有变量的 tf 文件,如果您想创建这种格式的文件,请尝试一下。
# 配置提供商 provider "aws" { region = "ap-northeast-1" } # 创建 VPC 资源 "aws_vpc" "main" { cidr_block = "10.0.0.0/16" } # 创建 Internet 网关资源 "aws_internet_gateway" "gw" { vpc_id = aws_vpc.main.id } # 创建公有子网 1 资源 "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 资源 "aws_subnet" "public_subnet2" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" availability_zone = "ap-northeast-1a" map_public_ip_on_launch = true } "ap-northeast-1c" map_public_ip_on_launch = true } # 创建私有子网 1 资源 "aws_subnet" "private_subnet1" { vpc_id = aws_vpc.main.id cidr_block = "10.0.3.0/24" availability_zone = "ap-northeast-1a" } # 创建私有子网 2 资源 "aws_subnet" "private_subnet2" { vpc_id = aws_vpc.main.id cidr_block = "10.0.4.0/24" availability_zone = "ap-northeast-1c" } # 创建路由表资源 "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 } } # 将路由表与公共子网资源关联 "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 资源 "aws_lb" "alb" { name = "test-alb" subnets = [aws_subnet.public_subnet1.id, aws_subnet.public_subnet2.id] internal = false load_balancer_type = "application" } # 创建一个EC2 实例资源“aws_instance”“ec2”{ ami =“ami-03dceaabddff8067e” instance_type =“t2.micro” subnet_id = aws_subnet.public_subnet1.id key_name =“hogehoge” } # 创建目标组资源“aws_lb_target_group”“target_group”{ name =“my-target-group” port = 80 protocol =“HTTP” vpc_id = aws_vpc.main.id target_type =“instance” } # 将 ALB 与目标组资源关联“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 } } # 将实例注册到目标组资源"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 资源 "aws_db_instance" "rds" { engine = "mysql" instance_class = "db.t2.micro" allocate_storage = 10 engine_version = "5.7" identifier = "my-rds-instance" username = "admin" password = "hogehoge" skip_final_snapshot = true public_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 资源的安全组 "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"] } } # 创建数据库子网组资源 "aws_db_subnet_group" "db_subnet_group" { name = "my-db-subnet-group" description = "我的数据库子网组" subnet_ids = [aws_subnet.private_subnet1.id, aws_subnet.private_subnet2.id] }
概括
虽然对于初学者来说,一个缺点是他们不知道哪个代码是正确的,但我最近开始觉得,尝试几种代码并逐渐了解哪种代码更容易编写或哪种代码更容易阅读可能是一个好主意。
此外,ChatGPT 生成的代码并不完美,因此在这种情况下,运行 `terraform apply` 时可能会出现错误。如果发生这种情况,您肯定需要自行修复。
但是,不要觉得麻烦,我认为当你调查出问题所在时,你会逐渐明白,“啊,原来错误的原因在这里!原来这种写法是错的。”
所以,即使遇到错误,也不要放弃,要一次又一次地尝试,享受充实的工程师生活。
6