<Terraform学習>AWSにVPCを作成してみる

# 前提条件
学習のため細かく分けて作成していきます。

# バージョン情報
- Terraform: `Terraform v1.10.5`
- AWS CLI: `aws-cli/2.24.11 Python/3.12.9 Windows/11 exe/AMD64`

# 作業
## AWS IAMユーザの作成
AWS CLI用のユーザを作成します。
1. awscliユーザを作成
1. アクセスキー作成
1. IAM > セキュリティ認証情報 > アクセスキーを作成
1. ユースケース：コマンドラインインターフェイス (CLI)


## AWS CLI の設定
AWS CLI の認証情報を設定します。

```powershell
PS C:\Users\username> aws configure
AWS Access Key ID [None]: AKIAxxxxxxxxxxxxxxxxxx  # アクセスキーを入力
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxx  # シークレットキーを入力
Default region name [None]: us-west-2  # デフォルトのリージョンを設定
Default output format [None]: json  # 出力フォーマットを設定
```

設定された情報は以下のファイルに保存されます。

```powershell
PS C:\Users\username\.aws> cat config
[default]
region = us-west-2
output = json

PS C:\Users\username\.aws> cat credentials
[default]
aws_access_key_id = AKIAxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxx
```

## Terraformの作業ディレクトリ作成
Terraform の作業ディレクトリを作成し、移動します。

```powershell
PS C:\Users\username> mkdir C:\work\Terraform\01_basic
PS C:\Users\username> cd C:\work\Terraform\01_basic
```
Terraform 用の設定ファイル `01_vpc.tf` を作成しました。

## Terraformの初期化/プラン作成/apply実行
### Terraform の初期化
Terraform のバックエンドとプロバイダを初期化します。

```powershell
PS C:\work\Terraform\01_basic> terraform.exe init
```

### Terraform のプラン作成
リソースの作成計画を確認します。

```powershell
PS C:\work\Terraform\01_basic> terraform plan
```
出力結果の一部:
```terraform
Terraform will perform the following actions:

  # aws_vpc.terraform-vpc will be created
  + resource "aws_vpc" "terraform-vpc" {
      + cidr_block = "10.0.0.0/16"
      + enable_dns_hostnames = true
      + enable_dns_support = true
      + tags = {
          + "Name" = "terraform"
        }
    }
```

### Terraform の適用
リソースを適用し、VPC を作成します。

```powershell
PS C:\work\Terraform\01_basic> terraform apply
```
プロンプトが表示されるので、`yes` を入力。
```powershell
Enter a value: yes
```
適用が完了すると、以下のように表示されます。
```terraform
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
```

## 作成したVPCの確認
作成した VPC を AWS CLI で確認します。

```powershell
PS C:\work\Terraform\01_basic> aws ec2 describe-vpcs
```
出力結果の一部:
```json
{
    "Vpcs": [
        {
            "VpcId": "vpc-xxxxxxxxxxxxxxxxxxx",
            "CidrBlock": "10.0.0.0/16",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "terraform"
                }
            ],
            "State": "available"
        }
    ]
}
```
# AWS VPCパラメータについて
<details><summary>パラメータ一覧</summary>
参照： 

[Terraform_Resource: aws_vpc](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc)


| パラメータ名 | 説明 |
|-------------|------|
| `cidr_block` | VPCのIPv4 CIDRブロック。明示的に設定するか、IPAMを使用して `ipv4_netmask_length` から導出可能。 |
| `instance_tenancy` | VPCに起動するインスタンスのテナンシーオプション。デフォルトは `default`。`dedicated` を選択すると、専用ホストで実行され、追加料金が発生する。 |
| `ipv4_ipam_pool_id` | このVPCのCIDRを割り当てるためのIPv4 IPAMプールのID。IPAMを使用してIPアドレス管理を自動化できる。 |
| `ipv4_netmask_length` | VPCに割り当てるIPv4 CIDRのネットマスク長。`ipv4_ipam_pool_id` の指定が必要。 |
| `ipv6_cidr_block` | IPAMプールからリクエストするIPv6 CIDRブロック。明示的に設定するか、`ipv6_netmask_length` から導出可能。 |
| `ipv6_ipam_pool_id` | IPv6用のIPAMプールID。`assign_generated_ipv6_cidr_block` と競合する。 |
| `ipv6_netmask_length` | IPAMプールからリクエストするネットマスク長。`ipv6_cidr_block` と競合する。値は `44` ～ `60` の4単位の増分で指定可能。 |
| `ipv6_cidr_block_network_border_group` | VPCにIPv6 CIDRを割り当てる際のデフォルトのネットワークボーダーグループ（通常はVPCのリージョン）。ローカルゾーンなど特定のグループに変更可能。 |
| `enable_dns_support` | VPCでDNSサポートを有効/無効にするブール値。デフォルトは `true`。 |
| `enable_network_address_usage_metrics` | VPCでネットワークアドレス使用状況のメトリクスを有効にするかどうかを示す。デフォルトは `false`。 |
| `enable_dns_hostnames` | VPCでDNSホスト名のサポートを有効/無効にするブール値。デフォルトは `false`。 |
| `assign_generated_ipv6_cidr_block` | Amazonが提供する `/56` プレフィックス長のIPv6 CIDRブロックを要求。範囲やサイズの指定は不可。デフォルトは `false`。`ipv6_ipam_pool_id` と競合。 |
| `tags` | リソースに割り当てるタグのマップ。プロバイダーのデフォルトタグ設定がある場合、キーが一致すると上書きされる。 |
| `arn` | VPCのAmazon Resource Name (ARN)。 |
| `id` | VPCのID。 |
| `instance_tenancy` | VPC内で起動するインスタンスのテナンシー。 |
| `dhcp_options_id` | VPCのDHCPオプションID。 |
| `enable_dns_support` | VPCのDNSサポートが有効かどうか。 |
| `enable_network_address_usage_metrics` | VPCのネットワークアドレス使用メトリクスが有効かどうか。 |
| `enable_dns_hostnames` | VPCのDNSホスト名サポートが有効かどうか。 |
| `main_route_table_id` | このVPCに関連付けられたメインルートテーブルのID。`aws_main_route_table_association` を使用して変更可能。 |
| `default_network_acl_id` | VPC作成時にデフォルトで作成されるネットワークACLのID。 |
| `default_security_group_id` | VPC作成時にデフォルトで作成されるセキュリティグループのID。 |
| `default_route_table_id` | VPC作成時にデフォルトで作成されるルートテーブルのID。 |
| `ipv6_association_id` | IPv6 CIDRブロックの関連付けID。 |
| `ipv6_cidr_block_network_border_group` | ネットワークボーダーグループのゾーン名。 |
| `owner_id` | VPCを所有するAWSアカウントのID。 |
| `tags_all` | リソースに割り当てられたタグのマップ（プロバイダーのデフォルトタグを含む）。 |
</details>


# まとめ
- AWS CLI の設定を行い、Terraform で VPC を作成しました。
- `terraform init` で初期化し、`terraform plan` でプランを確認。
- `terraform apply` を実行し、VPC の作成を確認。
- `aws ec2 describe-vpcs` で作成された VPC を確認。

この学習を通じて、AWS に VPC を Terraform で作成する手順を理解しました。
次回は **サブネットの設定** を行います。