Terraformを使ってs3バケットを作成する方法

# 概要
`Terraform`について理解を深める為、`Terraform`を使用してAWSのs3バケットを作成してみました。毎度ながら、備忘録の意味も含めて記載します。


# ディレクトリー構成
`Terraform`を使用して`S3 bucket`の作成が完了すると下記のディレクトリー構成になるかと思われます。
```
.
├── .terraform
├── modules/
│   └── aws_s3_bucket.tf
├── .gitignore
├── .terraform.lock.hcl
├── main.tf
├── providers.tf
├── terraform.tfstate
├── terraform.tfstate.backup
├── terraform.tfvars
├── variables.tf
├── versions.tf
└── README.md
```

# 構築手順
　今回の設定ですと1つのファイルでできますが、勉強も兼ねてる為、ファイルを分離させて構築を行なっております。

## versions.tf
`Terraform`のバージョンやAWSのバージョンを設定する必要がある為、`versions.tf`に記述します。

```tf
terraform {
  // Terraform本体に対するバージョン制約
  required_version = ">= 0.15"

  required_providers {
    aws = {
      source = "hashicorp/aws"
      // Providerに対するバージョン制約
      version = "4.59.0"
    }
  }
}
```

## providers.tfの作成
　プロバイダを指定する必要がある為、`providers.tf`を作成します。今回はAWSを使用する為、AWSのプロパイダーを指定します。また、AWSに接続する為、AWSの認証情報も記述しています。
<font color="Red">※ AWSの認証情報を記述する必要がある為、変数で定義しております。</font>
```tf
// 変数は、"${var.〇〇}"と記述する
provider "aws" {
  region  = "${var.region}"
  profile = "${var.profile}"
  access_key = "${var.aws_access_key}"
  secret_key = "${var.aws_secret_key}"
}
```

## variables.tfの作成
`providers.tf`に、AWSの認証情報の変数を記述した為、、`variables.tf`にAWSの認証情報を記載します。
<font color="Red">※ 認証情報の設定は、他にもやり方があるので、下記のサイトを参考に設定して頂いても大丈夫です。</font>

- [Terraformでクレデンシャルを読み込む方法あれこれ](https://qiita.com/Hikosaburou/items/1d3765d85d5398e3763f)

```tf
# 変数の設定
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "region"{}
variable "profile"{}
```

## terraform.tfvarsの作成
`terraform.tfvars`にAWSの認証情報を記述します。

```tf
aws_access_key="********************"　// aws_access_key_idを記述
aws_secret_key="****************************************" // aws_secret_access_keyを記述
region="**************" // 好きなregionを設定
profile="*********"　// 設定していれば記述する
```

## main.tfの作成
S3バケットを作成する記述を`modules`ファイルの`aws_s3_bucket.tf`に設定している為、`aws_s3_bucket.tf`の記述内容を読み込ませる情報を記述する。
<font color="Red">※ ファイル名は任意の名前でも大丈夫です。</font>
```tf
module "s3" {
  source = "./modules"
}

// moduleの書き方
module "リソースの名前" {
    source = "モジュールを定義したフォルダのパス"
    パラメーター名 = "パラメーター値"
}
```

## aws_s3_bucket.tfの作成
まず、ルートディレクトリーに`modules`と記述したディレクトリーを作成する。次に、そのディレクトリーの中に、`aws_s3_bucket.tf`のファイルを作成して、s3バケットを作成するコードを記述する。
<font color="Red">※ ファイル名とディレクトリー名は、任意の名前でも大丈夫です。</font>

```tf
// S3のbucketを作成する
resource "aws_s3_bucket" "this" {
  bucket = "terraform-sample-bucket"

  tags = {
    Name = "terraform-sample"
  }
}

// パブリックアクセスをブロックする設定
resource "aws_s3_bucket_public_access_block" "this" {
  bucket                  = aws_s3_bucket.this.bucket
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

resource "aws_s3_account_public_access_block" "this" {
  block_public_acls   = false
  block_public_policy = false
}

```

## .gitignoreの作成
`.gitignore`のファイルを作成後、下記のコードを記述して下さい。
```.gitignore
**/.terraform/*
.terraform.lock.hcl

# .tfstate files
*.tfstate
*.tfstate.backup
*.tfstate.*

# .tfstate files
*.tfvars
*.tfvars.*

crash.log

override.tf
override.tf.json
*_override.tf
*_override.tf.json
```

ここまではコードの構築は完成です。

# 操作方法(ターミナル操作)

## Terraformの設定ファイルの初期化
`terraform init`のコマンドを叩き、Terraformの設定ファイルを含む作業ディレクトリを初期化します。

```sh
terraform init
```

## 構築した環境が正常に動くか確認
今回設定内容が正常に動作するか下記のコマンドを叩き、確認します。もし、エラーが出た場合は、エラー文を読んで修正して下さい。
```sh
terraform plan
```

## 構築した環境をAWSに反映
構築したコードを元にS3バケットの作成を行いたいので、下記のコマンドを叩きます。オプションに、`-auto-approve`を付与する事で、強制的に全ての確認を`Yes`で進める事ができます。
```sh
terraform apply

#　-auto-approveを付与
terraform apply -auto-approve
```

## AWSに構築した環境を消去
今回AWSに構築したバケットが不要であれば、下記のコマンドを叩き消去します。オプションに、`-auto-approve`を付与する事で、強制的に全ての確認を`Yes`で進める事ができます。
```sh
terraform destroy

#　-auto-approveを付与
terraform destroy -auto-approve
```

# gitにあげる際の注意事項
:::note alert
<font color="Red">下記に記載するファイルはセキュリティーの観点から、git hubにあげないで下さい。</font>
- `.terraform.lock.hcl`
- `terraform.tfvars`
- `terraform.tfstate`
- `terraform.tfstate.backup`
- `.gitignore`
:::

# 著者の作成したコード
自信が作成したコードを`git hub`に上げましたので、確認事項があればご確認頂ければと思います。

https://github.com/kengo-sk8/terraform_create_s3bucket

## 感想
 今回初めて`Terraform`を使用してAWSの設定の構築を行いました。一通りの構築方法や設定方法、動かし方について理解したので、今回学んだ事を活かして、構築したい環境をどんどん作成してきたいと思います。