ふり返る暇なんて無いね

日々のメモ書きをつらつらと。メインブログに書くほどでもないことを流してます

豆: セキュリティグループに複数のCIDRブロックを指定したいときはマネージドプリフィクスリストを使うといい。

タイトルオンリーです。

GItHub HooksのCIDRから来たhttpsアクセスのみ許可するセキュリティグループを考えます。

マネージドプリフィクス使わない例。CIDRブロックの数だけ、ingress ruleをfor_eachで回して作成する形になります。

locals {
  # https://api.github.com/meta
  github_webhook_cidr = [
    "192.30.252.0/22",
    "185.199.108.0/22",
    "140.82.112.0/20",
    "143.55.64.0/20",
  ]
}

resource "aws_security_group" "main" {
  name   = "no prefix list"
  vpc_id = var.vpc_id
}

resource "aws_vpc_security_group_ingress_rule" "main" {
  for_each = toset(local.github_webhook_cidr)

  security_group_id = aws_security_group.main.id
  ip_protocol       = "tcp"
  from_port         = 443
  to_port           = 443
  cidr_ipv4         = each.value
}

マネージドプリフィクス使う例。マネージドプリフィクスを指定したingress rule1つだけ作成される形になります。

locals {
  # https://api.github.com/meta
  github_webhook_cidr = [
    "192.30.252.0/22",
    "185.199.108.0/22",
    "140.82.112.0/20",
    "143.55.64.0/20",
  ]
}
resource "aws_ec2_managed_prefix_list" "main" {
  name           = "GitHub Hooks"
  address_family = "IPv4"
  max_entries    = length(local.github_webhook_cidr)

  dynamic "entry" {
    for_each = local.github_webhook_cidr
    content {
      cidr = entry.value
    }
  }
}


resource "aws_security_group" "main" {
  name   = "prefix list"
  vpc_id = var.vpc_id
}

resource "aws_vpc_security_group_ingress_rule" "main" {
  security_group_id = aws_security_group.main.id
  ip_protocol       = "tcp"
  from_port         = 443
  to_port           = 443
  prefix_list_id    = aws_ec2_managed_prefix_list.main.id
}

何が嬉しいかというと、CIDRの変更する際に aws_ec2_managed_prefix_list.main のリソースの変更だけで済むということです。ingress ruleに直接CIDRを指定してる場合だと、それぞれのルールの作成削除が行われて、変更差分が見にくくなります。