Terraform、始めました

#0.はじめに

Terraformを触ってEC2インスタンスを構築したので、その備忘録としてき書きました。ドがつくほど初心者なので、間違えていることを言っていたらご指摘ください。
また今回はセットアップ中心なのでGUIの操作も多いですが、今後はどんどんTerraformの本来の力を発揮させていきたいと思います。

#1.Terraformとは

[Terraform](https://www.terraform.io/)はHashiCorp社が開発したOSSでインフラの構築を自動化するCIツールです。VirtualBoxにVMを構築する際にその自動化を行う[Vagrant](https://www.vagrantup.com/)もHashiCorp社が手がけている。

### 1-1.何をするのか
インフラの構築や変更、バージョニングを行う際に、処理をコード化して実行するためのツールで、下記のようなメリットがある。

- コンソール画面からいちいち必要事項をポチポチしなくて済む
- 同じ構成のリソースを複製する場合に即時行える
- 履歴が残る(コンソール画面からだと残すのが難しい)

### 1-2.対象インフラ
まだ試していないけど、次のようなインフラの構築を管理できるらしい([参考](https://www.ossnews.jp/oss_info/Terraform))。

- 仮想マシン
- ストレージ
- ネットワーク
- ロードバランサー
- DNS
- データベース
- SaaS


#2.とりあえず触ってEC2を構築してみる

早く触ってみたいという思いもあり、EC2インスタンス、作成してみました。

###2-1.準備

MacOSでHomebrewが入っていたので、下記コマンドでインストールできました。

```
brew cask install terraform
```

###2-2.AWSコンソール側での準備
ざっと下記の手順でAWSコンソール画面側で準備しました。

1.IAM(AWS Identity and Access Management)でユーザー作成
2.作成したユーザーにEC2インスタンスを作成できる権限を付与
3.AWSのCLIをインストールし、アクセスキー等必要な認証情報を保管

#####2-2-1.IAM(AWS Identity and Access Management)でユーザー作成

- まずIAM管理画面にアクセスします。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/347450/aa775345-56d3-fe0e-bad3-0403ed393fbd.png)

- 次にユーザーを作成します。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/347450/b58d196c-de48-8fff-c2ff-8cade0d162a5.png)

- 「プログラムによるアクセス」にチェックをつけて次に進みます(CLIのインストールは後述）
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/347450/3d80a143-bd51-14a0-606f-2a4d6080bded.png)


#####2-2-2.作成したユーザーにEC2インスタンスを作成できる権限を付与

- グループを作成します。

![図4.png](https://qiita-image-store.s3.amazonaws.com/0/347450/91b11295-fb67-7c5f-715a-53f69b99be07.png)

- 作成したグループに権限を付与します。今回はAmazonEC2FullAccessを付与しました。

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/347450/88bfc5f4-1983-1c97-33d1-f06e5bf91910.png)

- あとは作成したユーザーを先ほど作成したグループに帰属させて、ユーザー作成します。作成してから得られたアクセスキーとシークレットアクセスキーはcsv ダウンロードするなどして控えます。

![図5.png](https://qiita-image-store.s3.amazonaws.com/0/347450/269e74ee-c52d-0018-4a59-65778729382c.png)

#####2-2-3.AWSのCLIをインストールし、アクセスキー等必要な認証情報を保管

- AWSのCLIインストールは[こちらのサイト](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html)を参考にしました。下記のコマンドが実行できればOKです。

```
$ aws --version
aws-cli/1.16.96 Python/2.7.10 Darwin/17.4.0 botocore/1.12.86
```

- aws configure でアクセスキーなど先ほど控えたものを記入します。regionはどこでも大丈夫です。東京だったらap-northeast-1。私の場合output formatはjsonにしました。

```
$ aws configure
AWS Access Key ID:
```

長くなりましたがこれで準備完了です。

###2-3.EC2インスタンス構築

適当なフォルダを作り、ec2.tfファイルとvariables.tfを編集します。

```ec2.tf
resource "aws_instance" "fukkui" {
  count         = 2
  ami           = "ami-0d7ed3ddb85b521a6" # Amazon Linux 2 AMI (HVM), SSD Volume Type
  instance_type = "t2.micro"

  tags {
    Name = "${format("fukkui-%02d", count.index + 1)}"
  }
}
```
amiのidや、instance_typeはAWSコンソールからEC2のインスタンスを作成する画面で確認できます。コード作成は[こちらの記事](https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73)を参考にしました。

![図7.png](https://qiita-image-store.s3.amazonaws.com/0/347450/e1fb3172-f302-30b3-8593-a780aa6a43c4.png)


```variables.tf
provider "aws" {
 region = "ap-northeast-1"
}
```

書くまでもないですが構成はこんな感じです。

```
$ tree
.
├── ec2.tf
└── variables.tf
```

続いてterraform initを実行します。

```
$ terraform init

・
・
Terraform has been successfully initialized!
・
```

実行前にterraform planでチェックできます。

```
$ terraform plan

・
・
Plan: 2 to add, 0 to change, 0 to destroy.
・
・
```

問題なければ実際にAMIを作成します。

```
$ terraform apply

・
・
aws_instance.fukkui[0]: Creation complete after 34s (ID: i-0ed880dc87ef1df93)
aws_instance.fukkui[1]: Creation complete after 34s (ID: i-0bbde800bac609a7d)
```
terraform showでインスタンスの状態を確認できます。

```

$ terraform show
aws_instance.fukkui.0:
・
・
aws_instance.fukkui.1:
・
・
```
コンソール画面からもインスタンスが作成できていることがわかります。
![図6.png](https://qiita-image-store.s3.amazonaws.com/0/347450/a07b03b3-bf08-600a-34c6-e91f4f96cf4f.png)