Pocket

さて、最近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エラーが発生します。今回はこの対処方法をブログします。


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

どちらかに統一とのことなのでfugaの方をaws_security_group_ruleに全て統一しました。egressはそのままで問題ありません。ポイントとしては統一しないと以下のように terraform plan terraform apply を実行後にもとに戻り、永遠と差分が出てしまう状況になります。

  • 統一しない場合


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化は大変だしシビアですね。。正直やりたくないのが本音。やらないといつまでも手動管理で杜撰になってしまうので、やりきります。めちゃくちゃハマったので参考にしてみてください。複雑なセキュリティーグループは大変だ!

Pocket

カテゴリー: AWSTerraform

adachin

1989年生まれのSRE。 ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。好きなツールはAnsible,Terraform,CircleCIで、ECS/Fargateでのインフラ構築を得意とする。副業では数社サーバー保守とベンチャー企業のインフラ改善やMENTAで未経験者にインフラのコーチングを実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、緊急対応、インフラコード化、リファクタリング、セキュリティ強化、新技術の検証、Docker開発環境の提供、AWSでのインフラ構築、ECS/Fargateへ移行、CakePHP4での管理画面作成、メンター、分析基盤の運用を担当している。個人開発では「夫婦、パートナー向け家事管理サービス/famii」をCakePHP4で絶賛開発中。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください