10
7

More than 1 year has passed since last update.

ISUCON公式AMIを使ってAWS上にISUCON環境をTerraformで構築レシピ

Last updated at Posted at 2021-06-26

はじめに

ISUCONの練習は公式GitHubのドキュメントにならってローカル環境でひとまず始めることはできますが、本番のように複数台IaaSな環境で練習したい!

AWS上に複数台EC2があるISUCON環境をVPC配下から作れるようなシンプルなTerraform構築ができたので記事にしました。

terraformを実行すると以下のような感じで新規作成されたVPC配下にISUCON環境を持ったEC2が複数台立ち上がります。

image.png

公開鍵の配置やAMI指定など実行者依存のパラメータ的部分があるので複雑になってしまっています。あくまでも参考程度にとらえてもらえればと思います。

免責事項

下記の内容をご理解していただいた上で記事内容をご参考ください。

  • 本記事にあるコマンドを実行しAWSリソースが作成されることによりAWS利用料金が発生します。その料金に関して責任を負うことができません。
  • 本記事のterraform実行では既存AWSリソースに対する影響が無いように考慮していますが、影響が発生することも起こりえます。その場合、その責任を負うことはできません。
  • 本記事で構築されるAWSリソースにおいてセキュリティ面で万全ではありません。不測のセキュリティ攻撃等を受けた場合の被害についてもその責任を負うことはできません。

環境構築の流れ概要

環境構築の流れの概要として以下のステップになります。

  • Step1: Ansible×Packerを利用しISUCON環境が入ったAMIをAWSに作成する ← 最後に記載する
  • Step2: 作成したAMIを指定したEC2とVPCを含んだ必要なAWSリソースをTerraformで構築する

以下の記事を参考にさせてもらいました。

Step1に関して、以下のISUCON公式で発信している、matsuuさんが作成されたAMIを利用することができます。

そのため、Step1は既に作成されているという前提でStep2の詳細を記載します。それによりISUCON環境としてはシンプルなものが完成です。

本記事の最後に、AMIをカスタマイズする場合の方法を記述します。

TerraformでAWS環境を構築する (Step2)

以下のレポジトリを作成しました。参考にするなり、forkするなり、コピペするなりしてもらえればと思います。

構築インフラパラメータを設定する

パラメータ設定のためにはterraform.tfvars.jsonファイルを作成し設定する必要があります。

以下は例になります。それぞれの項目の意味を記載します。

terraform.tfvars.json
{
  "standalone_ami_owner": "839726181030",
  "standalone_ami_name": "isucon10-qualify",
  "access_cidr_blocks": "xxx.xx.xx.xx/32",
  "vpc_net_mask": "10.2.0.0",
  "ec2_members": {
    "0": "isucon-01",
    "1": "isucon-02",
    "2": "isucon-03",
    "3": "isucon-bench"
  },
  "ec2_instance_type": "t3.medium",
  "ec2_volume_size": 20
}

standalone_ami_owner

利用するAMIの所有者のAWSアカウントIDです。デフォルト値はmatsuuさんのAWSアカウントID(839726181030)です。

standalone_ami_name

AMI名を指定します。ここでは、どのISUCON環境にするかという意味になります。

isucon10-qualifyならばISUCON10予選のAMIです。

実際にはisucon10-qualify-20210429011055というタイムスタンプ付きの名前ですが、terraformにてisucon10-qualifyを指定した場合は最新に作成されたisucon10-qualifyから始まるAMIを取得するようにしています。

matsuuさんが公開しているAMI名は以下のリンクで確認できます。

また、standalone_ami_ownerstandalone_ami_nameには自身で作成したAMIも指定可能です。

access_cidr_blocks

AWS環境EC2へのSSHとHTTP通信用セキュリティグループのInboundに設定するグローバルIPアドレスです。

これは自分のグローバルIPのみからのアクセスになるように制限するためのものです。デフォルトでは0.0.0.0/0であり、どの環境からもネットワーク自体は22と80ポートが空くことになります。

また、指定のグローバルIPはカンマ区切りで複数指定可能で、別のチームメンバーの環境からもアクセスできるようにすることができます。

vpc_net_mask

Terraformが作成するVPCのCIDRを指定できます。デフォルト値は10.1.0.0/16です。

ec2_members

立ち上げるEC2の台数とそれぞれの名前を指定することができます。デフォルトでは4台立ち上がります。

ec2_instance_type

立ち上げるEC2のインスタンスタイプです。ec2_membersにて複数台EC2を立ち上げた場合すべて同じインスタンスタイプになります。デフォルト値はt2.smallです。

ec2_volume_size

立ち上げるEC2のEBSのサイズです。ec2_membersにて複数台EC2を立ち上げた場合すべて同じ値になります。デフォルト値は20です。

現時点(2021-08-17)(version v1.1.0)での構築されるリソースの状態

  • 新規にVPCが作成され、そのVPC配下に以下のリソースが作成されます。
    • サブネット
    • インターネットゲートウェイ
    • セキュリティグループ
    • など
    • 詳細はterraformのmodules郡を確認していただければと思います。
  • EC2のスペック
    • Instance Type: t2.micro
    • Block size: 20GB
  • Route53を使ったDNS設定はしていません。SSH, HTTPアクセスはEC2のパブリックIPかDNSを見る必要があります。
  • HTTPS対応はしていません。
  • パプリックサブネット上にすべてのEC2を立てます。
  • 作成するEC2にアタッチするセキュリティグループは以下の設定になっています。
    • 22,80ポートのみ: 指定のIP(access_cidr_blocks)からのリクエストを受け付ける。指定しない場合は0.0.0.0/0(全許可)になる。
    • EC2間(セキュリティ間)はすべてのポートを許可。
  • EC2へのSSH用の鍵を手元に用意し公開鍵は指定の場所にisucon_id_rsa.pubという名前で置く必要があります。詳細は後述します。

構築Step

terraformレポジトリを取得

git clone git@github.com:momotaro98/isucon-aws-terraform.git

鍵設定

EC2へのSSH用鍵を生成し公開鍵を置く

ssh-keygen -t rsa -b 4096 -C "isucon key" -f isucon_id_rsa

公開鍵をisucon_id_rsa.pubの名前で以下の場所に置く。

modules/credential/isucon_id_rsa.pub

terraform.tfvars.jsonファイルを作成しパラメータ設定する

上述を参照しterraform.tfvars.jsonファイルを作成しパラメータ設定する。

terraformで構築&削除

terraformのコマンドで構築します。

初回のみ

terraform init

初回以降、起動コマンド

terraform apply

ISUCON環境で練習が終わったら削除する。

terraform destroy

SSH ログイン

以下の設定で構築されたEC2へSSHログインできます。

~/.ssh/config
Host isucon-practice-ec2
  HostName your_EC2_public_name
  Port 22
  User ubuntu
  IdentityFile ~/.ssh/isucon_id_rsa
  IdentitiesOnly yes
  RequestTTY yes
  RemoteCommand sudo su - isucon
$ ssh isucon-practice-ec2
(ログイン後)
isucon@ip-10-2-0-25:~$ ls
bench  env.sh  go  local  webapp

Ansible×PackerでAMIをカスタマイズする (Step1)

matsuuさんのISUCON用Ansibleファイルがまとまっているのが以下のレポジトリです。

レポジトリをforkするなり参考にしたりできます。

自作したAnsibleファイルを参照する形でPackerでAWS ProviderによりEC2でBuildすることで自身のAMIを作成することができます。

matsuuさんのPackerファイルは以下レポジトリにあります。以下はISUCON9予選のものです。

packer build .のようにすることでビルドが走ります。

その他参考にさせていただいたプロジェクト

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7