💭
yamlで作ったIPリストをAWSのSGに適用してみる
はじめに
TFとそのほかのIaCツールで許可するIPアドレスのリストを共有したかったので、yamlならTF側もいい感じにできるのでは?と思い試してみました。
サンプルコードは以下のリポジトリに格納しています。
サクッと適用してみる
まずは簡単なリストを用意して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に入っていることが確認できます。
Discussion