セキュリティグループのterraform importがキツ過ぎる。
— adachin👾SRE (@adachin0817) January 17, 2022
さて、最近Terraform職人なわけですが、セキュリティーグループをterraform importして、差分を修正していたところ以下のようなエラーに遭遇しました。
$ terraform plan
│ Error: Cycle: aws_security_group.hoge, aws_security_group.fuga
このエラーは2つのaws_security_groupのingressやegressのsecurity_groups idが参照しあっていると、Cycleエラーが発生します。今回はこの対処方法をブログします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
resource "aws_security_group" "hoge" { name = "hoge" description = "hoge" vpc_id = aws_vpc.hoge_vpc.id ingress { description = "" from_port = 1234 to_port = 1234 protocol = "tcp" security_groups = [aws_security_group.fuga.id] } ~省略~ resource "aws_security_group" "fuga" { name = "fuga" description = "fuga" vpc_id = aws_vpc.hoge_vpc.id ingress { description = "" from_port = 1234 to_port = 1234 protocol = "tcp" security_groups = [aws_security_group.fuga.id] } |
Resource: aws_security_group
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group
At this time you cannot use a Security Group with in-line rules in conjunction with any Security Group Rule resources. Doing so will cause a conflict of rule settings and will overwrite rules.
現時点ではセキュリティグループルールリソースと組み合わせてインラインルールでセキュリティーグループを使用することはできません。これを行うと、ルール設定の競合が発生し、ルールが上書きされます。
なのでaws_security_group内かaws_security_group_ruleかどちらかに統一すれば良いというわけですね。なのでterraform import時というよりも、上記な状況で新規に追加しても起こり得るということになります。
対処方法
- security-group.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
resource "aws_security_group" "fuga" { name = "fuga" description = "fuga" vpc_id = aws_vpc.hoge_vpc.id egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "fuga" } } resource "aws_security_group_rule" "fuga_1234" { security_group_id = aws_security_group.fuga.id type = "ingress" from_port = 1234 to_port = 1234 protocol = "tcp" source_security_group_id = aws_security_group.fuga.id } |
どちらかに統一とのことなのでfugaの方をaws_security_group_ruleに全て統一しました。egressはそのままで問題ありません。ポイントとしては統一しないと以下のように terraform plan
terraform apply
を実行後にもとに戻り、永遠と差分が出てしまう状況になります。
- 統一しない場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# aws_security_group.hoge will be updated in-place ~ resource "aws_security_group" "hoge" { id = "sg-xxxxxx" ~ ingress = [ - { - cidr_blocks = [] - description = "" - from_port = 1234 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - protocol = "tcp" - security_groups = [ - "xxxxxxx/sg-xxxxxx", - "sg-xxxxxxx", - "sg-xxxxxxx", ] - self = false - to_port = 1234 }, # (10 unchanged elements hidden) ] name = "hoge" tags = { "Name" = "hoge" } # (7 unchanged attributes hidden) # (1 unchanged block hidden) } Plan: 0 to add, 1 to change, 0 to destroy. |
terraform import時で気をつけること
既にfugaのセキュリティーグループをaws_security_groupでterraform importしてしまった場合は一度手動で削除して terraform apply
しないと以下のようにエラーが出てしまうので、適用ができません。本番環境ではこうならないようにCycleエラーが発生してしまったらaws_security_group_ruleでterraform importするしかないですね。ですが、確認するのがツラ過ぎなのでメンテするしかないかな。
Error: [WARN] A duplicate Security Group rule was found on (sg-xxxxx). This may be
│ a side effect of a now-fixed Terraform issue causing two security groups with
│ identical attributes but different source_security_group_ids to overwrite each
│ other in the state. See https://github.com/hashicorp/terraform/pull/2376 for more
│ information and instructions for recovery. Error: InvalidPermission.Duplicate: the specified rule “peer: sg-xxxx, TCP, from port: 1234, to port: 1234, ALLOW” already exists
│ status code: 400, request id: 0xxxxxxxxxxxxxxxxxx
│
│ with aws_security_group_rule.fuga_1234,
│ on security-group.tf line 278, in resource “aws_security_group_rule” “fuga_1234”:
│ 278: resource “aws_security_group_rule” “fuga_1234” {
まとめ
しかしセキュリティーグループのimport化は大変だしシビアですね。。正直やりたくないのが本音。やらないといつまでも手動管理で杜撰になってしまうので、やりきります。めちゃくちゃハマったので参考にしてみてください。複雑なセキュリティーグループは大変だ!
0件のコメント