EC2でtfenvを使ってみる

tfenvは複数バージョンのterraformを簡単に切り替えたり、
terraform自体もインストールできたりと便利な管理系ツール。

[公式サイト](https://qiita.com/kamatama_41/items/ba59a070d8389aab7694)を見ながらEC2(AmazonLinux2)で以下を試してみる。
・tfenvのインストール
・tfenvを使ってみる（terraformのインストール、切替え、アンインストールなど)


##tfenvのインストール
公式によると「GitHubから任意のパスにcloneしてtfenv/binにパスを通すだけ」とのこと。

まずはgitがインストールされているか。

```sh:gitは入っている？
$ yum list installed | grep git-all
$
```

入っていないのでyumコマンドでインストール。

```sh:gitインストール
$ sudo yum install -y git-all
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                          | 3.7 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package git-all.noarch 0:2.23.3-1.amzn2.0.1 will be installed
　 ・
　 ・
 (中略)
　 ・
　 ・
  subversion.x86_64 0:1.7.14-11.amzn2.0.2                             subversion-libs.x86_64 0:1.7.14-11.amzn2.0.2
  subversion-perl.x86_64 0:1.7.14-11.amzn2.0.2                        tcl.x86_64 1:8.5.13-8.amzn2.0.2
  tk.x86_64 1:8.5.13-6.amzn2.0.2                                      trousers.x86_64 0:0.3.14-2.amzn2.0.2

Complete!
$
```

```sh:インストール確認
$ git help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
　 ・
　 ・
 (中略)
　 ・
　 ・
'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.
$
```

続いてgit clone。
公式から[GitHubへのリンク](https://github.com/tfutils/tfenv)に飛ぶと、Install -> Manual に git clone とパス通しの具体的なコマンドが書かれているのでそのとおりにやってみる。


```sh:git_clone
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
Cloning into '/home/ec2-user/.tfenv'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 1105 (delta 8), reused 10 (delta 2), pack-reused 1084
Receiving objects: 100% (1105/1105), 216.01 KiB | 457.00 KiB/s, done.
Resolving deltas: 100% (703/703), done.
$
```

```sh:PATH通し
$ sudo ln -s ~/.tfenv/bin/* /usr/local/bin
ln: failed to create symbolic link ‘/usr/local/bin/terraform’: File exists
$
```

/usr/local/bin/terraformが既に存在すると怒られてしまった。

以前 /usr/local/bin 配下に terraform を手動インストールしていたのが原因。
シンボリックリンクを別のPATHに張ってもよいが、今後はtfenvでterraformを管理していくつもりなので手動インストールした方は削除する。

```sh:手動インストールしたterraformを削除
$ sudo rm /usr/local/bin/terraform
$
```

```sh:エラーになったところだけ再度lnコマンドを実行
$ sudo ln -s ~/.tfenv/bin/terraform /usr/local/bin/terraform
$
```


##tfenvを使ってみる
###■list-remote
インストール可能なterraformのバージョンを表示する。

```sh:list-remote
$ tfenv list-remote
0.13.0-beta3
0.13.0-beta2
0.13.0-beta1
0.12.28
0.12.27
0.12.26
0.12.25
0.12.24
0.12.23
0.12.22
0.12.21
0.12.20
0.12.19
0.12.18
0.12.17
0.12.16
0.12.15
0.12.14
0.12.13
0.12.12
0.12.11
0.12.10
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.12.0-rc1
0.12.0-beta2
0.12.0-beta1
0.12.0-alpha4
0.12.0-alpha3
0.12.0-alpha2
0.12.0-alpha1
0.11.15-oci
0.11.14
0.11.13
0.11.12
0.11.12-beta1
0.11.11
0.11.10
0.11.9
0.11.9-beta1
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.11.0-rc1
0.11.0-beta1
0.10.8
　 ・
　 ・
 (中略)
　 ・
　 ・
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
$
```


###■install
指定したバージョンのterraformをインストールする。

```sh:install
$ tfenv install 0.12.28
Installing Terraform v0.12.28
Downloading release tarball from https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip
#################################################################################################################################### 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_SHA256SUMS
No keybase install found, skipping OpenPGP signature verification
Archive:  tfenv_download.U0J4RG/terraform_0.12.28_linux_amd64.zip
  inflating: /home/ec2-user/.tfenv/versions/0.12.28/terraform
Installation of terraform v0.12.28 successful. To make this your default version, run 'tfenv use 0.12.28'
$
```

バージョンはlatest:^0.8という書き方もでき、0.8系の最新がインストールされる。
単にlatestとだけ記載した場合は全バージョンの最新がインストールされる。

```sh:install_latest
$ tfenv install latest:^0.11
Installing Terraform v0.11.15-oci
Downloading release tarball from https://releases.hashicorp.com/terraform/0.11.15-oci/terraform_0.11.15-oci_linux_amd64.zip
#################################################################################################################################### 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/0.11.15-oci/terraform_0.11.15-oci_SHA256SUMS
No keybase install found, skipping OpenPGP signature verification
Archive:  tfenv_download.OHhNMs/terraform_0.11.15-oci_linux_amd64.zip
  inflating: /home/ec2-user/.tfenv/versions/0.11.15-oci/terraform
Installation of terraform v0.11.15-oci successful. To make this your default version, run 'tfenv use 0.11.15-oci'
$
```
0.11系の最新バージョン(0.11.15-oci)がインストールされた。

```sh:install_latest
$ tfenv install latest
Terraform v0.12.28 is already installed
$
```
latestとだけ書くと全体の最新バージョン(0.12.28)がインストールされる。
今回は先にインストール済みだったのでそのように結果が返ってきた。


###■list
インストール済みのterraformのバージョンが表示される。
またuseコマンドで選択したバージョンは*が表示される。

```sh:list
$ tfenv list
cat: /home/ec2-user/.tfenv/version: No such file or directory
Version could not be resolved (set by /home/ec2-user/.tfenv/version or tfenv use <version>)
tfenv-version-name failed
$
```
バージョンファイルがないよと怒られた。
エラー文言を読むとuseコマンドを打てばファイルが作られそうな雰囲気なので打ってみる。

###■use
使用するバージョンを選択する。

```sh:use
$ tfenv use 0.12.28
Switching default version to v0.12.28
Switching completed
$
```

これでlistがいけるようになったはず。

```sh:list
$ tfenv list
* 0.12.28 (set by /home/ec2-user/.tfenv/version)
  0.11.15-oci
$
```
いけた。useで選択した0.12.28に*が入っている。

インストール済みの別バージョン（0.11系の最新）にも切り替えてみる。

```sh:use
$ tfenv use latest:^0.11
Switching default version to v0.11.15-oci
Switching completed
$
$
$ tfenv list
  0.12.28
* 0.11.15-oci (set by /home/ec2-user/.tfenv/version)
$
```
無事、切り替えられた。

ちなみにインストールされていないバージョンをuseするとどうなるのか。
（自動でインストールして選択してくれたりする？）

```sh:use
$ tfenv use latest:^0.10
No installed versions of terraform matched 'latest:^0.10'
$
```
単にエラーになるだけだった。

###■uninstall
指定したバージョンのterraformをアンインストールする。

```sh:uninstall
$ tfenv uninstall 0.11.15-oci
Uninstall Terraform v0.11.15-oci
Terraform v0.11.15-oci is successfully uninstalled
$
```

---
tfenvを使うとterraformのインストール/アンインストール、バージョン切替もとても簡単に行うことができた。terraformのバージョンは2020年7月時点でまだ0.x.xであり今後もバージョンが次々と行われていくと思われる。その中で破壊的!?なバージョンアップもあるかもしれず、このような管理系ツールがあるととても助かる。