IaC(terraform)の学習(環境構築)

# はじめに
IaC（Infrastructure as Code）については色々と知識があったものの、自分で実際に作成したことはありませんでした。そのため、学習の際に得た知識を備忘録としてまとめた記事です。

IaCにはさまざまなツールがありますが、今回は Terraform を利用しています。Terraform は、AWS へのデプロイに便利であると考えたのと、他のクラウドプロバイダーでも使用できる点が選定の理由です。
(ただし、最近の買収により有料になるのではないかという懸念もあります)

## wslにaws cliをインストール
こちらを元にaws cliのみをインストールしました

https://qiita.com/youfuku/items/9e228f7259900c7cd380

# AWSの準備
## awsの設定
awsでアクセスキーなどの発行については、割愛させていただきます。
awsのコンソール画面から、発行したものをwslに登録します

```shell:wslのコマンド
aws configure
```
以下の入力が求められるので、入力します
```
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXX
Default region name [None]: us-west-2
Default output format [None]: json
```

登録が成功しているか確認
```shell:wslのコマンド
cat ~/.aws/credentials
```

# 開発環境(devcontainer)の準備
ファイルを作成
```shell:wslのコマンド
mkdir .devcontainer
touch .devcontainer/devcontainer.json
```

```json:.devcontainer/devcontainer.json
{
  "name": "Ubuntu",
  // 開発環境(docker)の設定
  "image": "mcr.microsoft.com/devcontainers/base:jammy",
  "features": {
    "ghcr.io/devcontainers/features/aws-cli:1": {},
    "ghcr.io/devcontainers-contrib/features/terraform-asdf:2": {}
  },
  // 利用ユーザーをvscodeに設定
  "remoteUser": "vscode",
  // マウント(aws関係)
  "mounts": [
    "source=${localEnv:HOME}${localEnv:USERPROFILE}/.aws/,target=/home/vscode/.aws/,type=bind,consistency=cached"
  ],
  // エディタの設定
  "customizations": {
    "vscode": {
      "extensions": [
        "shardulm94.trailing-spaces",
        "chihiro718.whitespacepp",
        "HashiCorp.terraform",
        "amazonwebservices.aws-toolkit-vscode",
        "mhutchie.git-graph",
      ],
      "settings": {
        "editor.formatOnSave": true,
        "editor.tabSize": 2,
        "editor.insertSpaces": true,
        "editor.detectIndentation": false,
        "editor.renderWhitespace": "all",
        "editor.fontSize": 14,
        "editor.fontFamily": "ＭＳ ゴシック",
        "editor.renderLineHighlight": "all",
        "editor.rulers": [
          40,
          80,
          120
        ],
        "[terraform]": {
          "editor.defaultFormatter": "hashicorp.terraform",
          "editor.formatOnSave": true,
          "editor.formatOnSaveMode": "file"
        },
        "[terraform-vars]": {
          "editor.defaultFormatter": "hashicorp.terraform",
          "editor.formatOnSave": true,
          "editor.formatOnSaveMode": "file"
        }
      }
    }
  }
}
```

この後、devcontainerに入りなおします。

#### バージョン確認
##### aws cliのバージョン確認
```shell:wslのコマンド
aws --version
```
下記のように出てれば正常です(バージョンの差異はあると思います)
```
$ aws --version
aws-cli/2.17.33 Python/3.11.9 Linux/6.6.36.3-microsoft-standard-WSL2 exe/x86_64.ubuntu.22
```

##### awsのアカウント情報の確認
下記コマンドでwslと同じ情報が表示されていれば正常です。
```shell:wslのコマンド
cat ~/.aws/credentials
```

##### terraformのバージョン確認
```shell:wslのコマンド
terraform --version
```

下記のように表示されていれば正常です(バージョンの差異はあると思います)
```
$ terraform --version
Terraform v1.9.4
on linux_amd64

Your version of Terraform is out of date! The latest version
is 1.9.5. You can update by downloading from https://www.terraform.io/downloads.html
```
もし、表示されない場合、一度devcontainerに入りなおしてみてください。



# terraformの実行
### terraformの検証用ファイルを準備

```shell:devcontainerのコマンド
mkdir test
touch test/sample.tf
```

```terraform:test/sample.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_vpc" "test_vpc" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
}

resource "aws_subnet" "test_subnet" {
  vpc_id            = aws_vpc.test_vpc.id
  cidr_block        = "10.0.16.0/20"
  availability_zone = "ap-northeast-1a"
}

resource "aws_instance" "test_ec2" {
  ami           = "ami-00c79d83cf718a893"
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.test_subnet.id
}
```

ディレクトリ移動
```shell:devcontainerのコマンド
cd test
```

### terraformのコマンド実行！

まずは、初期化コマンドを実施
```shell:devcontainerのコマンド
terraform init
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/7b6d625f-b8de-8b58-3977-3b1fd87bf4f1.png)

次に、クラウド上にどんなものが生成する予定かを見ます
```shell:devcontainerのコマンド
terraform plan
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/0c941461-8689-108f-adf0-c561de76b528.png)
最後のメッセージ上、問題なさそうでした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/41d1dd2f-8bab-8b85-986f-4a5673a040ab.png)

実際に、クラウド上に生成
```shell:devcontainerのコマンド
terraform apply
```

実行すると、実行しますか？と確認がきますので「yes」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/fd68d913-a9c5-ff81-58d6-4b64fb9f4112.png)

実行後、awsコンソール上で調べてると作成されているはずです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/deb99fc5-0532-3cad-2b11-8c8d05e5d235.png)

作った物を削除します
```shell:devcontainerのコマンド
terraform destroy
```
こちらでも、削除しますか？と確認がきますので「yes」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/485e481a-4a77-0923-0fff-dbb658558b18.png)

実行後、awsコンソール上で調べてると削除されているはずです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/3449d3ca-9bfe-4ed2-76ee-6f417114d0bb.png)

コマンドの詳細については、こちらが参考になりました

https://zenn.dev/ymz_note/articles/4a09c616571b0a#%24-terraform-init


# さいごに
Terraform での環境の構築・削除が予想以上に早く行えることに驚きました。以前は AWS コンソールから手動で作成していましたが、今後は可能な限り IaC を活用したいと考えています。まだ Terraform を始めたばかりなので、これまで作成してきた構成を Terraform 化しながら学習を続けていこうと思います。