はじめに
AWS上でEC2インスタンスを手動で構築するのは、特に初心者にとって複雑なプロセスです。IAM、VPC、セキュリティグループなどの概念を理解し、正しい設定を行う必要があります。この記事では、GPT(特にDevChatというVS Code拡張機能)を活用し、Terraformコードを生成してEC2インスタンスを管理する方法を紹介します。
GPTとの対話
DevChatは、GPT-4と連携したVS Code拡張機能です。ユーザーは自然言語で要件を記述し、DevChatが対応するコードを生成します。以下は、KubeSphereをデプロイするためのEC2インスタンスを構築するプロセスです。
第一ラウンド
最初に、基本的な要件を提示しました。
KubeSphereをデプロイするためのEC2インスタンスが必要です。要件は以下の通りです:
1. OSはUbuntu 22.04
2. スペックは最低2 CPUコア、4 GBメモリ、40 GBディスク
3. SSHで接続可能
4. すべてのポートがパブリックネットワークからアクセス可能
このEC2インスタンスと必要なSSHキーペアを作成するTerraform設定を提供してください。
DevChatは以下のコードを生成しました。
provider "aws" {
region = "us-west-2"
}
resource "aws_key_pair" "my_ec2_key" {
key_name = "my-ec2-key"
public_key = file("~/.ssh/id_rsa.pub")
}
resource "aws_security_group" "k8s_sg" {
name = "k8s-sg"
description = "Kubernetes security group allowing all traffic"
ingress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "k8s_node" {
ami = "ami-0dba2cb6798deb6d8" # Ubuntu 22.04 LTS
instance_type = "t2.medium" # 2 vCPU, 4 GB RAM
key_name = aws_key_pair.my_ec2_key.key_name
vpc_security_group_ids = [aws_security_group.k8s_sg.id]
root_block_device {
volume_size = 40 # 40 GB disk
}
tags = {
Name = "KubeSphere-Node"
}
}
第二ラウンド
次に、より具体的な要件を追加しました。
提供された設定は概ね正しいですが、以下の要件を追加します:
1. リージョンをap-southeast-1に変更
2. インスタンス作成後、SSHでログインするためのパブリックIPアドレスが必要
3. AMI IDを手動で検索するのではなく、Terraform設定内でクエリして正しいIDを参照するようにしてください。
DevChatは、AMI IDの取得方法を改善し、出力を追加しました。
provider "aws" {
region = "ap-southeast-1"
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_key_pair" "my_ec2_key" {
key_name = "my-ec2-key"
public_key = file("~/.ssh/id_rsa.pub")
}
resource "aws_security_group" "k8s_sg" {
name = "k8s-sg"
description = "Kubernetes security group allowing all traffic"
ingress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "k8s_node" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.medium" # 2 vCPU, 4 GB RAM
key_name = aws_key_pair.my_ec2_key.key_name
vpc_security_group_ids = [aws_security_group.k8s_sg.id]
root_block_device {
volume_size = 40 # 40 GB disk
}
tags = {
Name = "KubeSphere-Node"
}
}
output "k8s_node_ip" {
description = "The public IP address of the KubeSphere instance"
value = aws_instance.k8s_node.public_ip
}
第三ラウンド
最後に、AMIのバージョンに関する誤りを修正しました。
Ubuntu 22.04はFocalではなくJammyです。設定を再度更新してください。
DevChatは、正しいAMIフィルターを使用して最終的な設定を提供しました。上記の第二ラウンドのコードは、この修正を反映しています。
成果確認
生成されたTerraformコードを実行して、EC2インスタンスが正しく作成されるかを確認します。
$ terraform init
$ terraform apply
コマンドを実行すると、TerraformはAWS上に指定された設定のEC2インスタンスをプロビジョニングします。プロビジョニングが完了すると、出力されたパブリックIPアドレスを使用してSSHでインスタンスにログインできます。