Terraformのセットアップ（Cloud9）

# Terraformのインストール、およびバージョン確認
 
Cloud9環境は、デフォルトでTerraformがインストールされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/61a807a8-6a44-ce22-88ee-b3699181d00b.png)


# terraform.tfstate（リソースの管理ファイル）の管理
terraform.tfstateファイルとは、Terraformの実行に伴って構築されるAWSのインフラ状態を逐次記録しておくためのファイルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/ac9b8bb7-2726-6fc6-9aec-9ca9d0788510.png)

terraformコマンドを実行すると自動でローカル環境（Cloud9環境）作成されます。
チームで開発を進める場合、ローカルに保存されていると、変更内容を衝突してしまうことを予想されるため、クラウド（AWSのS3など）へ保管し、変更の衝突を避け、チーム間で同時にインフラ構築が行えるようになります。
またローカルでは紛失、欠損時のリカバリーもできなくなる可能性がある為、クラウド上で保管することが望ましいでしょう。
ここではS3バケットにterraform.tfstateファイルを保管する方法を紹介します。
以後、terraformコマンド実行後、自動でクラウド環境上のtfstateファイルが更新されるようになります。

## ＜手順＞
１．S3バケットの作成
２．main.tfファイルの作成、実装
３．terraformコマンドの実行（=tfstateファイルのアップロード）

### S3バケットの作成
 
S3を検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/73a50a00-ab40-d5ee-abe1-4a1a5d5caa92.png)

バケットを作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/71f07864-f991-698d-aa60-b70f00ad56a5.png)

バケット名を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/b69730b8-c2e3-3093-575f-ff640da8e983.png)

パブリックアクセス設定は変更せずそのままとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/f8656f18-d9bb-7f70-16d1-71f3087705c4.png)

バケットを作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/4508d480-5247-62d1-95ad-80c00fe41f27.png)

バケット名をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/493a559c-84fe-5a2e-4781-1815107f7fa1.png)

アクセス許可タブをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/c06993a9-406f-bb4c-b18d-6d3ccc8613ac.png)

編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/a936368b-6d8a-bd61-ee2d-30bbbd1670f9.png)

チェックを一旦外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/19cb0956-f49e-5adf-95c9-1ee6e6198f83.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/1c044378-9f54-d879-4a32-b508bcc5dab0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/051b72db-5679-e6d6-0bff-bd39bcc6e396.png)

編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/8451164c-883c-e996-3506-37759a26e03f.png)

編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/f11f20f1-58e3-c387-bbab-55ceb024b88b.png)

ポリシージェネレータをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/7c0db41a-b184-879a-4acd-bb55851bc005.png)

以下を入力し、ユーザ情報とバケットを結び付け、バケットに対する許可する実行アクションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/8b6a1bde-192a-c820-b030-89a5d17823a9.png)

### ＜手順＞
##### ①Select Type of Policy：S3 Bucket Policy（固定）
##### ②Principal：自分のIAMユーザーのARN
##### ③Actions：ALL Actioncsにチェック
※本来許可するActionは制限すべきだが、ALL Actioncsにチェック
##### ④Amazon Resource Name (ARN)：作成したS3バケットのARN
※ARNとは、AWSを一意に識別するリソースネームです。詳細は以下参照。

### ③Principal
iamを検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/996c614a-0232-daad-9442-ba3c856d6f57.png)

ユーザをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/81862cf4-27fb-5a0e-918e-3c1fa3d9aad7.png)

ユーザーのARNをコピーして、そのままPrincilpal欄に入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/d57c0da9-6311-f9a5-50ab-b630c05bbda8.png)


#### ④Amazon Resource Name (ARN)
S3を検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/15b5fdb0-bc8c-687e-20df-878efe8c30be.png)

該当のバケットを選択し、「ARNをコピー」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/b56e48b2-1ab4-bf5e-a8c6-83c46fe721af.png)
⑤Amazon Resource Name (ARN)欄にそのまま入力する。

### main.tfファイルの作成、実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/79e8aefb-387d-6d7c-7cdf-28a4fe0fbc12.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/63d15a02-9630-f00c-a229-e1546c399d7f.png)


```Linux
$ mkdir terraform
$ cd terraform
$ touch main.tf
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/87805fe0-a4a3-9be8-edaf-0ceb4f5db01b.png)


```terraform/main.tf
# ----------------------------------
# Terraform versions
# ----------------------------------
terraform {
  required_version = ">=1.1"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~>3.0"
    }
  }
  backend "s3" {
    bucket  = "terraform-prd-tfstate-327495"
    key     = "terraform.tfstate"
    region  = "ap-northeast-1"
    profile = "terraform"
  }
}
# ----------------------------------
# Provider
# ----------------------------------
provider "aws" {
  profile    = "terraform"
  region     = var.region
  access_key = var.access_key
  secret_key = var.secret_key
}

$ touch terraform.tfvars
# terraform.tfvarsを編集
access_key = "自分のアクセスキー"
secret_key = "自分のシークレットキー"
region     = "ap-northeast-1"
project    = "terraform"
enviroment = "dev"
```
※注意
アクセスキー、シークレットキーの漏洩防止のため、tfvarsファイルを第三者に知れる場所に絶対に置かないこと。

### terraformコマンドの実行（=tfstateファイルのアップロード）

``` Linux
$ terraform init
# 環境の初期化

$ terraform plan
# 変更内容が表示されるため、確認する。

$ terraform apply
# 変更予定内容を反映し、インフラ環境を構築する。
```

## 索引ページ
下記でTerraformに関するテーマをまとめて紹介しています。

https://qiita.com/tk_tatsuro/items/94c463c14de89ebbb4d8