📘

Amazon EC2×Terraform

2022/10/27に公開約7,100字

Amazon EC2とは

Amazon EC2(Elastic Compute Cloud)とは、ソフトウェアによりコンピュータ内に疑似的に再現したサーバマシンのことで、Linux, Windowsを動作できます。

Amazon EC2の構成要素・依存関係

Amazon EC2を構築するためには、下記のような構成要素・依存関係を理解する必要があります。

  • AMI
    EC2ベースとなるAMI(Amazon Machine Image)でOSのイメージを選択できます。AMIはOSのインストールが済んで初期アカウントまで設定済みです。
    インスタンスタイプによりサーバマシンの性能を決定できます。性能の要素として、CPUは処理の速さ、メモリは並列処理の多さ、ストレージは容量の大きさ「=バックアップディスクのことでこれはEC2インスタンスとは異なるネットワークに存在するEBS(EC2 Block Store)」等が挙げられ、それらの性能から理想のOSイメージを選択します。
  • 秘密鍵と公開鍵
    秘密鍵(鍵)と公開鍵(鍵穴)のペアを用意することでローカル・サーバ間の安全な疎通を担保できます。
  • サブネット
    親ネットワークを細分化した子ネットワークのことです。VPC(仮想ネットワーク空間)内にサブネットを作成(片方をパブリック、もう片方をプライベート)することで任意ユーザがアクセスできる空間と管理者のみがアクセスできる空間を両立した状態でサーバ運用が可能になります。
  • セキュリティグループ
    ファイアウォールの役割を担う通信のフィルタリング機能のことです。Web3層構造において各層に対するプロトコルとポート番号を設定し、定めた仕様のみで各層のサーバ相互通信を可能にする目的で利用します。
  • EIP(Elastic IP Address)
    IPアドレスを固定する機能のことです。EC2に付与されるIPアドレスはパブリック・プライベートの2種類あります。AWS上にプールされたIPアドレスがインスタンス起動時に付与され、インスタンス終了時にIPアドレスが再プールされます。例えば、再起動時にIPアドレスが変更されるのを防ぐために用いられます。

詳しくはこちらを参照ください
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

Amazon EC2を構築

Terraformでリソースを作成していきます。
https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/latest

完成イメージ

構築手順

STEP1: EC2インスタンスを起動してみよう 基本編

  1. EC2を生成するリソースを作成
  2. リソースを検証
  3. リソースの反映とインスタンスIDの確認
  4. コンソール画面を確認

1.1. EC2を生成するリソースを作成

amiはこちらから取得します。
https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#LaunchInstances:

provider "aws" {
  profile = "terraform"
  region  = "ap-northeast-1"
}

resource "aws_instance" "hello-world" {
  ami           = "ami-0de5311b2a443fb89"
  instance_type = "t2.micro"
}

1.2. リソースを検証

コードをフォーマットし、検証します。

$ . ~/.bashrc
$ terraform fmt
$ terraform plan

ログがこのように表示されます。

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.hello-world will be created
  + resource "aws_instance" "hello-world" {
      + ami                                  = "ami-0de5311b2a443fb89"
      ...

1.3. リソースの反映とインスタンスIDの確認

ローカルで作成したリソースにより問題ないことが核にできたため、AWS側に反映していきます。

$ terraform apply -auto-approve

実行すると、terraformで構築したクラウド上の(今回はAWS)ステートを管理するterraform.tfstateが生成されます。
こちらはterraform apply時にroot/にて生成・反映されます。

インスタンスIDを確認します。

  "resources": [
    {
      "mode": "managed",
      "type": "aws_instance",
      "name": "hello-world",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 1,
          "attributes": {
            "ami": "ami-0de5311b2a443fb89",
            "arn": "arn:aws:ec2:ap-northeast-1:139017542257:instance/i-01948df40feb5aae8",👈i-01948df40feb5aae8がインスタンスID
            ...
            "id": "i-01948df40feb5aae8",👈インスタンスID

1.4. コンソール画面を確認

AWSコンソール画面でリソースの反映を確認します。
ローカルのインスタンスIDと一致し、実行中となっていれば成功です。

STEP2: EC2インスタンスを起動してみよう 応用編

  1. 最新AMI情報を取得
  2. 最新AMIを参照するリソースを作成
  3. キーペアの作成
  4. キーペアをサーバ上に保存

2.1. 最新AMI情報を取得

AMI(Amazon Machine Image)とは、EC2ベースとなるでOSのイメージのことです。EC2インスタンス起動時のAMIはOSのインストールが済んで初期アカウントまで設定済みという理想的な状態です。

AWSコンソールからAMI IDを取得します。

AMI情報を取得します。

aws ec2 describe-images --image-ids ami-0de5311b2a443fb89

{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2022-10-13T21:14:50.000Z",
            "ImageId": "ami-0de5311b2a443fb89",
            "ImageLocation": "amazon/amzn2-ami-kernel-5.10-hvm-2.0.20221004.0-x86_64-gp2",
            "ImageType": "machine",
            "Public": true,
            "OwnerId": "137112412989",
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-03f58d3d918e5bd0a",
                        "VolumeSize": 8,
                        "VolumeType": "gp2",
                        "Encrypted": false
                    }
                }
            ],
            "Description": "Amazon Linux 2 Kernel 5.10 AMI 2.0.20221004.0 x86_64 HVM gp2",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "ImageOwnerAlias": "amazon",
            "Name": "amzn2-ami-kernel-5.10-hvm-2.0.20221004.0-x86_64-gp2", //ここが変数
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "VirtualizationType": "hvm",
            "DeprecationTime": "2024-10-13T21:14:50.000Z"
        }
    ]
}

2.2. 最新AMIを参照するリソースを作成

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami

data "aws_ami" "app" {
  most_recent = true //最新のAMI IDを利用
  owners      = ["self", "amazon"] //AMIの所有者(AWSアカウント, amazon etc...)

 //AMI検索フィルター(key & value)
  filter {
    name   = "name" //Amazon Machine Image name
    values = ["amzn2-ami-kernel-5.10-hvm-2.0.*-x86_64-gp2"] //全バージョンから最新を取得する
  }
  filter {
    name   = "root-device-type"
    values = ["ebs"] //外部ストレージの種類
  }
  filter {
    name   = "virtualization-type" //仮想化方式
    values = ["hvm"] //default
  }
}

2.3. 公開鍵と秘密鍵を生成

rot/keys配下で以下コマンドを叩き公開鍵と秘密鍵を生成します。

ssh-keygen -t rsa -b 2048 -f zenn-stg-keypair

2.4. 公開鍵をサーバ上に保存

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/key_pair

resource "aws_key_pair" "keypair" {
  key_name   = "${var.project}-${var.environment}-keypair"
  public_key = file("./keys/tastylog-dev-keypair.pub") //公開鍵のみサーバ上に送信

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

2.5. リソースを作成

https://registry.terraform.io/modules/terraform-aws-modules/ec2-instance/aws/latest#single-ec2-instance

resource "aws_instance" "app_server" {
  ami                         = data.aws_ami.app.id //AMI最新を参照
  instance_type               = "t2.micro"          //インスタンスタイプ
  subnet_id                   = aws_subnet.public_subnet_1a.id
  associate_public_ip_address = true //パブリックIPアドレス自動割り当て

  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"
  }
}


※AWSコンソールを見るとEIPがnullになっていることが分かりますね。

おまけ

terraform apply は main.tf と同じディレクトリではないと、実行できない。

https://qiita.com/wonderglot/items/9954b35bddc5a9163f5e

まとめ

今回はAmazon EC2の基礎および構築手順を学びました。
次回はAmazon VPCを構築します。

最後までお読みいただきありがとうございました。

GitHubで編集を提案

Discussion

ログインするとコメントできます