Terraform少しだけ入門してみた

# Terraformとは
Terraformは、オープンソースのサービスで、 開発リソースを効率的に構築できるIaC（Infrastructure as Code）ツールの一種と言われています。クラウドシステム開発に必要なインフラを、コードにより定義された構築設定に従って自動でawsなどのクラウド環境にデプロイしてくれるツールです！

※今回はAWSを使って話を進めていきます

## Terraformを使った開発の流れ（ざっくり）
1. アカウント作成（Terraformがクラウド環境を操作するため）
2. コードによる環境の定義
3. デプロイ

※最新のクラウドリソースだと、Terraformが対応しておらず、手動で対応する必要があるものもあるらしいので全てTerraformで完結するわけでもないみたいです。。。

## Terraformを使うための環境構築編
### 1. AWS CLIをインストール
下記URLを参考にCLIをインストールします！
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

```
$ aws --version
```
こちらを入力してバージョンが表示されていればインストール完了です！

### 2. IAMユーザーを作成
Terraform用にIAMユーザーを作成します。
Terraformが、EC2などのリソースを作成・変更・削除などの操作を行うので必要なポリシーをアタッチします。
今回は、手元でお試しで使うだけなので、全てのリソースに対してFullAccessができるように設定しました。

【手順】
1. AWSマネジメントコンソールにログイン
2. IAM > ユーザー からユーザーを作成
    「ポリシーを直接アタッチする」から、今回は「AdministratorAccess」を付与しました。
3. IAM > ユーザー > （作成したユーザー） > セキュリティ認証情報 > アクセスキーを作成 を選択します。
    ここで取得した、アクセスキーIDとシークレットレアアクセスキーを保存します。

※これが外部流出すると、そのユーザーで何でも操作ができるので扱いに注意が必要です。
`git-secrets`を導入するなどして対策しておくこと方が良いと思います！

さて、ユーザーが作成できたので
` $ aws configure `で認証情報をセットします。
自分は下記のように入力していきました！
```
$ aws configure --profile terraform_test
AWS Access Key ID: （先程取得した、アクセスキーID）
AWS Secret Access Key: （先程取得した、シークレットアクセスキー）
Default region name: ap-northeast-1
Default output format: json
```

認証情報が登録されているかの確認は、下記コマンドで行えます
```
$ cat ~/.aws/credentials
```

### 3. Terraformのインストール
Terraformのバージョン管理をしてくれるtfenvというツールをインストールします。tfenvを使ってTerraformをインストールしていきます。
```
$ brew install tfenv
```
これでtfenvが使える状態になっています。
インストールできるバージョンを下記コマンドで確認します。
```
$ tfenv list-remote
```
ずらーっとたくさん表示されると思いますが今回は1.4.6を利用することにしました。
```
$ tfenv install 1.4.6

$ tfenv use 1.4.6

$ terraform --version
Terraform v1.4.6
on darwin_arm64
```
これでTerraformが使えるようになったことが確認できました！

### 4. VSCodeでTerraformの拡張機能をインストール
`HashiCorp Terraform`をインストールします。コード補完などしてくれるので便利だと思います！

## Terraformをちょこっと使ってみる
ゴール：デフォルトであるVPCとsubnetにEC2を配置して起動するところまで試してみます。

フォルダを作成します。
```
$ mkdir terraform_test
```
ファイルを作成していきます。
```
$ touch main.tf
```

`main.tf`に、EC2を起動するところまで書いてみる
```tf
# ----------------------------
# Provider
# ----------------------------
provider "aws" {
  profile = "terraform_test"
  region  = "ap-northeast-1"
}

# ----------------------------
# Variables
# ----------------------------
variable "project" {
  type = string
}

variable "environment" {
  type = string
}

# ----------------------------
# EC2 instance
# ----------------------------
resource "aws_instance" "test_ec2" {
    ami = "ami-◯◯" #AMIのID
    instance_type = "t2.micro"

  tags = {
    Name    = "${var.project}-${var.environment}-ec2"
    # Namw  = test-dev-ec2 となります。
   }
}
```

```
$ touch terraform.tfvars 
```
```tf
project = "test"
environment = "dev"
```

ここまで書けたらEC2を起動していきます。
上記２ファイルがあるディレクトリ内で下記を実行していきます！

初めて実行するので、初期化するinitを実行します。
```
$ terraform init
```

コード整形したければ下記コマンドで整形ができます！
```
$ terraform fmt
```

記述したコードの定義内容を確認します！
``` 
$ terraform plan
```
意図した挙動となりそうか（今回の場合はEC2インスタンスが作成されそうか）確認します。

最後に、定義した内容を実行してEC2を作成します。
```
$ terraform apply
```

AWSマネジメントコンソールでEC2が作成されていれば成功です！！

## Terraformで定義したAWSリソースを全て削除する
```
$ terraform destory
```

## 毎回terraformって打つのがめんどくさい・・・
`~/.zshrc`にaliasを書いておいた
```zsh
#terraform
 alias tf='terraform'
```

# おわりに
tfファイル内では、HCL2という独自の構文？書き方？になっています。私もまだ手探り状態なので、公式ドキュメントを読みつつ書いてみました。。。。
https://developer.hashicorp.com/terraform/language

一旦お試しで使ってみてのアウトプットになるので、もっと良い書き方・運用の仕方は勉強していきます。
慣れてきてもう少し複雑な環境の作成ができたらその時またアウトプットしようと思います。

とりあえず、Terraform少しだけ入門してみました。
ここまで読んでいただきありがとうございました！

# 追記
続編を書きました。
もう少し踏み込んだ内容が書いてあると思うのでもし良ければこちらもご覧ください

https://qiita.com/keke21/items/26e7938c9b185b7388d8