Terraformを使ったEC2インスタンスのIaC管理:GPTとの対話による自動生成

はじめに

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でインスタンスにログインできます。

タグ: Terraform AWS IaC GPT DevChat

7月17日 18:19 投稿