エンタープライズ環境の制約とTerraformの連携でやってみたこと
はじめに
ume(梅)です。
今回はエンタープライズな環境でTerraformを用いてIaCで構築作業を行なった際に直面した課題とその解決策についてお届けします。
前提条件
いきなりエンタープライズな環境と言われても。。。ってみなさん思いますよね?
いろいろな観点でエンタープライズって言えると思いますが、今回着目するのはAWSリソースのタグがIaC外で付与されることになります。
あるあるってなった方もいらっしゃいませんか?
社内の申請フローで作ったEC2インスタンスのタグにXXX_SYSTEMとかXXX_OWNERとかが付くそういうモノです。
申請フローで払い出されたAWSアカウントでIaCを使用して構築したリソースにも同様のタグが構築後しばらくしたら結果整合的に付与されるシステム上で今回私は構築を行いました。
具体的な付与方法はAWS Config等を使用して自動付与しているのだろうと思われますが、今回は議論対象外とします。
課題
自動で付与されるタグで具体的に問題となったのは、terraform-plan
でソースと現状の差異確認してレビューした時でした。
それなりにリソースが作られて来た上でコンソールに出力された差異はAWSアカウント上の全てのリソースにあると告げていました。
その数7,000行越え、必要な差異のみであることを確認するのにかなりの時間を要してしまい、対応策をすぐさま考えねばと決意しました。
解決策1: リソースのtagsブロック
7,000行の差異がほぼタグに終始しているのであればと最初に考えたのが、全てのリソースのタグに自動で付与されるタグを手動で記述することです。
が、以下の問題が発生すると判断して別の策を講じる事としました
- 明確なタグ付けルールが我々の管理外にある
- リソースによって付与されるタグが異なる
- タグの設定値がどこかで変わる可能性がある
- タグ付けの記述だけでtfファイルの大部分を占める
- 記述に時間がかかる
- 今後の保守の手間がかかりすぎる
解決策2: lifecycleブロックのignore_changesブロック
次に検討したのがTerraformのlifecycleブロック内のignore_changesブロックの利用でした。
社内事例も確認の上、記述に工夫は必要ですが挙動自体は問題ないという確認が取れました。
が、以下の問題が発生すると判断して別の策を講じる事としました。
- タグ付けの記述だけでtfファイルの大部分を占める
- ignore_changesブロック内で動的な記述が出来ないため共通化が出来ない
- タグ記述と同程度の手間がかかる
解決策3(真打): AWSプロバイダーのignore_tagsブロック
流石に現実的ではないと考えて改めてTerraformのドキュメントを調べていて発見したのが、ignore_tagsブロックです。
ドキュメントを読み、Terraformの外で自動的に付与されるタグへの対応と紹介されており、発見した時まさにこれだ!と喝采をあげました。
記述的には以下の要領になります。
provider "aws" {
...略
ignore_tags {
keys = [
"X_FOO",
"X_BAR",
"HOGE",
]
}
...略
}
keysに無視するタグのキーを配列で指定することで該当のタグをterraform-plan
の差異確認から除外させることができます。
ちなみに、X_
のように自動付与タグの接頭辞が固定されている場合は以下の記述も使用できます。
provider "aws" {
...略
ignore_tags {
key_prefixes = ["X_"]
}
...略
}
最後に
月並みですが改めて困った時に立ち返るべきは公式のドキュメントor公式のソースだなと感じました。
また、課題に関してもエンジニアとしての悩みは洋の東西を問わないものなようです。
ignore_tagsの紹介が本稿執筆時点で日本語でされていないようだったのでどこかのタイミングで同じ悩みを持ったエンジニアの一助になれば幸いです。