Terraformが使える環境をWindows11に構築したった。

内容
・環境
・WSLインストール
そもそもWindowsは2024/2/20時点でTerraformのバージョン管理機能（tfvenv）が使えないため、Linuxをインストールするための準備が必要
・windows11にLinuxをインストール
・tfenvの設定
・最新版をインストールします。（エラーが出るので、飛ばし読みでもOK）
・改めて、最新版のTerraformをインストールするための準備及び最新版のインストール（エラーなし。）
・Trraformセットアップ
・IAMでアクセスキーを発行して厳重に管理
・VPCとサブネットを作成
・重要なコマンド
・検証
・リソースの削除
・番外編（モジュール・変数）
・番外編２（デプロイメント）
・終わりに




## 環境
Windows11

## WSLインストール
・WSL （Windows専用デフォルトでWSL2がインストールされます。）

https://learn.microsoft.com/ja-jp/windows/wsl/install

既定のOSはubuntuになります。他のディストリビューションも選べます。
```
wsl --list --online
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/e3d7d7a4-c910-8ff2-a239-a068f106c044.png)

ひとまずインストール
```
wsl --install
```
![スクリーンショット 2024-02-20 091536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/90500164-dcd8-d881-515f-79c8b1919ad1.png)

PCを再起動して、Linuxの初期設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b636f005-d6f2-d66d-c2b6-4e1bea982728.png)



バージョン確認
```
cat /etc/os-release
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/34d07403-2fb9-2d4f-fc5a-d9a63af1cc16.png)


割り当てメモリ確認
```
cat /proc/meminfo
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8f72c580-94f7-c98e-18b4-13b1870ec684.png)
7018820÷1024=約6.8GB
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d99b3a0b-8c14-0fb5-9b25-7dda90456918.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/949add0b-8db6-cf35-06e1-2a24592b9453.png)



デフォルトで勝手に適用されるメモリサイズを変更したい場合
https://snowsystem.net/other/windows/wsl2-fixed-memory-allocation/

私は4GBに変更してみます。
Cドライブ直下に「.wslconfig」というファイルを作成。記載は次のとおり。
なお、このファイルへの読み取り権限を設定してあげないと、読み取ってくれないため設定しちゃいましょう。ちなみに私はEveryoneで設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/52fc9a04-5870-8d01-97da-d1210cbb4e90.png)

PCを再起動し、次のコマンドを実行してメモリの割り当てを確認
```
free
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/927f0455-38c6-e2e5-34f4-079831f727ad.png)
できていますね！

## tfenvの設定
この管理ツールを設定した後に、管理ツール越しにTerraformをインストールします。バージョンが頻繁に変わるらしいので、設定しておきます。
・gitをクローンでもろもろのデータをもらう
```
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/08cf1239-b71f-692e-5486-dce04c1353ce.png)

・パスを通します。
```
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
```

## 最新版をインストールします。（エラーが出るので、飛ばし読みでもOK）
```
tfenv install latest
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/7b034722-5909-928e-49a6-77c877065ef1.png)

エラー内容：
unzip: command not found
Tarball unzip failed


## 改めて、最新版のTerraformをインストールするための準備及び最新版のインストール（エラーなし。）
unzipユーティリティが存在しないということで、次のコマンドを先に実行する必要があります。
```
sudo apt update
```
次にこれ（unzipユーティリティのインストール）
```
sudo apt install unzip
```
ここでやっと最新版をインストールします。
```
tfenv install latest
```
これで「unzip: command not found Tarball unzip failed」は出ないはずです。

次に、tfenvを使用してインストールしたので、Terraformのバージョンを指定するための設定ファイルが必要です。
```
echo "1.7.3" > ~/.tfenv/version
```
Terraformがインストールされているか確認
```
terraform --version
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/72576cf0-f2de-18d9-dcfc-c3497e261663.png)
ここまでで、構築までは完了です。
次は、実際にTerraformを扱っていきます。

## Trraformセットアップ
・S3を作成。tfstate（コードの全て。）を格納するためのもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/baaae173-8128-10cd-8682-213b7e3e3883.png)
基本デフォルトで、バケットキーは無効でスタート。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/183ec137-fb9f-c788-8407-8e2e6b4b3abe.png)

このS3に保存することをTerraformに認識させるためのコードが必要。
公式サイト：

https://developer.hashicorp.com/terraform/language/settings/backends/s3

この公式サイト使い辛いですｗ
AWS使いたい人用とか分けたら100％使いよくなるはずやのに。。。
とイラ立ちながらも、公式サイトが有用なので戦いましょう。

## IAMでアクセスキーを発行して厳重に管理
ハードコーディングは決して行わず、次の手順でセキュアにセットアップする。

変数に格納してAWSと申し合わせる。これをコードに入れて、TerraformからAWSのS3に接続するイメージです。

・AWS CLIの認証情報を設定
CLIに次のコマンドを実行して設定開始
AWS CLIをインストール
```
sudo snap install aws-cli --classic
```
CLIでAWSのリソースを管理できるようになる。
```
sudo apt  install awscli
```
ここでアクセスキーと、シークレットキーを入力してセッション内で環境変数が設定される。
```
aws configure
```

ここまで終わったら、次のコードを作成、バケットを作ったので、大事なファイルここに置く！という設定
```
terraform {
  required_version = "~> 1.7"
  backend "s3" {
    bucket = "keiji-terraform-tfstate"
    key    = "terraform.tfstate"
    region = "us-east-1"
  }
}

provider "aws" {
  region = "us-east-1"
}
```
日本語訳すると、バージニア北部のkeiji～tfstateというバケットのterraform.tfstateというところに全てのコードが入っている「tfstate」という大事なファイル置くからなー。プロバイダーはAWSだからな！という感じ(p_-)

たった今作成した「backend.tf」と同じ階層で次のコマンドを実行
```
terraform init
```
これで初期化（接続として認識しちゃってますが正確には違う。）します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/f077a3ea-86b2-47dd-7407-2219457f77fe.png)


## VPCとサブネットを作成
VPCとサブネットを一緒に作成
ディレクトリ作成
```
touch vpc.tf
```

viで次のコード記載(「terraform vpc」「terraform subnet」でググる。)
```
resource "aws_vpc" "keiji_vpc" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "keiji_vpc"
  }
}



resource "aws_subnet" "keiji_subnet_1a" {
  vpc_id            = aws_vpc.keiji_vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-1a"
  tags = {
    Name = "keiji_subnet"
  }
}
```


## 重要なコマンド
実際にリソースの作成、変更、削除が行われる前に、Terraformが計画している変更内容を確認できる。つまり間違ってリソースを削除してしまったりなど、意図しない動きが計画されていないか確認できる。
```
terraform plan
```
destroyがないだけでも安心材料ですね。また、VPCとサブネットがカウントされていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/350bc859-357c-257a-8301-2e23f6b9ce00.png)

次に構文チェック
```
terraform validate
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6ce7136a-7571-6cc3-e023-2772ccfefaf2.png)

インデントを自動調整
```
terraform fmt
```
綺麗に直してくれますねー

次に実際に作成していきます。
```
terraform apply
```
【参考】
作成を１リソースずつ行うことも可能
```
terraform -target=aws_subnet.keiji_subnet_1a
```


planで計画を見た時と同じような表示となり確認ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/622ea330-ca7e-6fc7-86de-fbee895ea32b.png)

確認で問題無ければ、「yes」と入力してEnter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/899860b5-0716-5980-43c5-b68b4152a2bf.png)
いけてますね！

VPC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/18f5c813-c505-20f0-e443-f45124742fe1.png)

subnet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/23df5b74-14ca-fbd1-0fdd-681eceaa917d.png)

S3
tfstateファイルができています。簡単にダウンロードができて、メモ帳なんかでjsonファイル形式で見ることができますね！拡張機能があればVSCodeでも見ることができるのかな(p_-)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b662c4a8-45bb-9fcd-2724-88d8ec16464b.png)



## 検証
入力内容をAWSマネジメントコンソールから直接変更した場合、Terraformでどのように表示されるかを検証

現状
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/7f6a8ea0-1f4b-a6e7-a52e-aa83ea0d3850.png)

直接入力による変更（subnetの名称のみ変更しています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/4e244389-d8b7-63dd-47f0-e6d041bc3dd7.png)

Terraformでの状態
```
terraform plan
```
下図のとおり、変更されているところをコードで書いた通りに戻しますよ。と言われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/111d0a20-6959-47ef-3783-2b3a2c626d30.png)

次に、コードを修正して、再びplanでTerraformの認識を確認します。
コードを修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/ab118155-3e66-a36f-e145-74c60214a929.png)
```
terraform plan
```
下図のとおり、変更はありません。と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/cda610ab-f305-792c-1ef8-3a4a296c48f8.png)

## リソースの削除
１つのリソースを削除
例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/167a9d99-1f1b-577b-a6a7-73066693e3d0.png)

```
terraform destroy -target=aws_subnet.keiji_subnet_1a
```

全てのリソースを削除（※誤って消さないように注意しましょう。）
terraformで管理している全てのリソースが消える。
```
terraform destroy
```


学習で使用したリソースを実際に削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9af79467-2889-6f64-3eca-ad16cdef66af.png)
「yes」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a5d003da-33d5-993a-2d62-eedc92b8d96a.png)



## 番外編（モジュール・変数）
Terraformではモジュールが作成できます。また、変数も設定可能。
下図が基本構成
※Terraformは同一階層のファイルのみ全て読み込みます。
また、公式サイトにモジュールに関する定型も存在する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/5490694a-3cca-a49b-bda1-c03604389292.png)



## 番外編２（デプロイメント）
workspaceというコマンドによって開発、本番などの任意の環境へ切り替えることができる。
・workspaceの一覧表示
```
terraform workspace list
```
今デフォルト環境にいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/7cb21049-9de8-055c-67cc-bf0f3040eeda.png)

・新規に環境を作成
```
terraform workspace new "任意"
```
例ではstage,prod
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6b2b8730-73bb-c7d1-df5f-38602bb8d330.png)

・環境を変更
```
terraform workspace select 任意
```
例ではstage
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/74604622-1507-e0ae-f9f2-64a1abb39c6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1fca19ce-0b25-18cf-11db-7bf258702f95.png)
環境をコードで変更することで、あらかじめ下図のようにコードを変動する文字列を入れておくことで、自在に環境を変えることが可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/fe8b7e24-e7e6-ca19-66c2-8521750049b4.png)

## リソースの削除（２回目）
・S3をちゃんと削除しておきます。
バケットを空にして、削除ですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/e1b1b310-89dc-335f-0802-b532cd836878.png)
最後にWindows特有の「WSLのアイコン」をここぞとばかりに載せておきます。一番左です(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/dd160e99-4d71-94a4-f01a-a5f7941b85b3.png)

・WSLもアンインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/ace4f6d3-5fe6-ec25-9382-b05f72043b20.png)
かわいいｗ


## 終わりに
勉強になります！コーディングしてる感覚という正にそのとおりですね|дﾟ)インフラ方面としても当然必要な知識ではあるはず！
では！