作りながら覚えるTerraform入門(1) - インストールと初期設定

クラウドを学び始めてしばらくすると、インフラをコード化できることを知りました。
Infrastructure as Code（IaC）ってやつですね。

IaCのツールは様々です。
AWSであればCloudFormation、AzureであればARMTemplate、
そして、マルチクラウドに対応しているIaCのツールがHashiCorp社のTerraformです。

前に少しだけ触ったことはあったTerraformを改めて学んで、知見がたまってきたのでチュートリアル形式でまとめてみたいと思います。題材は、学習のためにAWSCLIで作った環境をTerraformで再現することにしました。


##### 作りながら覚えるTerraform入門シリーズ

1. **インストールと初期設定** => 今回はコチラ
1. [基本編](https://qiita.com/m-oka-system/items/983653f611fe305820c8)
1. [VPC編](https://qiita.com/m-oka-system/items/bba8d32d57142a870ce5)
1. [EC2編](https://qiita.com/m-oka-system/items/8280f748f88ac2e28ad7)
1. [Route53 + ACM編](https://qiita.com/m-oka-system/items/34f3ac3d98210d06dbc8)
1. [ELB編](https://qiita.com/m-oka-system/items/8882431042a1d01d0b7c)
1. [RDS編](https://qiita.com/m-oka-system/items/a45867495f95461b0a2c)

# システム構成

![cloud02-aws-terraform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/fcac60b8-32b1-e226-b5e4-217d628858a7.png)


ELB、EC2、RDSなどの一般的な3層アーキテクチャの構成です。
ソースコードは以下にあります。

https://github.com/m-oka-system/cloud02-aws-terraform

# 環境
- macOS BigSur 11.3.1
- Homebrew 3.1.9

# Terraformインストール

Homebrewで簡単にインストールできます。

```bash
brew install terraform
```

現時点での最新バージョン`0.15.5`がインストールされました。
実態は`/usr/local/bin/`にあるのでPATHを通す必要もありませんでした。

```bash
terraform --version
Terraform v0.15.5
```

ちなみに、`tfenv`を使ってインストールする方法もあります。
`tfenv`を使うと、複数のバージョンを切り替えたり、チーム開発においてバージョンを固定するのに便利そうです。ただ、`tfenv`経由でterraformコマンドを実行すると遅かったので、現時点では使うのを控えています^^;

```bash
# tfenvのインストール
brew install tfenv

# tfenvを使ってterraformをインストール
tfenv install 0.15.4
tfenv install 0.15.5

# デフォルトバージョンを指定
tfenv use 0.15.4

# 一覧を表示(0.15.4を使う設定になっている)
tfenv list
  0.15.5
* 0.15.4 (set by /usr/local/Cellar/tfenv/2.2.2/version)

# バージョン確認
terraform --version    
Terraform v0.15.4

# バージョン切り替え
tfenv use 0.15.5

# バージョンが切り替わった
tfenv list
* 0.15.5 (set by /usr/local/Cellar/tfenv/2.2.2/version)
  0.15.4

# バージョン確認
terraform --version    
Terraform v0.15.5

```

`tfenv`を利用する場合、カレントディレクトリに`.terraform-version`というファイル名でバージョンを書いてあげると、指定バージョンの利用を強制できます。`tfenv install`だけで(引数なしに)指定バージョンをインストールすることもできるようになります。

```terraform:.terraform-version
0.15.5
```

# VSCode拡張機能

以下の2つをインストールしました。

- [HashiCorp Terraform](https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform)
- [Terraform Autocomplete](https://marketplace.visualstudio.com/items?itemName=erd0s.terraform-autocomplete)

「HashiCorp Terraform」で構文チェック、シンタックスハイライト、候補表示ができるようになりますが、リファレンスにジャンプしたい場合に「Terraform Autocomplete」が便利そうだったので試験的に使っています。

それと、リンクページにも記載のあるとおり「HashiCorp Terraform」には自動フォーマットの機能がありますので、`"editor.formatOnSave": true`を追記して有効にしておくと便利です。保存のたびにインデントを整えてくれます。

>Formatting
To enable formatting, it is recommended that the following be added to the extension settings for the Terraform extension:

```settings.json
    "[terraform]": {
        "editor.formatOnSave": true
    }
```

# エイリアス設定

terraformを使い始めると次のようなコマンドを頻繁に入力することになります。

- terraform plan
- terraform apply
- terraform destroy

毎回`terraform`と打つのが面倒なので、`.zshrc`にエイリアスを登録しておくと便利です。

```bash:~/.zshrc
alias tf="terraform"
alias tfp="terraform plan"
alias tfv="terraform validate"
alias tff="terraform fmt -recursive"
alias tfa="terraform apply -auto-approve"
alias tfd="terraform destroy -auto-approve"
```
`apply`や`destroy`は作成・更新・削除するためのコマンドです。
`-auto-approve`をつけているのでyes/noの確認の入力を求められませんが、実際の業務で使用するのはとても危険なので、必要に応じてカットするようにしましょう。慣れるまではエイリアスを使わずに手入力して、planの結果を確認してからyes/noという流れのほうが良いかもしれません。

# git-secretsのインストール

terraformを使ってAWSにアクセスするには、あらかじめ認証情報を登録しておく必要があります。
認証情報を定義する方法はいくつかありますが、そういった機密情報を誤ってGitのソース管理に含めてしまわないように`git-secretes`をインストールしておきます。

```bash
# インストール
brew install git-secrets

# git-secretsの設定
git secrets --register-aws --global
git secrets --install ~/.git-templates/git-secrets
git config --global init.templatedir '~/.git-templates/git-secrets'
```

# AWSCLIのインストール

AWSへアクセスするための認証情報を登録するためにAWSCLIをインストールします。
[公式ページ](https://aws.amazon.com/jp/cli/) の「MacOS」のリンクからPKGをダウンロードしてインストールすることができます。

![F72BE34B-1E07-49B8-9BBC-3754CADF6376.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/ef62a010-dddf-bb6e-b187-d2cb8f83fc80.png)

AWSCLIがインストールできたら、IAMユーザーのアクセスキーを登録します。
このユーザーのアクセス権に従ってterraformでリソースの作成・更新・削除などが行われますので、通常は`AdministratorAccess`の権限を持つユーザーを作成して割り当てます。

```bash
aws configure set aws_access_key_id <アクセスキーID>
aws configure set aws_secret_access_key <シークレットアクセスキー>
```

`~/.aws/credentials`を確認して、認証情報が登録できていることを確認します。

```bash:~/.aws/credentials
[default]
aws_access_key_id = <アクセスキーID>
aws_secret_access_key = <シークレットアクセスキー>
```

試しに動作確認を行ってみます。
以下のコマンドを実行して、利用するIAMユーザーの情報が表示されればOKです。

```bash
aws sts get-caller-identity
{
    "UserId": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/terraform"
}
```

これでterraformを利用するための準備は完了です。
次回は、VPCの作成と削除のコマンドを通じて、terraformの基本的な使い方を書いてみたいと思います！

# 参考リンク

- [AWS コマンドラインインターフェイス](https://aws.amazon.com/jp/cli/)

- [【初心者向け】MacにTerraform環境を導入してみた](https://dev.classmethod.jp/articles/beginner-terraform-install-mac/)