Terraformの環境構築から、EC2の作成までやってみよう!

# はじめに
udemyを使ってTerraformの勉強をしたので、Terraformの環境構築からAWSリソースの作成ができるまでをまとめた、学習備忘録です。

https://www.udemy.com/course/iac-with-terraform/

# 目的
インフラ構築をコード化/自動化(Iac)できるようになること

# Instracture as Code(IaC)とは
インフラ構築をコード化することで、人のミスを防ぎ品質とスピードを上げること

# IaCのメリット
* 環境のコピーが容易になる
* 変更点がコード管理されるので、gitで管理することができる

# HashiCorp社とは
* Mitchell HashimotoとArmon Dadgarによって2012年に設立された会社
* 今回使用する、```Terraform```を開発した

https://ja.wikipedia.org/wiki/HashiCorp

# Terraformとは
* Terraformは、IaCを実現するツール
* Terraformではインフラの構成をコードで宣言し、自動でデプロイすることができまる
* 複数のクラウドサービスに対応している(GCP, Azure, AWS)

https://www.terraform.io/

# 環境構築
## AWS CLIのインストール
最初にAWS CLIをインストールします。
インストール方法は公式ドキュメントがあるので公式を参考にインストールします。

インストールが完了すると、awsコマンドが使えるようになります。
```zsh
$ aws --version
$ aws-cli/2.8.2 Python/3.10.7 Darwin/21.6.0 source/x86_64 prompt/off
```

https://aws.amazon.com/jp/cli/


# IAMユーザー作成
AWSのIAMでTerraform用のIAMユーザーを作成します。

名前は、任意で、「アクセスキー・プログラムにアクセス」を選択します。
![スクリーンショット 2022-10-12 12.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/8dca3323-9da8-e0a0-299e-41fed901ac78.png)


権限は、Administratorを付与し、IAMユーザーを作成します。(タグ等は任意で付与する)
![スクリーンショット 2022-10-12 12.01.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/89511039-d3e1-0ecf-967b-c7d6efe29e9b.png)


ユーザーが作成できたらaws configureの設定をします。

```zsh
$ aws configure --profile terraform
AWS Access Key ID [None]:作成したもの
AWS Secret Access Key [None]:作成したもの
Default region name [None]:ap-northeast-1
Default output format [None]:json
```

プロファイルを指定して、S3バケットが見えればOK

```zsh
$ aws s3 ls --profile terraform
```

## Terraformのインストール
Terraformは、バージョンによって変更があることが多いため、Terraformのバージョン管理ツールのtfenvをインストールします。

### tfenvのインストール
私はanyanvを使用しているため、anyenv経由でtfenvをインストールします。

```zsh
# tfenv をインストール
$ anyenv install tfenv

# コマンドを実行して正常にインストールできているか確認
$ tfenv
tfenv 3.0.0-18-g1ccfddb
Usage: tfenv <command> [<options>]
```

brewでもインストール可能です。
```zsh
$ brew install tfenv
```

https://github.com/tfutils/tfenv

### Terraformのインストール

Terraformのインストール可能なバージョンを表示します。
```zsh
$ tfenv list-remote
```

最新をインストールします。
```zsh
$ tfenv install 1.3.2
$ tfenv use 1.3.2

# バージョン確認でインストールが成功したことを確認
$ terraform version
Terraform v1.3.2
on darwin_amd64
```

### git-secretsをインストール
AWSアクセスキーとシークレットキーを誤ってコミットするのを防いでくれるツールです。

```zsh
$ brew install git-secrets
```

各gitリポジトリに対して、git secrets --installを行うことで、git-secretsに対応させます。
```zsh
$ git secrets --install
# AWSのIAMで利用されているクレデンシャルのパターンを弾く専用のオプションを設定します。
$ git secrets --register-aws
```

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/scan-git-repositories-for-sensitive-information-and-security-issues-by-using-git-secrets.html

https://zenn.dev/kkk777/articles/8f55db1e9678f2


## VSCodeのプラグインをインストール

HashiCorpから提供さているプラグインをインストールします。

https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform

# はじめてのTerraform
## EC2の作成

新しくフォルダを作成し、main.tfファイルを作成します。

![スクリーンショット 2022-10-12 12.59.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95954/4f0048a7-1936-9534-95c4-22db89ce550e.png)


```terraform
# プロバイダーの設定
provider "aws" {
profile = "terraform"
region = "ap-northeast-1"
}

# EC2の設定
# amiは、awsのコンソールから確認します。
resource "aws_instance" "hello-world" {
    ami           = "ami-0ce107ae7af2e92b5"
    instance_type = "t2.micro"
}

```

terraformが使えるように初期化します。
```zsh
$ terraform init
```

terraformを実行します。
```zsh
$ terraform apply
```

AWSのコンソールを確認し、EC2が作成されていればOKです。

## tfstateとは
```$ terraform apply```を実行すると、``terraform.tfstate``ファイルが作成されます。
tfstateファイルとは、terraformを使って構築したクラウドの状態情報が全て記録されます。

先ほど作成されたtfstateの中を見ると、作成されたec2のidが書いてあり、AWSに起動したEC2のIDと一致します。

## EC2のタグ追加(再作成なし)
先程書いたコードにtagsを追加し、EC2のタグ追加を追加します。

```terraform
provider "aws" {
    profile = "terraform"
    region = "ap-northeast-1"
}

resource "aws_instance" "hello-world" {
    ami           = "ami-0ce107ae7af2e92b5"
    instance_type = "t2.micro"
    tags = {
        Name = "HelloWorld"
    }
}
```

terraform applyを実行すると、タグが追加されていることを確認することができます。
```zsh
$ terraform apply
```

## EC2にNGINXのインストール(再作成あり)
nginxをユーザーデータに追加します。```user_data```にnginxのインストール記載します。

```terraform
provider "aws" {
    profile = "terraform"
    region = "ap-northeast-1"
}

resource "aws_instance" "hello-world" {
    ami           = "ami-0ce107ae7af2e92b5"
    instance_type = "t2.micro"
    tags = {
        Name = "HelloWorld"
    }

user_data = <<EOF
#!/bin/bash
amazon-linux-extras install -y nginx1.12
systemctl start nginx
EOF
}
```

## EC2の削除
下記のコマンドを行うと、terraformで作成したリソースを削除することができます。

```zsh
$ terraform destroy
```

AWSのコンソールを見ると、先程の作成したEC2が削除されていることが確認できます。

# 基本コマンド

```zsh
# 実行計画の確認
$ terraform plan

# 変更の適用
$ terraform apply

# 管理インフラ環境の構築
$ terraform destroy

# 構文チェック
$ terraform validate

# フォーマット
$ terraform fmt 
```


以上です。Terraformを使うと簡単にクラウドリソースの作成ができますね。