TerraformでAWSリソースを作成(VPC編)

## はじめに
Terraformを使ってAWSリソース(VPC、EC2)を作成する手順について、Terraform初学者の自分用のメモを兼ねて記載しておきます。
今回は下記アーキテクチャ図の環境を構築します。
## 前提
・windows環境であること
・Terraformが端末にインストールされていること
・AWS CLIが端末にインストールされていること
・AWSのアカウント(アクセスキーとシークレットアクセスキー)があること

## アーキテクチャ図
![Terrafrom用.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/110f8df9-f9ff-3107-4cb9-7a9b210c9ec7.png)

## やること
1.tfファイルの作成
2.AWS Configの設定
3.Terraformでリソースの作成
4.AWSリソースの確認

## 1.tfファイルの作成
Terraformでは「.tf」というファイルを使ってインフラ構築を行います。
全てを1つのファイルで構築することも可能ですが、本記事では以下のようにファイルに分けて構築を行います。※tfファイルの名前は自由に設定可能です、

①main.tf          ：プロバイダを設定するファイル
②variables.tf          ：変数を設定するファイル
③vpc.tf               ：作成するリソースを定義するファイル

各ファイルを以下のように設定していきます。
①main.tf  
プロバイダとしてAWSを指定します。
リージョンはap-northeast-1：アジアパシフィック (東京)とします。
```
# ---------------------------
# プロバイダ設定
# ---------------------------
# AWS
provider "aws" {
  region     = "ap-northeast-1" 
}
```

②variables.tf 
ここではvpc.tfでのAZ作成時にこのtfファイルを参照します。
```
# ---------------------------
# 変数設定
# ---------------------------
variable "az_a" {
  default     = "ap-northeast-1a" 
}
```
③vpc.tf               ：リソースを定義するファイル

ここではパブリックサブネットが１、プライベートサブネットが１のVPCを作成します。
またTerraformで作成するリソースには「terraform_test」とネーミング付けすることとします。
このtfファイルでは、VPCとサブネット(パブリック/プライベート)、パブリックサブネット用にルートテーブル、インターネットゲートウェイを定義しています。
```
# ---------------------------
# VPC
# ---------------------------
resource "aws_vpc" "test_vpc" {
  cidr_block = "192.168.0.0/16" 

  tags = {
    Name = "terraform_test_vpc" 
  }
}
# ---------------------------
# Subnet
# ---------------------------
# パブリックサブネットの作成
resource "aws_subnet" "test_public_subnet1a_sn" {
  vpc_id            = aws_vpc.test_vpc.id
  cidr_block        = "192.168.1.0/24" 
  availability_zone = "ap-northeast-1a" 

  tags = {
    Name = "terraform_test_public_subnet1a_sn" 
  }
}

# プライベートサブネットの作成
resource "aws_subnet" "test_private_subnet10d_sn" {
  vpc_id            = aws_vpc.test_vpc.id
  cidr_block        = "192.168.10.0/24" 
  availability_zone = "ap-northeast-1a" 

  tags = {
    Name = "terraform_test_private_subnet10d_sn" 
  }
}

# ---------------------------
# Internet Gateway
# ---------------------------
resource "aws_internet_gateway" "test_igw" {
  vpc_id = aws_vpc.test_vpc.id

  tags = {
    Name = "terraform_test_igw" 
  }
}
# ---------------------------
# Route table
# ---------------------------
# Route table作成
resource "aws_route_table" "test_route_table" {
  vpc_id = aws_vpc.test_vpc.id

  route {
    cidr_block = "0.0.0.0/0" 
    gateway_id = aws_internet_gateway.test_igw.id
  }

  tags = {
    Name = "terraform_test_route_table" 
  }
}
# SubnetとRoute tableの関連付け
resource "aws_route_table_association" "test_route_table_associate" {
  subnet_id      = aws_subnet.test_public_subnet1a_sn.id
  route_table_id = aws_route_table.test_route_table.id
}

```

## 2.AWS Configureの設定
AWS環境へのアクセス時の認証設定を行います。
コマンドプロンプトで「aws configure」と入力します。
設定個所は4つです。
```
aws configure
AWS Access Key ID [********************]:
AWS Secret Access Key [********************]:
Default region name [ap-northeast-1]:
Default output format [json]:
```
・Access Key
AWSアカウントのアクセスキーを入力します。

・Secret Access Key
上記アカウントのシークレットアクセスキーを入力します。

・Default region name
デフォルトのリージョンを設定します。ここでは東京(ap-north-east-1)としています。

・Default output format
出力結果の形式を選択します。デフォルトは"json"です。
## 3.Terraformでリソースの作成
以下の手順を行うことでTerraformでAWSのリソースを作成します。
ここでは「コマンドプロンプト」を使って操作します。
tfファイルがあるディレクトリに移動して、以下のコマンドを入力していきます。

①ワークスペースの初期化
　**terraform init**
「Terraform has been successfully initialized!」が表示されればOKです。
②tfファイルの構文チェック
　**terraform validate**
 「Success!」が表示されればOKです。
 ※構文にエラーがあればエラー個所が表示されます。
 
③実行計画を作成
　**terraform plan**
作成されるリソースを確認することができます。

④リソースを作成
　**terraform apply**
 Enter a valueと出てくるので「yes」と入力するとAWSリソースが作成されます。
 ```
  Enter a value: yes
  ```

## 4.AWSリソースの確認
 作成したリソースを確認
　**terraform show**
AWSのマネジメントコンソールでも正しく作成できているか確認します。
今回はパブリックとプライベートのサブネットが１つづつのVPCが作成できていれば完了となります。

また、以下はterraformでのAWSリソースの削除方法になります。

削除対象のリソースを確認
　**terraform plan -destroy**

作成したリソースを削除
　**terraform destroy**

作成したリソースを確認
　**terraform show**
Terraformで作成したリソースが消えていれば完了です。

## まとめ
terraformを使うと、マネジメントコンソールよりも手軽にAWSリソースを作成できると思いました。
次回はterraformを使ったEC2の作成の記事を作成したいと思います。

## 参考資料
・Terrafromのインストール

https://developer.hashicorp.com/terraform/install?product_intent=terraform

・AWS CLIのインストール

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html