Terraformを使って覚える。（その１：tfenvを使ったTerraformインストール）

# はじめに
次の仕事で`Terraform`を使うことになったため、勉強のためにまとめていこうと思います。

- 【次】[Terraformを使って覚える。（その２：git-secretsとVS Codeのインストール）](https://qiita.com/sakai00kou/items/5941a4862727234e6145)

# 私のスキル感
以前、`CloudFormation`は勉強して以下のような記事をいくつか書きましたが、`Terraform`は以前気になって少し触ってみた程度で、もうすっかり忘れてしまったので改めて学びなおそうと思います。

- [CloudFormationをゼロから勉強する。（その１：前準備）](https://qiita.com/sakai00kou/items/46e12aa5936b6d6064f2)

# Terraformとは
`HashiCorp`が提供しているツールで、いわゆるインフラ環境をコードで管理する`IaC`（Infrastructure as Code）と呼ばれるツールの一種となります。

`CloudFormation`も同様のツールとなりますが、`CloudFormation`がAWS環境の構築のみ対象としているのに対して、`Terraform`は`AWS`だけではなく、`GCP`や`Azure`でも使用できるツールとなります。

また、`CloudFormation`と同様、各種クラウド基盤のサービス部分の構築を対象としているため、サーバの設定などを行う場合は`Ansible`等のツールを利用する必要があります。

# 勉強のための参考書など
いきなり独学で覚えるのも大変なので、以下を参考に体系的に勉強してみようと思います。

「**実践Terraform**」は以前触ってみた際に買って途中までやって積んであったもの、「**AWSとTerraformで実現するIaC**」はちょうど`Udemy`でセールになっていたのでポチったものです。

- [実践Terraform AWSにおけるシステム設計とベストプラクティス](https://www.amazon.co.jp/dp/B07XT7LJLC?tag=maftracking300761-22&linkCode=ure&creative=6339)
- [AWSとTerraformで実現するInfrastructure as Code](https://www.udemy.com/course/iac-with-terraform/)

# Terraformのインストール準備
今回は以下環境を想定してインストールしてみようと思います。

|種別|内容|
|:--|:--|
|OS|Windows 11 Home|
|アーキテクチャ|AMD Ryzen 7 3700U|
|基盤環境|Amazon Web Service|

目的となる`Terraform`をインストールする前に、前提となる機能や周辺設定を先に整えておきます。

1. Terraform用IAMユーザ作成
2. AWS CLIのインストール
3. AWS CLIへのTerraform用ユーザプロファイル作成
4. Gitのインストール

上記1～3は`Terraform`から`AWS`環境を操作するための専用ユーザ作成と操作に必要となる`AWS CLI`のインストール＆セットアップ、4は`Terraform`のソースコード管理と、後述する`tfenv`で`Git`のパッケージに含まれる`Git Bash`を使いたいため`Git`のインストールを行います。

## Terraform用IAMユーザ作成
`Terraform`からの実行用として、AWSのIAMに以下Terraformユーザを作成しておきます。

実際の運用環境ではしっかりと権限設定する必要がありますが、今回は`Terraform`の勉強が目的なので`AdministratorAccess`の管理ポリシーを直接割り当ててしまいます。

|設定項目|設定内容|
|:--|:--|
|ユーザー名|terraform|
|AWS認証情報タイプを選択|アクセスキー - プログラムによるアクセス|
|既存のポリシーを直接アタッチ|AdministratorAccess|
|タグ|未設定|

IAMユーザ作成後、作成したユーザの「**認証情報**」タブからアクセスキーをCSVファイル等で取得しておきます。

## AWS CLIのインストール
`AWS`の以下オンラインマニュアルよりWindows用インストーラをダウンロードして実行するだけです。

- [AWS CLI の最新バージョンをインストールまたは更新します。](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)

インストール完了後、PowerShellやコマンドプロンプト等で以下のように表示されればOK。

```powershell:AWS_CLIバージョン確認
aws --version
aws-cli/2.7.10 Python/3.9.11 Windows/10 exe/AMD64 prompt/off
```

## AWS CLIへのTerraform用ユーザプロファイル作成
先ほど取得したアクセスキーを使い、`AWS CLI`に`Terraform`用のユーザプロファイルを作成します。

`PowerShell`より`aws configure`を実行し、以下のように登録していきます。

```powershell:ユーザプロファイル作成
aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

尚、すでに別のユーザプロファイルが存在する場合は以下を参考に別のプロファイルを作成します。

- [AWS CLIで複数アカウントを使い分ける。](https://qiita.com/sakai00kou/items/b3284b93145967d25c86)

## Gitのインストール
`Git`もWindows版は以下ダウンロードページよりWindows用インストーラをダウンロードして実行するだけです。

インストール時、色々と聞かれますが、そのままデフォルトでも問題ありません。

- [Git Downloads](https://git-scm.com/downloads)

# Terraformのインストール
今回は`tfenv`というツールを使って`Terraform`をインストールしようと思います。

`tfenv`とは`Terraform`を複数バージョンインストールして、切り替えて使用できるツールです。

`Terraform`は頻繁にバージョンアップが行われており、バージョンにより構文が変わってしまって動かないといったこともあるため、そのような場合、`tfenv`でバージョンを切り替えて使用するといった運用を行うことができます。

今回の目的としては`Terraform`の使い方を覚えることなので、`tfenv`はインストールしなくても良いですが、実際の運用では使われることも多いと思われるので、これを機に`tfenv`も使ってみようと思います。

1. tfenvのインストール
2. tfenv用環境変数の設定
3. tfenvを使用したTerraformのインストール

尚、`tfenv`を使用しない場合の`Terraform`インストール方法も補足として記載したため、`tfenv`を使用しない場合は、以下の補足を確認してください。

1. 【補足】tfenvを使用しないTerraformのインストール
2. 【補足】コマンドからのTerraform用環境変数の永続設定

## tfenvのインストール
`tfenv`のインストール＆初期セットアップは、先ほどインストールを行った`Git Bash`より以下`tfenv`の`GitHub`からClone、その後`tfenv`のパスを設定するため環境変数の設定を行うといった流れとなります。

以下を`Git Bash`から実行して`GitHub`からダウンロードします。

なお、以下の場合「**C:\Users\\[ユーザ名]**」に「**.tfenv**」というフォルダが作られて、その中にCloneしたファイルが格納されますので、別の場所にしたい場合はパスを変更してください。

```shell:tfenvのインストール
git clone https://github.com/tfutils/tfenv.git .tfenv
```

## tfenv用環境変数の設定
`tfenv`のコマンドへのパスを通すため、ホームディレクトリ（C:\Users\\[ユーザ名]）に「**.bashrc**」ファイルを作成してPATHの環境変数設定を行います。

パスはWindowsの形式ですと設定ができないそうなので、以下のように変換します。

- **【変換前】：C:\Users\UserName\.tfenv\bin**
- **【変換後】：/c/Users/UserName/.tfenv/bin**

また、以下ではヒアドキュメントで設定を行っておりますが、そのまま実行すると`$PATH`が変数展開されてしまうため、`_EOF_`をシングルクォートかダブルクォートでくくるようにします。

```shell:.bashrcの作成と環境変数設定
cat << "_EOF_" >> .bashrc
export PATH=$PATH:/c/Users/UserName/.tfenv/bin
_EOF_
```

`.bashrc`が作成出来たら、`source`コマンドで作成した`.bashrc`を読み込んでおきます。

```shell:.bashrcの読み込み
source .bashrc
```

## tfenvを使用したTerraformのインストール
`Terraform`を`tfenv`のコマンドを使用してダウンロード＆インストールを行います。

`tfenv`を使用してインストール可能な`Terraform`のバージョンを確認するためには以下コマンドを実行します。

```shell:tfenvでTerraformのインストール可能バージョンの確認
tfenv list-remote
```

すると以下のようにインストール可能な`Terraform`バージョンが表示されるため、インストールするバージョンを控えておきます。

```shell:tfenv_list-remote実行例
1.3.0-alpha20220622
1.3.0-alpha20220608
1.2.3
1.2.2
（省略）
```

今回は記事を書いている時点で最新安定板となる「**1.2.3**」をインストールしてみようと思います。

```shell:tfenvでのTerraformインストール
tfenv install 1.2.3
```

`tfenv`コマンドを実行することで、指定のバージョンの`Terraform`をインストールすることができましたが、`tfenv`を使用する場合、さらに端末にインストールされているバージョンからどのバージョンを使用するかを指定する必要があるため、`tfenv use`コマンドで指定します。

```shell:使用するTerraformバージョンの指定
tfenv use 1.2.3
```

現在使用しているバージョンを確認するためには`tfenv list`コマンドを実行します。

コマンド結果のうち、先頭に「**\***」が記載されているバージョンが現在使用中のバージョンとなります。

```shell:現在使用中のTerraformバージョンの確認
tfenv list
* 1.2.3 (set by /c/Users/UserName/.tfenv/version)
```

インストールしたバージョンが「**\***」で指定されていれば完了です。

## 【補足】tfenvを使用しないTerraformのインストール
補足として`tfenv`を使用しない場合の`Terraform`インストール方法についても記載しておきます。

Windows版のインストール自体は簡単で、`HashiCorp`のダウンロードページからダウンロードしたファイルを任意の場所に格納して実行するだけとなります。

- [Download Terraform](https://www.terraform.io/downloads)

ただ、適当な場所に置いただけではパスが通っていないので、環境変数の設定も行っておきます。

## 【補足】コマンドからのTerraform用環境変数の永続設定
GUI画面から設定を行っても良いですが、今回は`PowerShell`で設定しようと思います。

コマンドからの環境変数設定方法については以下で紹介しているため、ユーザ変数の`PATH`に永続設定を追加する方法だけ記載します。

- [コマンド操作でWindowsの環境変数を設定する。](https://qiita.com/sakai00kou/items/5f66a7af9de66f1a9ef9)

設定前の設定を以下コマンドで確認します。

```powershell:現在の設定の確認（ユーザ変数の場合）
[System.Environment]::GetEnvironmentVariable('PATH' , 'User')
```

環境変数`PATH`にパスを追加するには既存設定の後ろに付け加えないといけないため、ちょっと面倒ですが仮の変数を作って、結果を結合して作ります。

```powershell:既存のPATH変数に追加（ユーザ変数の場合）
$path = [System.Environment]::GetEnvironmentVariable('PATH' , 'User')
$path += ';' + 'C:\Users\UserName\Documents\terraform_1.2.3_windows_amd64'
[System.Environment]::SetEnvironmentVariable('PATH' , $path , 'User')
```

一度`PowerShell`を閉じたのち、再度開き、パス指定なしで以下のコマンドが実行できれば成功です。

```powershell:Terraformのバージョン確認
terraform.exe --version
Terraform v1.2.3
on windows_amd64
```

# おわりに
今回は`Windows`に`tfenv`と`Terraform`をインストールして、初期セットアップまで行いました。

次回は開発するのに必要となるツール類のインストール＆セットアップを行っていこうと思います。