TerraformでEC2インスタンスを構築（インストール編）

# はじめに
AWSを使ってて、毎回コンソールから環境を構築するのは面倒です。
Terraformというツールを使えば、環境をドカッと作れて、ゴソッと消せるらしいので触ってみました。

まずは、お試し感覚でAWSのEC2を構築します。

このインストール編ではインストールから初期設定までを説明しています。
実際の構築については[実践編](https://qiita.com/tnan1102/items/66939f410653266850d1)で説明しています。


# Terraformとは
* Terraformとは、HashiCorp社製のAWSやGCPなどのクラウド上のリソース管理をする構成管理ツールです。

* HashiCorp社のツールはTerraforｍの他にもVargrantなどがあり、これらはOSSとして公開されています。

### Terraformの使い方
* インフラの構成情報を.tfという拡張子のファイルに記述します。
* terraformの各コマンドを実行することで、記述したインフラの構成を管理することができます。
* .tfファイルは複数に分かれていても、同じディレクトリに存在すればまとめて適用することが可能。

### Terraformの開発フロー
Terraformを用いたインフラの開発は以下のような流れで行います。

1. .tfファイルにインフラのコードを書く
2. terraform planコマンドで現状との差分を比較する
3. terraform applyコマンドでインフラを構成を適用する
4. terraform showコマンドで状態を確認する


# Terraformのインストール

## ダウンロード先
Terraform は、下記のリンクからダウンロードできる。<br>
MacOS 版(AMD64)、Linux 版 (i386, AMD64)、Windows 版(i386) に対応

https://www.terraform.io/downloads.html


## インストール
### ①インストール先のディレクトリを作成する。

    $ mkdir terraform

    $ cd terraform

### ②URLからダウンロード & 解凍

    $ wget -O terraform_0.11.13_linux_amd64.zip https://releases.hashicorp.com/terraform/0.11.13/terraform_0.11.13_linux_amd64.zip

    $ unzip terraform_0.11.13_linux_amd64.zip

### ③ディレクトリを見てみる

    $ tree .
    .
    ├── 0.1.0_linux_amd64.zip
    ├── terraform
    └── terraform_0.11.13_linux_amd64.zip

### ④バージョン確認のコマンドを実行してみる

    $ ./terraform --version
    Terraform v0.11.13

 インストールは以上で完了。必要であればパスを通してある/usr/bin/などにコピーしてもいいかも。


# 初期設定

## 事前準備 for AWS
Trraformを使ってAWS環境を構築する前に、以下2つをやっておく。
### ① IAMユーザの作成<br>
TerraforでAWS環境を管理するにはアクセスキーIDとシークレットキーが必要なのでIAMユーザを作成しておく

### ② AWS CLIのインストール
事前にAWSCLIのインストールをインストールしておく。<br>
pip install awscliでインストールできる。

## Terraform初期設定

### ① IAMなどを登録
TerraformでAWSを管理する場合、アクセスキーの登録が必要になります。<br>
Terraformをインストールしたディレクトリに.tfファイルを作成し、アクセスキーを記述します。
ファイル名は適当でOK。<br>
リージョンも指定しておきます。

~~~:aws_setting.tf
    provider "aws" {
        access_key = "YOUR_ACCESS_KEY"
        secret_key = "YOUR_SECRET_KEY"
        region = "ap-northeast-1"
    }
~~~

### ② Terraform初期化
IAMのアクセスキーをterraform init コマンドを実行する。<br>
Terraformの作業ディレクトリを初期化し、AWSを操作するためのプラグインをインストールします。<br>
このコマンドを実行すると、terraform planやterraform applyコマンドが実行可能になります。<br>

    $ ./terraform  init 
    Initializing provider plugins...
    - Checking for available provider plugins on https://releases.hashicorp.com...
    - Downloading plugin for provider "aws" (2.6.0)...

    The following providers do not have any version constraints in configuration,
    so the latest version was installed.

    To prevent automatic upgrades to new major versions that may contain breaking
    changes, it is recommended to add version = "..." constraints to the
    corresponding provider blocks in configuration, with the constraint strings
    suggested below.

    * provider.aws: version = "~> 2.6"

    Terraform has been successfully initialized!

    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.

    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.


### ③ terraform planで現在の状態を見てみる
terraform planコマンドを実行して、現在の状態を確認してみます。<br>

変更なし、最新の状態であるというメッセージが表示される。<br>
まだ、Terraformの設定ファイルにはAWSの構成情報は記述していないのでOK。

    $ ./terraform plan
    Refreshing Terraform state in-memory prior to plan...
    The refreshed state will be used to calculate this plan, but will not be
    persisted to local or remote state storage.


    ------------------------------------------------------------------------

    No changes. Infrastructure is up-to-date.

    This means that Terraform did not detect any differences between your
    configuration and real physical resources that exist. As a result, no
    actions need to be performed.

# おわり
今回はインストール編なのでここまでです。<br>
次回は実際にTerraformを使って、EC2インスタンスを作成してみようと思います。