<Terraform学習>AWSのNetwork ACLとルールの作成

# 前提条件
学習のため細かく分けて作成していきます。  
今回の構成では、Public Subnet では SSH (22番ポート) のみを許可し、それ以外を拒否。  
Private Subnet では Public Subnet からの SSH のみを許可し、他は拒否とします。

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

# 前提条件
学習のため細かく分けて作成していきます。  
今回の構成では、Public Subnet では SSH (22番ポート) のみを許可し、それ以外を拒否。  
Private Subnet では Public Subnet からの SSH のみを許可し、他は拒否とします。

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

# Terraform ファイルの内容と実行結果

## `terraform init`
```powershell
terraform init
```
出力（抜粋）:
```text
Terraform has been successfully initialized!
```

## `terraform plan`
```powershell
terraform plan
```
出力結果（要約）:
- `aws_network_acl`: Public/Private 用に 2 つ作成される
- `aws_network_acl_rule`: 各 ACL に対してインバウンド/アウトバウンドルールが追加される
- 合計 8 リソースが追加される予定

## `terraform apply`
```powershell
terraform apply
```
出力結果（要約）:
```text
Apply complete! Resources: 8 added, 0 changed, 0 destroyed.
```

# 作成したリソースの詳細

<details><summary>aws_network_acl リソースのパラメータ一覧</summary>

### 引数 (Arguments)

| パラメータ名           | 説明 |
|------------------------|------|
| `vpc_id`               | 関連付ける VPC の ID。必須。 |
| `subnet_ids`           | ACL を適用するサブネット ID のリスト。任意。 |
| `ingress`              | インバウンドルールの定義。attribute-as-blocks モードで処理される。任意。 |
| `egress`               | アウトバウンドルールの定義。attribute-as-blocks モードで処理される。任意。 |
| `tags`                 | タグのマップ。任意。 |

### `ingress` / `egress` に指定できるキー

| キー名             | 説明 |
|--------------------|------|
| `from_port`        | マッチさせる開始ポート。 |
| `to_port`          | マッチさせる終了ポート。 |
| `rule_no`          | ルール番号。評価順に使用される。 |
| `action`           | 許可（allow）または拒否（deny）。 |
| `protocol`         | 対象プロトコル（例: tcp, -1など）。 |
| `cidr_block`       | 対象の IPv4 CIDR ブロック。 |
| `ipv6_cidr_block`  | 対象の IPv6 CIDR ブロック。 |
| `icmp_type`        | ICMP のタイプ。 |
| `icmp_code`        | ICMP のコード。 |

※ [IANA ICMP Parameters](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) 参照

### 属性 (Attributes)

| 属性名           | 説明 |
|------------------|------|
| `id`             | Network ACL の ID。 |
| `arn`            | Network ACL の ARN。 |
| `owner_id`       | 所有する AWS アカウントの ID。 |
| `tags_all`       | すべてのタグのマップ。 |

</details>

<details><summary>aws_network_acl_rule パラメータ一覧</summary>

### 引数 (Arguments)

| パラメータ名         | 説明 |
|----------------------|------|
| `network_acl_id`     | 関連付ける Network ACL の ID。 |
| `rule_number`        | ルール番号（昇順で評価）。 |
| `egress`             | 送信ルールかどうか。 |
| `protocol`           | プロトコル。-1 はすべてを意味する。 |
| `rule_action`        | `allow` または `deny`。 |
| `cidr_block`         | 対象のネットワーク範囲（IPv4）。 |
| `ipv6_cidr_block`    | 対象の IPv6 ネットワーク範囲。 |
| `from_port`          | 開始ポート。 |
| `to_port`            | 終了ポート。 |
| `icmp_type`          | ICMP のタイプ。 |
| `icmp_code`          | ICMP のコード。 |

### 属性

| 属性名 | 説明 |
|--------|------|
| `id`   | Network ACL Rule の ID。 |

</details>

# 気づいたこと・勘違いしていたこと

- **ACL はステートレス**なため、**インバウンド/アウトバウンドを両方定義する必要がある**
- ドキュメントにはcidr_blockのパラメータはオプションと記載されていたが、cidr_blockを入れないとエラーが起きて作成に失敗した

# まとめ

- Terraform を使って VPC 内のサブネットに ACL を設定
- `aws_network_acl` と `aws_network_acl_rule` を組み合わせることで柔軟なアクセス制御が可能
- **Network ACL はステートレスであるため、ルールは入出力の両方に必要**
- **最小権限の原則**に基づき、CIDR 指定を適切に行うことが重要

次回は **セキュリティグループの作成** と最小権限の設計について学びます。