はじめに
会員システムグループのkiqkiqです。
自チームではawsのインフラはTerraformで管理しています。Terraformはインフラストラクチャをコードとして管理する便利なツールですがその便利さの中にも注意すべき内容もあります。今回はリソース作成時に遭遇した、予期せぬリソースの上書きについて共有したいと思います。
遭遇した問題
自チームでは同一AWSアカウント内で複数のTerraformプロジェクトを利用しており、気付かず同じ名前のEventBridge RuleをTerraformで定義してしまいました。その状況で同一名称のEventBridge Ruleをデプロイしたとき、エラーが発生するのではなく元からあったリソースの内容を上書きするという挙動に遭遇しました。
例えば、以下のようなaws_cloudwatch_log_groupのリソースを作成した場合、同じ/example/example_logs
というロググループのリソースがあるとterraform apply
時にエラーとして出力されます。
1 2 3 4 5 |
resource "aws_cloudwatch_log_group" "example_logs" { name = "/example/example_logs" # ... その他の設定 ... } |
しかし、以下のようなaws_cloudwatch_event_ruleのリソースを作成した場合、example-rule
というEvent Ruleのリソースがすでに同アカウント内に存在しても上書きされてしまいます。
1 2 3 4 5 |
resource "aws_cloudwatch_event_rule" "example_rule" { name = "example-rule" description = "新しいルール" # ... その他の設定 ... } |
同一Terraformプロジェクト内で定義している場合は、plan実行時に Error: Duplicate resource "aws_cloudwatch_event_rule" configuration
というエラーが発生します。しかし、今回のように別プロジェクトで管理してるとterraform plan時の差分では確認できず、terraform apply
でもエラーが発生せずにデプロイできてしまいます。
予防策の例としては以下のようなものが挙げられます。
- 同一アカウント内で複数のTerraformプロジェクトを利用している場合はプロジェクト全体での命名規則を統一しプレフィックスなどで分ける
- 名前をあえて明示的に指定せず自動採番に任せる
それぞれメリットデメリットがあり、他にも方法はいくらでもあると思うので状況に応じて適切なものを取り入れてみてください。
まとめ
このようにリソース名の重複がある場合、大半のリソースはterraform apply
実行時にエラーとして出力してくれますが一部のリソースではエラーにならず既存リソースが更新される場合があります。今回の場合はTerraformプロジェクトが分かれていたということもあり、既存リソースが上書きされてしまっていることに気付くのが遅れました。特にEvent Ruleは定期実行されるまで気づけず障害になる可能性もあるため気をつけてください。
備考
関連issue: https://github.com/hashicorp/terraform-provider-aws/issues/25598