tflinkはTerraformモジュールディレクトリ内のファイルに対するシンボリックを作成するbashスクリプトです。tflinkの基本動作は以下の通りです。
- 指定されたTerraformモジュールディレクトリの存在確認をします。なかった場合、スクリプトは失敗します。
- カレントディレクトリ名(または指定したモジュール名)と同じモジュールがTerraformモジュールディレクトリ下にあるか確認します。なかった場合、スクリプトは失敗します。
- カレントディレクトリ内のシンボリックリンクをすべて削除します。これは冪等性のためです。
- カレントディレクトリ内のシンボリックリンク以外のファイルをすべてそのままです。
- カレントディレクトリに対象モジュールディレクトリ下のファイルに対するシンボリックリンクを作成します。
たとえば以下のようなディレクトリ構造の場合、environments/dev/vpc下でtflinkを実行するとmodules/vpc下のファイルに対するシンボリックリンクを作成します。
.
├── environments
│ └── dev
│ └── vpc # モジュール名とあわせる
│ ├── terraform.tfvars
│ ├── variables.tf -> ../../../modules/vpc/variables.tf # tflinkでシンボリックリンクを作成
│ ├── verions.tf
│ ├── vpc.tf -> ../../../modules/vpc/vpc.tf # tflinkでシンボリックリンクを作成
│ └── vpc_override.tf # _override.tfでモジュールの内容をオーバーライド
└── modules # Terraformモジュールディレクトリ
└── vpc # モジュール
├── variables.tf
└── vpc.tfTerraformで複数環境をデプロイするにはmoduleをよく使います。多くの場合moduleで十分ですがたまに困ることもあります。たとえば、開発環境と本番環境で微妙に構成を変えたい時です。moduleでこれをするには三項演算子を使って分岐させれば良いですが、その分コードが煩雑になってしまいます。煩雑さを防ぐにはmoduleのコードをオーバーライドすれば良いです。しかし、Terraformにはオーバーライドの仕組みもありますが、これはmoduleに対して機能しません。Terraformのオーバーライドは同じディレクトリ内のファイルしか上書きしないからです。
そこで、moduleのようにコードを共有しつつオーバーライドも可能にする方法を考えました。moduleのコードをシンボリックリンクで参照し、オーバーライドすれば良いです。しかし、この方法だと大量にシンボリックを作成する手間がかかります。また、相対パスのシンボリックリンクはディレクトリの位置を気にする必要がありさらに大変です。
そこで相対パスのシンボリックリンクを楽に作成するコマンドを作成しました。
tflinkファイルをPATHの通るディレクトリ配下に配置してください。また、実行権限もつけてください。たとえば以下の通りです。
chmod +x tflink
cp tflink /usr/local/bin/tflinkはTerraformモジュールディレクトリのパスを.tflinkファイルから読み込みます。-sオプションをつけてTerraformモジュールディレクトリを絶対パスで設定してください。ホームディレクトリ配下に.tflinkファイルが作成されます。
$ tflink -s /tflink/example/modules
$ cat ~/.tflink
/tflink/example/modulestflinkはTerraformモジュールディレクトリ下のディレクトリ名と同じディレクトリ名で実行されることを想定しています。オプションなしでコマンドを実行すればシンボリックリンクが作成されます。
$ tflinkカレントディレクトリ名と対象モジュールディレクトリの名前が違う場合、-mオプションで対象モジュールディレクトリ名を指定してください。
$ tflink -m vpc