repl.info

Terraformで不要になったmoved/import/removedブロックを楽に削除する

Terraformのmovedブロックやimportブロック、removedブロックは便利です。しかし、applyした後に削除するのが面倒です。面倒といっても何か制約がある訳ではなく、単に削除するPRを出すのが面倒という話です。そこまで頻繁にこれらのブロックを使うわけではないのですが、削除を楽にするために https://github.com/takaishi/tfclean というツールを作りました。

例えば、以下のようなtfファイルがあるとします。aws_security_groupリソースが1つと、movedブロックとimportブロック、removedブロックがあるファイルです。

resource "aws_security_group" "example" {
  name        = "example-security-group"
  description = "Example security group"
#   vpc_id      = "vpc-e5e1f180"
  // アウトバウンドルール
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "example-security-group"
  }
}

# removed

removed {
  from = aws_security_group.example
  lifecycle {
    destroy = false
  }
}

# import

import {
  id = "resource_id"
  to = module.foo.hoge
}

# moved

moved {
  from = module.foo.hoge
  to   = module.foo.piyo
}

この時、以下のコマンドでtdcleanを実行すると、moved/import/removedブロックを消してくれます。

./dist/tfclean ./dir/of/tffiles

実行後のtfファイルはこのように書き換わっています。

resource "aws_security_group" "example" {
  name        = "example-security-group"
  description = "Example security group"
#   vpc_id      = "vpc-e5e1f180"
  // アウトバウンドルール
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "example-security-group"
  }
}

# removed


# import


# moved

このようにこれまで手で消していたブロックを自動的に消してくれてとても便利です。さらに楽をするために、GitHub Actions Workflowで動かして、apply後にブロックを削除し、Pull Requestの作成まで自動化しました。これにより、自分が行う作業としてはブロック削除の差分とplan結果をチェック、Pull RequestのApprove・Mergeだけになり、コードの操作を行う必要がなくなりました。GitHub Action Workflowのサンプルはリポジトリ(https://github.com/takaishi/tfclean)に記載していますので参考にしてみてください。

ちなみに、tfcleanはtfstateファイルを参照してapply済みのもののみ削除することも可能です。こちらの方がより確実ですが、apply後に実行することがほとんどだと思うのであまり意味がない気もしています。

% AWS_PROFILE=xxxxxxx tfclean --tfstate s3://path/to/tfstate /path/to/tffiles

機能的には大体揃っていますが、importブロックにfor_eachがある場合うまく動かないかもしれません。いちいち手で消すのが面倒だ、という人は是非試してもらえるとうれしいです。