💭

yamlで作ったIPリストをAWSのSGに適用してみる

2022/04/17に公開

はじめに

TFとそのほかのIaCツールで許可するIPアドレスのリストを共有したかったので、yamlならTF側もいい感じにできるのでは?と思い試してみました。
サンプルコードは以下のリポジトリに格納しています。
https://github.com/guranytou/tf-yaml-sandbox

サクッと適用してみる

まずは簡単なリストを用意してSGルールに適用してみます。

list1.yml
- 192.168.0.1/32
- 192.168.0.2/32
- 192.168.0.3/32
main.tf
resource "aws_security_group_rule" "ingress_example1" {
  type              = "ingress"
  from_port         = 80
  to_port           = 80
  protocol          = "tcp"
  cidr_blocks       = yamldecode(file("list1.yml"))
  security_group_id = aws_security_group.example1.id
}

plan結果を確認すると、リストの通りにingressルールが作成できたことがわかります。

  # aws_security_group_rule.ingress_example1 will be created
  + resource "aws_security_group_rule" "ingress_example1" {
      + cidr_blocks              = [
          + "192.168.0.1/32",
          + "192.168.0.2/32",
          + "192.168.0.3/32",
        ]
      + from_port                = 80
      + id                       = (known after apply)
      + protocol                 = "tcp"
      + security_group_id        = (known after apply)
      + self                     = false
      + source_security_group_id = (known after apply)
      + to_port                  = 80
      + type                     = "ingress"
    }

実用できるリストとSGルールを作ってみる

実際に運用で使う場合、「このIPアドレスはこの場所のもの」という説明を付記したくなると思います。
そこでリストを以下のように用意し、TFでSGルールに適用してみます。

list2.yml
IP-Adress-list-A:
  - 192.168.0.1/32
  - 192.168.0.2/32
  - 192.168.0.3/32

IP-Adress-list-B:
  - 10.0.0.0/24
  - 10.0.1.0/24
main.tf
resource "aws_security_group_rule" "ingress_example2" {
  for_each          = yamldecode(file("list2.yml"))
  type              = "ingress"
  from_port         = 80
  to_port           = 80
  protocol          = "tcp"
  cidr_blocks       = each.value
  description       = each.key
  security_group_id = aws_security_group.example2.id
}

plan結果を確認すると、意図した通りにkey毎にルールが作成できていることがわかります。

  # aws_security_group_rule.ingress_example2["IP-Adress-list-A"] will be created
  + resource "aws_security_group_rule" "ingress_example2" {
      + cidr_blocks              = [
          + "192.168.0.1/32",
          + "192.168.0.2/32",
          + "192.168.0.3/32",
        ]
      + description              = "IP-Adress-list-A"
      + from_port                = 80
      + id                       = (known after apply)
      + protocol                 = "tcp"
      + security_group_id        = (known after apply)
      + self                     = false
      + source_security_group_id = (known after apply)
      + to_port                  = 80
      + type                     = "ingress"
    }

  # aws_security_group_rule.ingress_example2["IP-Adress-list-B"] will be created
  + resource "aws_security_group_rule" "ingress_example2" {
      + cidr_blocks              = [
          + "10.0.0.0/24",
          + "10.0.1.0/24",
        ]
      + description              = "IP-Adress-list-B"
      + from_port                = 80
      + id                       = (known after apply)
      + protocol                 = "tcp"
      + security_group_id        = (known after apply)
      + self                     = false
      + source_security_group_id = (known after apply)
      + to_port                  = 80
      + type                     = "ingress"
    }

ちなみにTF applyを行い、実物でも確認してみました。意図した通り、keyで設定した内容がdescriptionに入っていることが確認できます。
TFapply結果

Discussion