🌊

【Terraform】セキュリティグループの作成

2025/01/11に公開

はじめに

Terraformで下記のセキュリティグループを作成していきます。

VCPなどは前回の続きです。
https://zenn.dev/t_oishi/articles/c92f6a352ffa22

ファイル構成

.
├── main.tf
├── network.tf
├── security_group.tf
└── terraform.tfvars」

セキュリティグループの作成

下記2つを設定。

aws_security_group

  1. name : string : セキュリティグループ名
  2. descriptioon : string : 説明
  3. vpc_id : string : VPC ID
  4. tags : object : タグ

aws_security_group_rule

  1. security_group_id : string : セキュリティグループID
  2. type : enum : ingreee,egress
  3. protocol : enum : tcp,udp,icmpなど
  4. from_port : number : 開始ポート番号または開始ICMPタイプ番号
  5. to_port : number : 終了ポート番号または終了ICMPタイプ番号
  6. cidr_blocks : string[] : CIDRブロック
  7. source_security_group_id : string : アクセス許可したいセキュリティグループID

プレフィックスリスト

AWSが管理するIPアドレスレンジのリスト。
これにより、最新のIPアドレスレンジを手動で更新する必要が無くなる。
例えば、Amazon S3やCloudFront等のサービスに対しアクセスを制限する場合、プレフィックスリストを利用することで簡単に設定が可能になる。

今回S3のプレフィックスリストを使用するため、data.tfにその記述を書いていく。
nameはS3のマネジメントコンソール>マネージドプレフィックスリストで確認。

data.tf
data "aws_prefix_list" "s3_pl" {
  name = "com.amazonaws.*.s3"
}

apply後にterraform.tfstateに追加されていることを確認。

security_group.tf

security_group.tf
#------------------
#Scurity Group
#------------------
#web security group
resource "aws_security_group" "web_sg" {
  name        = "${var.project}-${var.environment}-web-sg"
  description = "web front role security group"
  vpc_id      = aws_vpc.vpc.id

  tags = {
    Name    = "${var.project}-${var.environment}-web-sg"
    Project = var.project
    Env     = var.environment
  }
}

resource "aws_security_group_rule" "web_in_http" {
  security_group_id = aws_security_group.web_sg.id
  type              = "ingress"
  protocol          = "tcp"
  from_port         = 80
  to_port           = 80
  cidr_blocks       = ["0.0.0.0/0"]
}

resource "aws_security_group_rule" "web_in_https" {
  security_group_id = aws_security_group.web_sg.id
  type              = "ingress"
  protocol          = "tcp"
  from_port         = 443
  to_port           = 443
  cidr_blocks       = ["0.0.0.0/0"]
}

resource "aws_security_group_rule" "web_in_tcp3000" {
  security_group_id        = aws_security_group.web_sg.id
  type                     = "egress"
  protocol                 = "tcp"
  from_port                = 3000
  to_port                  = 3000
  source_security_group_id = aws_security_group.app_sg.id
}

#app security group
resource "aws_security_group" "app_sg" {
  name        = "${var.project}-${var.environment}-app-sg"
  description = "application server role security group"
  vpc_id      = aws_vpc.vpc.id

  tags = {
    Name    = "${var.project}-${var.environment}-app-sg"
    Project = var.project
    Env     = var.environment
  }
}

resource "aws_security_group_rule" "app_in_tcp3000" {
  security_group_id        = aws_security_group.app_sg.id
  type                     = "ingress"
  protocol                 = "tcp"
  from_port                = 3000
  to_port                  = 3000
  source_security_group_id = aws_security_group.web_sg.id
}

resource "aws_security_group_rule" "app_out_http" {
  security_group_id = aws_security_group.app_sg.id
  type              = "egress"
  protocol          = "tcp"
  from_port         = 80
  to_port           = 80
  prefix_list_ids   = [data.aws_prefix_list.s3_pl.id]
}

resource "aws_security_group_rule" "app_out_https" {
  security_group_id = aws_security_group.app_sg.id
  type              = "egress"
  protocol          = "tcp"
  from_port         = 443
  to_port           = 443
  prefix_list_ids   = [data.aws_prefix_list.s3_pl.id]
}

resource "aws_security_group_rule" "app_out_tcp3306" {
  security_group_id        = aws_security_group.app_sg.id
  type                     = "egress"
  protocol                 = "tcp"
  from_port                = 3306
  to_port                  = 3306
  source_security_group_id = aws_security_group.db_sg.id
}

#Database security group
resource "aws_security_group" "db_sg" {
  name        = "${var.project}-${var.environment}-db-sg"
  description = "Database role security group"
  vpc_id      = aws_vpc.vpc.id

  tags = {
    Name    = "${var.project}-${var.environment}-db-sg"
    Project = var.project
    Env     = var.environment
  }
}

resource "aws_security_group_rule" "db_in_tcp3306" {
  security_group_id        = aws_security_group.db_sg.id
  type                     = "ingress"
  protocol                 = "tcp"
  from_port                = 3306
  to_port                  = 3306
  source_security_group_id = aws_security_group.app_sg.id
}

Discussion