Terraform で Resorces や Modules を使用して、セキュリティグループを作成してみる

記事タイトルとURLをコピーする

技術課の山本です。こんにちは。
機会があったので触りました。

Terraform で Resorces や Modules を使用して、セキュリティグループを作成してみる

Resources とは

Resources Overview - Configuration Language | Terraform | HashiCorp Developer

Resources are the most important element in the Terraform language. Each resource block describes one or more infrastructure objects, such as virtual networks, compute instances, or higher-level components such as DNS records.

Resources を使用すると、VPC や セキュリティグループといったインフラのリソースを作成できます。

Modules とは

Modules Overview - Configuration Language | Terraform | HashiCorp Developer

Modules are containers for multiple resources that are used together.

Module を使用すると、複数のリソース (Resources) ををまとめて作成できます。

セキュリティグループを Resources (resource ブロック)を利用して作成する

resource ブロックを利用して、front 用、rds 用 の 2 つのセキュリティグループを作成しています。
resource ブロックは以下の 2 つがあります。

securitygroup.tf

# front 用のセキュリティグループを作成
resource "aws_security_group" "front" {
  name     = "front-sg1"
  vpc_id   = module.vpc.vpc_id
  tags = {
    Name = "front-sg1"
  }
}

# front 用のセキュリティグループのインバウンドルール (80 ポート)を作成
resource "aws_vpc_security_group_ingress_rule" "front1" {
  from_port         = 80
  to_port           = 80
  ip_protocol       = "tcp"
  security_group_id = aws_security_group.front.id
  cidr_ipv4         = "0.0.0.0/0"
}

# front 用のセキュリティグループのインバウンドルール (443 ポート)を作成
resource "aws_vpc_security_group_ingress_rule" "front2" {
  from_port         = 443
  to_port           = 443
  ip_protocol       = "tcp"
  security_group_id = aws_security_group.front.id
  cidr_ipv4         = "0.0.0.0/0"
}

# rds 用のセキュリティグループを作成
resource "aws_security_group" "rds" {
  name     = "rds-sg1"
  vpc_id   = module.vpc.vpc_id
  tags = {
    Name = "rds-sg1"
  }
}

# rds 用のセキュリティグループのインバウンドルール (5432 ポート)を作成
resource "aws_vpc_security_group_ingress_rule" "rds1" {
  from_port         = 5432
  to_port           = 5432
  ip_protocol       = "tcp"
  security_group_id = aws_security_group.rds.id
  cidr_ipv4         = "10.0.0.0/16"
}

Resources (resource ブロック)を利用して作成したセキュリティグループ

front のセキュリティグループは以下のようになりました。省略したセキュリティグループの説明は「Managed by Terraform」となっていました。

アウトバウンドルールは作成していないのでありません。

rds 用のセキュリティグループも同様でした。

セキュリティグループを Modules (module ブロック) を利用して作成する

terraform-aws-modules にある security-group の module を利用して front 用、rds 用 の 2 つのセキュリティグループを作成しています。
Module は自分で作成してもいいです。本記事ではコミュニティが提供しているものを利用します。
ソースコードは右のリンクにあります。GitHub - terraform-aws-modules/terraform-aws-security-group: Terraform module which creates EC2-VPC security groups on AWS 🇺🇦

securitygroup.tf

# front 用のセキュリティグループを作成
module "front-security_group" {
  source = "terraform-aws-modules/security-group/aws"

  name        = "front-sg1"
  #description = "front-sg1"
  vpc_id      = module.vpc.vpc_id

  ingress_cidr_blocks      = ["0.0.0.0/0"]
  ingress_rules            = ["http-80-tcp","https-443-tcp"]
}
# rds 用のセキュリティグループを作成
module "rds-security_group" {
  source = "terraform-aws-modules/security-group/aws"

  name        = "rds-sg1"
  #description = "rds-sg1"
  vpc_id      = module.vpc.vpc_id

  ingress_with_cidr_blocks = [
    {
      rule        = "postgresql-tcp"
      cidr_blocks = "10.0.0.0/16"
    },
  ]
}

補足

auto_groups には、よく使うルールがエイリアスで定義されているため、例えば 0.0.0.0/0 から http (80) 通信を許可する場合は以下の記述をします。

ingress_cidr_blocks      = ["0.0.0.0/0"]  
ingress_rules            = ["http-80-tcp"]    

また、送信元が同じ CIDR ブロックの場合、リスト形式で記述可能です。 0.0.0.0/0 に http (80) , https (443) を許可する例です。

ingress_cidr_blocks      = ["0.0.0.0/0"]  
ingress_rules            = ["http-80-tcp","https-443-tcp"]  

auto_groups に定義していないポートについてはユーザー定義として記述可能です。 AWS EC2-VPC Security Group Terraform module にある例から抜粋します。

  ingress_with_cidr_blocks = [
    {
      from_port   = 8080
      to_port     = 8090
      protocol    = "tcp"
      description = "User-service ports"
      cidr_blocks = "10.10.0.0/16"
    },

Modules (module ブロック) を利用して作成したセキュリティグループ

front のセキュリティグループは以下のようになりました。省略したセキュリティグループの説明は「Security Group managed by Terraform」となっていました。
セキュリティグループ名の後ろに日付時刻の文字列が入っていました。
省略したインバウンドのルールの説明には HTTP , HTTPS と入っています。

アウトバウンドルールは作成していないのでありません。

rds 用のセキュリティグループも同様でした。省略したインバウンドのルールの説明には Ingress Rule と入っています。

まとめ

Resource を利用して記述する場合は、セキュリティグループとルールのそれぞれを resource ブロックで定義し、対応付けをする必要があります。
Modules を利用して記述する場合は、セキュリティグループ 1 つに対し module を 1 つ作成する形式になります。そのため、コード量が少なくなり 1 つのセキュリティグループにどのようなルールがあるか分かりやすいと感じました。
コードを直感的に理解できる記述 (メンタルモデルがある状態 ) になっており、良いなと感じました。
コミュニティの提供している Module を使用するときは将来性だったり、仕様面 (名前に識別子が自動付与されるなど)に注意すると良さそうです。

余談

朝晩寒くなってきました。
お身体にお気をつけてお過ごし下さい。🐱

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)