AWS Cloud9でTerraform環境をセットアップ(学習用)

# はじめに
初投稿記事です！！

Terraform学習の折、サードパーティ製IDEだと鍵設定等難しそうだと思い、まずは手軽にサクッと試せるAWS Cloud9を使って環境を作成してみました。

# Cloud9とは
>AWS Cloud9 は、ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。
ブラウザのみでアプリケーションを作成、実行、デバッグでき、ローカルの IDE をインストールしたりメンテナンスを行う必要はありません。

デメリットとしては、他のIDEに実装されているような便利機能がなかったりしますが、勉強用として使うには十分かなと思われます。

# 本記事で実施する内容
1. Cloud9の作成/アクセス
2. terraform/tfenvのインストール/バージョン確認
3. tf.stateファイル用のS3バケット作成
4. terraform実行ファイルの作成
5. tfファイルの作成/実行
6. tfファイルで作ったリソースの削除

# ＜手順＞

## 1. Cloud9の作成/アクセス

下記URLにアクセスし「環境を作成」をクリック
https://ap-northeast-1.console.aws.amazon.com/cloud9control/home?region=ap-northeast-1#/product

![ap-northeast-1.console.aws.amazon.com_cloud9control_home_region=ap-northeast-1 (0).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3161388/d369e008-2aa1-597e-a396-3c36d3d33416.png)

名前と説明を記載して画面一番下の「作成」をクリック。
その他はデフォルトのままで大丈夫です。
※事前にVPC等を作成済みであればそちらを選択でもOK
![ap-northeast-1.console.aws.amazon.com_cloud9control_home_region=ap-northeast-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3161388/818af3e6-7739-64bb-390e-5714d249e362.png)

Cloud9環境が立ち上がりました。
(ちなみにCloud9の実体はEC2インスタンスです)
「開く」のリンクをクリックしてください。
![ap-northeast-1.console.aws.amazon.com_cloud9control_home_region=ap-northeast-1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3161388/61f1fd2b-82ef-d1c3-bd0b-9e960db0375a.png)


## 2. terraform/tfenvのインストール/バージョン確認

Cloud9にはデフォルトでterraformがインストールされています。
```
#利用中のTerraformのバージョン確認
$ terraform -v

Terraform v1.5.5
on linux_amd64
```

次にtfenvをインストールします。
tfenvはTerraformのバージョンを管理するツールです。
複数のプロジェクトで、異なるバージョンを利用している場合、バージョン管理が必要になります。tfenvを使わなくてもTerraformをインストールすることは可能なのですが、tfenvを使えばバージョンの切り替えが楽になります。

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

#パスを通す
$ sudo ln -s ~/.tfenv/bin/* /usr/local/bin

#tfenvのバージョン確認
$ tfenv -v
tfenv 3.0.0-18-g1ccfddb
```

tenvがインストールできたところで、
試しにTerraformのバージョンを切り替えてみましょう。

```
#Terraformのインストール可能なバージョンの確認
$ tfenv list-remote

#Terraformのインストール
$ tfenv install 1.3.7

#Terraformのインストール済みのバージョンの確認
$ tfenv list

#利用するTerraformのバージョンを指定
$ tfenv use 1.3.7
```

バージョンが切り替わったか再度確認してみましょう。
※バージョンが変わらない場合はターミナルを再起動してください。
```
#利用中のTerraformのバージョン確認
$ terraform -v
Terraform v1.3.7
on linux_amd64
```

## 3. tf.stateファイル用のS3バケット作成

tfstateファイルはTerraformが管理するリソースの現在の状態を表すファイルです。Terraformが次回の適用時に前回の適用結果を参照し、状態の変更があれば新しい状態をtfStateファイルに反映します。

tfstateファイルが削除されると、参照するstateがないためてterraformで作成したリソースのデプロイや削除が行えなくなってしまいます。
そのためtfstateファイルの管理はとても重要です。
今回はterraform destroyコマンドで誤って消してしまわないように手作業で作成したs3に格納いていきます。

下記URLにアクセスし「バケットを作成」をクリック
https://s3.console.aws.amazon.com/s3/get-started?region=ap-northeast-1
![s3.console.aws.amazon.com_s3_get-started_region=ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3161388/769afe3f-2242-4418-ec1d-1092341e3653.png)
バケット名(全世界で一意)を記載して画面一番下の「作成」をクリック。
こちらもその他はデフォルトのままで大丈夫です。
![s3.console.aws.amazon.com_s3_get-started_region=ap-northeast-1 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3161388/bd514ce6-01ee-cf26-80e6-c5aa0ecbd653.png)


## 4. terraform実行ファイルの作成
terraformが実行するtfファイルを作成していきます。
```
#作業用ディレクトリの作成
$ mkdir terraform && cd terraform

#実行ファイルの作成
$ touch backend.tf  // tf.stateの置き場所を指定
$ touch provider.tf // AWSのプロバイダーを指定
$ touch ec2.tf      // EC2インスタンスの設定を指定
```

作成したtfファイルの中身を記載していきます。
```言語:backend.tf
#tfstateファイルをS3に配置する
terraform {
    backend s3 {                   /*s3←デフォルトはlocalに配置される */
        bucket = "tfstate20230821"
        region = "ap-northeast-1"
        key    = "tf-test.tfstate" /*拡張子が.tfstateであればファイル名は任意*/
    }
}

```
```言語:provider.tf
#AWSプロバイダーの定義
provider aws {
    region = "ap-northeast-1"
}
```
```言語:ec2.tf 
#EC2の作成
resource aws_instance ec2 {
    ami           = "ami-0bba69335379e17f8"
    instance_type = "t2.micro"
    tags = {
        Name = "tf-test"
    }
}
```

## 5. tfファイルの作成/実行
terraformコマンドの実行して、tfstateファイルのアップロードとEC2インスタンスのデプロイを行います。
```
# インデント調整
$ terraform fmt

# 環境の初期化
$ terraform init

# 変更内容の確認
$ terraform plan

# 変更予定内容を反映し、インフラ環境を構築する。
$ terraform apply  //tfstateファイルはここで作成される
```

マネコンからEC2を確認すると今回作成したインスタンスが作成されています。
![ap-northeast-1.console.aws.amazon.com_ec2_home_region=ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3161388/02c5a325-15b6-a615-5f00-befda6dc4442.png)


## 6. tfファイルで作ったリソースの削除
今回作成したリソースを削除します。
```
# 削除するリソースの確認
$ terraform plan -destroy

# リソースの削除
$ terraform destroy
```
再度マネコンから確認するとEC2は削除されているかと思います。
またS3は手動で作成したので、格納したtfstateファイルはそのままの状態になっています。


以上です。
初記事なので誤った認識等あればご指摘いただけますと嬉しいです！