Edited at

TerraformとAWSに同時入門する

More than 1 year has passed since last update.

GMOペパボ、ムームードメインのエンジニア@litencattです。

昨日は@dp42による、"Hello, World."の次としてのチャットボットでした。

今日は、入社以来専らWeb開発がメインでやってきたけど、最近興味のあるAWSやTerraformによるインフラ構築について読んだ本をベースにやってみたことについて書いていきます。


やること

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」のインフラ環境や手順を参考に、AWS環境構築をTerraformを用いて行います。

なお今回はEC2インスタンスに対するApacheなどの各種インストールは直接インスタンス内に入ってコマンド実行していきます。


ゴール

AWS上に以下の環境構築を行ないます


  • EC2インスタンス x 2台


    • Webサーバ


      • インターネットゲートウェイを持つ

      • Apache(httpd)上でWordPressが動作している



    • DBサーバ


      • NATゲートウェイを通してインターネットに接続する

      • MySQLが起動している





この2つのインスタンスは同一VPC上に存在し、

具体的には以下のAWSリソースを扱います。


  • EC2

  • VPC

  • サブネット

  • ルートテーブル

  • インターネットゲートウェイ

  • セキュリティグループ

  • Elastic IP

  • NATゲートウェイ


今回参考にした本について

この記事内ではVPCやサブネットなど各種用語の説明まではおこなっていないのですが、

そのあたりについては今回参考とした本においてとても詳しい解説があり、またAWSで構築していく環境についての図がとてもわかりやすいと思います。

なので、このあたりについて初めて触る人にとってはとてもおすすめな本だと思いますので、ぜひ本を手元に用意してこの記事の内容も試してみていただけると良いかなと思っております:smile:


Terraformとは


  • AWSなど様々なサービスProviderに対して、サーバの構築・変更・管理を行うためのツール


  • HashiCorpのプロダクト

  • Enterprise版もあるみたい

ペパボではプライベートクラウドとしてOpenStackを自社運用しています。

TerraformはOpenStackにも対応しており、最近は各サービスのインフラ管理がTerraformで行われるようになってきています。

今回はこのTerraformをAWSに対して使っていきます。

https://www.terraform.io/docs/providers/aws/index.html


今回のコードのレポジトリ

https://github.com/litencatt/terraform-aws-templates


準備


Terraformのインストール(Mac)

$ brew install terraform


使用バージョン

2017/12/3の執筆時点での最新リリースバージョンをつかいます

$ terraform version

Terraform v0.11.1
+ provider.aws v1.5.0

https://github.com/hashicorp/terraform/blob/master/CHANGELOG.md#0111-november-30-2017


主にVim向け

HCL扱う場合は入れとくと便利そうです

https://github.com/hashivim/vim-hashicorp-tools


AWSの準備


terraform.tfvarsの設定

今回はAWSのアクセスキーなどの秘匿情報をterraform.tfvarsに持つようにしています。

ここに作成したアクセスキーとシークレットアクセスキーを設定してください。

リージョンなども変更したい場合は必要に応じて変更してください。


terraform.tfvars

access_key = "AWS_ACCESS_KEY"

secret_key = "AWS_SECRET_KEY"
region = "ap-northeast-1"
key_name = "KEY_PAIR_NAME"

:warning:実際のアクセスキーなどが書かれたterraform.tfvarsはレポジトリには登録しないよう注意ください


EC2インスタンスへのログイン時に必要な鍵ファイルについて

今回はAWSのダッシュボード上のキーペアで鍵を作成し、それをEC2インスタンス作成時に使用するように指定しています。そのため、key_nameには作成したキーペア名を設定してください。

また、EC2インスタンスへのログイン時に必要なため、作ったキーペアファイルは同じディレクトリ内に置いておくと良さそうです。


VPC作成

まずはVPCを作成します

https://github.com/litencatt/terraform-aws-templates/pull/1


main.tf

variable "access_key" {}

variable "secret_key" {}
variable "region" {}

provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}

resource "aws_vpc" "vpc-1" {
cidr_block = "10.0.0.0/16"
tags {
Name = "vpc-1"
}
}


main.tfファイル作成後$ terraform initを実行し、AWSのpluginを取得します。

その後、$ terraform applyを実行して成功するとVPCが作成され、AWSのVPCダッシュボードのVPCページでも確認することが出来ます。

ちなみにv0.11.0より$ terraform applyした場合は下記のようにyesを入力しないとapplyが実行されないように変更されています。

$ terraform apply

(省略)

Plan: 15 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value:


initせずにplanなどを実行した場合のエラー

$ terraform initを先に実行してください

$ terraform plan

Plugin reinitialization required. Please run "terraform init".
Reason: Could not satisfy plugin requirements.
...(略


以降の作業

すべて記事内に書くと結構なボリュームになりそうなので、以降の作業内容については各PRを参照ください。

PRを作成して手順や差分をわかりやすくし、必要に応じて説明を入れています:nerd:

また、各PRでは確認のために毎回$ terraform applyを実行させています。


WordPressページの表示確認

NATゲートウェイの作成〜各種インストールのPR内の作業までをすべて完了後、

WebサーバのURLに対してブラウザよりアクセスするとWordPressのスタートページの表示を確認することが出来ます。

:warning:この記事で作成したインスタンスは既にdestroy済みなのでPR上のURLにはアクセスできませんのでご注意ください


TerraformでAWSの環境構築してみて


  • 例えばEC2を作成した場合、未設定項目はデフォルト設定が適用される


    • ネットワークインターフェースはeth0が追加される

    • ストレージもgp2, 8GiBのタイプが適用される




  • ICMPエコー許可設定


    • サーバに対してpingを有効にするためにセキュリティグループにICMPの許可設定を追加する場合に、通常はfrom_portto_portにはポート番号を設定しますがICMPを追加する場合はICMP番号という番号で指定しなければならないようです


    vpc.tf

    resource "aws_security_group" "web-sg" {
    

    ...

    + ingress {
    + from_port = 8
    + to_port = 0
    + protocol = "icmp"
    + cidr_blocks = ["0.0.0.0/0"]
    + }





  • Elastic IPはデフォルトの上限が5




  • 請求料金などについて




今後のやっていき


最後に

今回、WordPress環境をAWS上にTerraformを主に使って構築してみましたが、

WordPress環境だけでなく、Node.jsやRailsなどの環境がなんと約10秒で出来上がってしまうというロリポップ!マネージドクラウドのβ版が現在無料公開中ですので、そちらも是非宜しくお願いします:smile:

https://mc.lolipop.jp/


参考にさせて頂いたサイト

など多数