📝

【Terraform】EC2の作成(AMIの検索、取得)

2025/01/14に公開

はじめに

下記のEC2を作成していきます。
EC2の最新版のAMIイメージを自動的に取得できるようにaws_amiを使用していきます。

  • AMIの検索、aws_amiで取得
  • キーペア作成
  • EC2の構築

AMIの検索

今回はAmazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Typeをインストール。
AWS CLIで下記コマンドを実行。
https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html

#AMI IDはマネジメントコンソールから。
$ aws ec2 describe-images --image-ids AMI ID

RootDeviceTypeVirtualizationTypeを参照していく。

aws_ami

  1. owners : enum[] : 所有者。self,amazon,aws-marketplace,microsoft
  2. most_recent : bool : 最新のものを選択するかどうか
  3. executable_users : string[] : 実行ユーザー。selfまたはアカウントID
  4. filter : block : name,valuesの値を設定。
data.tf
data "aws_ami" "app" {
  most_recent = true
  owners      = ["self", "amazon"]

  filter {
    name   = "name"
    values = ["amzn2-ami-kernel-5.10-hvm-2.0.*.0-x86_64-gp2"]
  }

  filter {
    name   = "root-device-type"
    values = ["ebs"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
}

キーペア作成

通常マネジメントコンソール上でキーペアを作成する時は、AWS側に公開鍵が保存されますが、
Terraformの場合、ローカルでssh-keygenを使用し、秘密鍵・公開鍵を作成し、AWSに公開鍵を登録します。

key-gen

  • 対象ディレクトリでssh-keygenを実行。
  • srcに移動させ、秘密鍵には.pemで保存。

aws_keypair

  1. key_name : string : キーペア名
  2. public_key : string : 公開鍵
  3. tags : object : タグ
appserver.tf
#------------------
#key pair
#------------------
resource "aws_key_pair" "keypair" {
  key_name   = "${var.project}-${var.environment}-keypair"
  public_key = file("./src/udemy_terraform-dev-keypair.pub")

  tags = {
    Name    = "${var.project}-${var.environment}-keypair"
    Project = var.project
    Env     = var.environment
  }
}

EC2の作成

aws_instance(基本設定)

  1. ami : string : AMI ID
  2. instance_type : enum : インスタンスタイプ
  3. tags : object : タグ

aws_instance(ネットワーク)

  1. string_id : string : サブネットID
  2. associate_public_ip_address : bool : 自動割り当てパブリックID
  3. vpc_security_group_ids : string[] : セキュリティグループID

aws_instance(その他)

  1. iam_instance_profile : string : IAMロール
  2. key_name : string : キーペア名
  3. user_data : string : ユーザーデータ
appserver.tf
#------------------
#EC2 Instance
#------------------
resource "aws_instance" "app_server" {
  #基本設定
  ami           = data.aws_ami.app.id
  instance_type = "t2.micro"
  #ネットワーク
  subnet_id                   = aws_subnet.public_subnet_1a.id
  associate_public_ip_address = true
  vpc_security_group_ids      = [aws_security_group.app_sg.id, aws_security_group.opmng_sg.id]
  #その他
  key_name = aws_key_pair.keypair.key_name

  tags = {
    Name    = "${var.project}-${var.environment}-app-ec2"
    Project = var.project
    Env     = var.environment
    Type    = "app"
  }

}

Discussion