この記事は
株式会社 RetailAI X Advent Calendar 2022 の 3 日目の記事です。
Terraform + Config Controller を使って IaC を運用する話です。
ご存じの通り、Terraform は、環境構築の再現性という意味で、とても役立ちます。
一方で、tfstate
を維持・管理していくのはとても手間がかかります。
運用を楽にしたい!
という願望からたどり着いた現在地について書いていきます。
なぜ Terraform がつらいのか🌶?
一番の辛みは、誰かが GUI で変更した場合、回収する(tfstate
を同期させる)必要があるということです。
正しく回収しないと、、、conflict が発生し、最悪、Resource が削除される可能性があります。
そして、誰もが .tf
を編集・適用できるわけではないため、GUI での変更は許容する必要があります。
これまでの運用の流れ
mission critical なシステムの場合、terraform apply
なんて気軽にできません。
それでいて、復元は一刻を争います。
難易度が高杉です。
そこで、ぼくは、Config Connector について再考しました。
実は、Config Connector が発表された当時は、
「IaC のために、Cluster が必要なのかー、、Terraform で十分かな 🤔」
と思っていました。
なぜ Config Connector か 🙌?
tfstate
ファイルの維持から解放されます。そして、plan / apply のループから解放されます。
- Config Connector は、状態を宣言します。Status ファイルは、存在しません。
- k8s の知識を活用できます。
Config Connector では、k8s の namespace を Project や Folder として扱います。
Multi Project を管理する場合は、Project が namespace として並びます。
Project と GKE の位置関係が逆転しているような。個人的に面白いと思う構成です。
Config Connector の流れ
- Config Connector を有効にして Cluster を作成する。
kubectl get ConfigConnectorContext -n config-control
- Manifest を作成する。
vi tokyo-bucket.yaml
apiVersion: storage.cnrm.cloud.google.com/v1beta1 kind: StorageBucket metadata: annotations: cnrm.cloud.google.com/force-destroy: "false" name: sanbox-danny namespace: config-control spec: location: asia-northeast1
- Apply する。
kubectl apply -f tokyo-bucket.yaml
とても単純です。
また、Project 全体の状態を意識する必要がありません。
追加する Resource に集中できます。
また、これまで目をつぶってきた以下の課題を解決してくれます。
その課題は、Terraform Cloud の管理です。
- Terraform Cloud( Free )の課題
- User 数の制限
- セキュリティ(認証)
- Concurrency の制限
Config Connector にすることで、Terraform Cloud は不要になります。
Terraform Cloud は、2019 年に Goole Cloud と Azure の Multi Cloud を検討したことをきっかけに利用開始しました。当時は、PoC と言う位置付けで、そのまま現在に至ります。
Config Connector の事例はある?
メルカリさんで事例が公開されています。
こちらは、おそらく、Managed ではありません。
終わりに
現在、Terraform への注目度は非常に高いです。
GitHub が発表した、この 1 年の GitHub の利用動向などをまとめた年次レポート「Octoverse 2022」をみるとわかる通り。
急増したプログラミング言語のトップは、Terraform などで使われる HCL だったそうです。
一方で、ぼくのような辛さを感じている人も少なくないと思います。
共感していただける人、別の解決方法を共有していただける人がいましたら、コメントいただけると嬉しいです。
明日 4 日目の記事は @wu_manning さんの「next.js初心者入門記事」です。お楽しみに!