Terraform 入門：AWSのセキュリティグループにインバウンドルールを一括作成する方法

## はじめに

AWS環境をTerraformでコード化（Infrastructure as Code, IaC）することで、インフラ構成の管理や再現性を向上できます。

本記事では、Terraformを用いてセキュリティグループを作成し、指定されたインバウンドルールを適用する方法を解説します。

## 1. セキュリティグループとは？
AWSのセキュリティグループ（Security Group, SG）は、仮想ネットワーク内のEC2インスタンスや他のリソースの通信を制御するファイアウォール機能を提供します。

特にインバウンドルール（受信トラフィック）を適切に設定することで、不要なアクセスを制限し、セキュリティを向上できます。

## 2. Terraformでセキュリティグループを作成

### main.tf の作成
以下のTerraformコードを作成し、`main.tf` というファイルに保存します。

```hcl
provider "aws" {
  region = "us-east-1"  # バージニア北部（us-east-1）に設定
}

resource "aws_security_group" "custom_sg" {
  name        = "custom-security-group"
  description = "Security group with multiple inbound rules"
  vpc_id      = "vpc-xxxxxxxx"  # 適切なVPC IDに変更

  tags = {
    Name = "CustomSecurityGroup"
  }
}

resource "aws_security_group_rule" "inbound_rules" {
  count = length(var.inbound_rules)

  security_group_id = aws_security_group.custom_sg.id
  type              = "ingress"
  from_port         = var.inbound_rules[count.index]["port"]
  to_port           = var.inbound_rules[count.index]["port"]
  protocol         = var.inbound_rules[count.index]["protocol"]
  cidr_blocks      = [var.inbound_rules[count.index]["source"]]
  description      = var.inbound_rules[count.index]["description"]
}

variable "inbound_rules" {
  default = [
    { port = 445,  protocol = "tcp", source = "0.0.0.0/0", description = "SMB" },
    { port = 3268, protocol = "tcp", source = "0.0.0.0/0", description = "Custom TCP" },
    { port = 88,   protocol = "udp", source = "0.0.0.0/0", description = "Custom UDP" },
    { port = 53,   protocol = "udp", source = "0.0.0.0/0", description = "DNS" },
    { port = 3389, protocol = "tcp", source = "0.0.0.0/0", description = "RDP" },
    { port = 80,   protocol = "tcp", source = "0.0.0.0/0", description = "HTTP" }
  ]
}
```

## 3. Terraformの実行手順

### ① Terraformの初期化
まず、Terraformを初期化するために、以下のコマンドを実行します。

```sh
terraform init
```

このコマンドは、必要なTerraformプロバイダ（AWS）をダウンロードし、環境をセットアップします。

### ② 変更内容を事前に確認
変更内容を適用する前に、以下のコマンドで確認できます。

```sh
terraform plan
```

Terraformが適用しようとしている変更点を事前に把握し、誤った設定を防ぐのに役立ちます。

### ③ Terraformの適用
設定を適用するために、以下のコマンドを実行します。

```sh
terraform apply
```

Terraformは、設定内容を適用する前に「変更プラン（plan）」を表示し、確認を求めます。
問題なければ「yes」を入力して適用してください。

### ④ 適用結果の確認
適用が成功すると、AWSのセキュリティグループに指定したインバウンドルールが追加されます。
AWSマネジメントコンソールの「EC2 > セキュリティグループ」から、作成された `custom-security-group` のルールを確認できます。

**実際のマネコン画面**

![Screenshot 2025-03-08 at 19.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/76f3d67a-1489-4246-be36-834681e31da9.png)


## 4. 注意点

### VPC IDの設定
`vpc_id = "vpc-xxxxxxxx"` の部分は **実際のVPC IDに変更** してください。
VPC IDが不明な場合は、以下のAWS CLIコマンドで確認できます。

```sh
aws ec2 describe-vpcs --query 'Vpcs[*].VpcId' --output text
```

### 全てのIPアドレスからのアクセスを許可している（0.0.0.0/0）
`0.0.0.0/0` はすべてのIPアドレスからのアクセスを許可する設定のため、 **セキュリティリスクが高くなります**。
適切な **IP制限（例: 192.168.1.0/24）** を設定することを推奨します。

## まとめ
本記事では、Terraformを用いて **AWSのセキュリティグループにインバウンドルールを適用** する方法を紹介しました。

### 本記事のポイント
- Terraformを使うことで **インフラ構成をコードで管理** できる
- `aws_security_group_rule` を利用し、 **複数のインバウンドルールを一括適用**
- `terraform plan` で **適用前に変更内容を確認** 可能
- `terraform apply` で **簡単にAWSリソースを作成**

Terraformを活用することで、 **再現性の高いインフラ環境を構築** できます。