Help us understand the problem. What is going on with this article?

terraform で 同じスペックの EC2 を複数台作る

こんにちわ、 @ktoshi です!

2020年になり、そろそろ始める時期になってきたのではないでしょうか、そう新人研修です。

昔は余ったサーバを持ってきて一台一台セットアップして…と準備していましたが、
今や画面をポチポチすれば簡単にサーバが出来ちゃう時代。素晴らしい時代。

しかし!やるからには徹底的に簡単にさせたい、ということで
同じようなサーバを簡単に作ってみよう!というのが今回の趣旨です。

概要

AWSでいっぱいサーバ作ります!そして、作ったサーバを0にもできます!
構築ツールとしては terraform を用います。

環境

  • AWS
  • Terraform v0.12.16

準備

事前に下記を準備ください。

  • Terraform のインストール
  • AWS アカウントの準備
    • AMIアカウントを発行いただき、アクセスキーなどを入手ください。
  • EC2に設定するSSH鍵の秘密鍵と公開鍵のセット

Let's try!!

それでは実践!
なお、インスタンスが一瞬にして大量に作成できてしまうので、
費用には十分お気を付けください。

Terraform の初期設定

Terraform で AWS を操作するための初期設定を行います。

provider の設定

provider.tf
provider "aws" {}

今回、AWSのクレデンシャルは環境変数で設定します。
環境変数として下記を設定してください。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

上記の設定が終われば、Terraform の初期化及び設定の確認を行います。

# Terraform の初期化
$ terraform init

# 認証情報の設定確認
$ terraform plan
※ エラー無く発行できればOK!!

設定ファイルの準備

今回はとりあえず EC2 を起動させるための最低限の設定を記載します。
また、新人教育前提ということで秘密鍵も同じものを使いまわすようにします。

terraform.tfvars
public_key = <公開鍵>
instance_number = <作成するEC2の数>
ec2.tf
# 定数の読み込み
variable "public_key" {}
variable "instance_number" {}

# キーペアの作成
resource "aws_key_pair" "aws-key-pair" {
  key_name   = "example-aws-key-pair"
  public_key = var.public_key
}

# EC2 の作成
resource "aws_instance" "ec2" {
  count         = var.instance_number
  ami           = "ami-0930de172e13fa059" # お好きなAMIを選択してください。
  instance_type = "t2.micro" # 起動したいインスタンスタイプを選択してください。
  disable_api_termination = false
  monitoring             = true
  root_block_device {
    delete_on_termination = true
    volume_size           = 20
    volume_type           = "standard"
  }

  credit_specification {
    cpu_credits = "standard"
  }
  key_name = aws_key_pair.aws-key-pair.key_name
  tags = {
    "Name" = "instance-${count.index}"
  }
}

# ElasticIP の作成
resource "aws_eip" "eip" {
  count = var.instance_name
  instance = aws_instance.ec2[count.index].id
  vpc = true
  tags = {
    "Name" = "instance-${count.index}-eip"
  }
}


# IPアドレスの出力
output "instance_ip" {
  value = join(", ", aws_eip.eip.*.public_ip)
}

設定の反映

下記コマンドを発行して、設定を反映させます。
Terraform では一般的に テスト実行 -> 実行 の流れになります。

# Dry-Run
$ terraform plan

# Done!!
$ terraform apply
~中略~
Outputs:

instance_ip = XXX.XXX.XXX.XXX, YYY.YYY.YYY.YYY # 作成したインスタンスのIPアドレス

これでインスタンスが生成されました!!
instance_number の数字を変えれば、自由に作成するインスタンス数を変更できます。
「2」に設定すれば2つ作成され、同じ設定で実行すれば2つの状態が維持されます。
「2」から「100」に変えれば、追加で98個作成されて合計で100の状態になります。
「0」を設定すれば、作成されたインスタンスが全て削除されます。

なので、当日新人が休み!とか新人追加で!とか研修キャンセルで!という
急な予定の変更にも柔軟に対応することができます。(インフラはね)

まとめ

他の記事で秘密鍵の数に合わせて作成するインスタンス数を変更する、というのはありましたが、
研修用途で特に深く考えず、なるべく簡単に作成したかったのでインスタンス数を定数として渡すようにしました。
今回は研修用途であまり深い設定はしていません。(VPCとかセキュリティグループとか)
本番環境で作るのであれば、オートスケーリングなどを利用するのがベターかと思います!
研修用とかちょっとしたイベント用などにご利用いただければ幸いです。

それでは皆様、素敵な研修ライフを。そして、素敵な2020年を。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした