Terraform Cloud に寄せようとしてみてわかったこと
published_at: 2020-03-20 22:32
とあるコミュニティで 問いかけがあったのを契機に Terraform Cloud を軽く使ってみました。
ちょっとではありますがわかったことを共有します。
やったこと
ド小規模ながら自分が Terraform で管理している各クラウドリソースを、Terraform Cloud のUI上で Queue plan
まで通るようにする。
apply は、怖いので絶対にしないでおく。今後新規に作るリソースを Terraform Cloud で運用できそう、というのを掴むところまで。
プロセスとしては以下のような感じです
- サインイン(サインアップは以前やっていたみたい)
- Organization 作成
- Workspace作成
- この過程で、VCS(自分の場合、GitLab.com と)連携設定
- Advanced options は以下の調整
-
Terraform Working Directory
- ローカルで terraform コマンドを実行していた時のディレクトリ相対パスを指定
- これを指定したら、
Automatic Run Triggering
が自然にOnly trigger runs when files in specified paths change
になった
-
- Variables 設定
- terraform.tfvars に設定していたパラメータをローカルで保持していたファイルからコピー&ペースト
- Settings
- ふと気が付いて、
Notifications
でSlack通知を設定
- ふと気が付いて、
- Queue plan してみる
- Errorが出たらコードを調整・Variables を見直すなどしてリトライ
plan までできたリソース(provider)
azurerm
- provider : version 2.1 , backend (Azure Storage) [1]
- azurerm_resource_group
- azurerm_dns_zone , azurerm_dns_txt_record , azurerm_dns_mx_record
aws
- provider : version 2.54 , backend (s3)
- aws_route53_record
- provider : version 3.4 , backend (gcs)
- google_dns_managed_zone , google_dns_record_set
- google_compute_network , google_compute_subnetwork
- google_compute_firewall
- google_compute_project_metadata_item [2] , google_compute_instance
わかったこと
主要であろう3パブリッククラウドで Terraform の SaaS に寄せることができるであろうというのがだいたいわかりました。
tfvars の共有方法の1つとしてアリではないかと思いました。無料枠には人数の上限ありますが。
azurerm
リソースも少なかったし、すんなり plan 成功した。気づいたのは2点。
- 設定次第なのかもしれないが、 Terraform Cloud から実行したときは Terraform Cloud に State が保持されそう [3]
-
use_msi = true
にして backend の設定を provider ブロックに書いてみたら plan が失敗した。どういうこと?(ドキュメントが更新されてない?)
aws
一発ですんなり plan できたので特筆できる事項はないです。
さすがに情報が他のパブリッククラウドに比べて多いと感じました。
GCPのクレデンシャルをファイルで認識させていた点と、メタデータに設定する ssh_keys で利用していたヒアドキュメントの部分を変数化する点で苦戦しました。
-
Terraform Cloud では file は使えないので、クレデンシャルをどう渡せばいいのか、難儀しました。
-
type = map(object({ project_id = string .....} ))
のような頑張った定義を書いたりしましたが、無駄でした。 - 正解は、こんな感じ。
variables.tf
こうしたうえで、terraform.tfvars にクレデンシャルの json を1行にして書くという・・・variable "credentials" { type = string default = "" }
- さらに、
"(ダブルクオート)
をエスケープしないとダメ、 - 途中にある改行文字
\n
もエスケープしないとダメ、という・・・
- 普段使いの IntelliJ IDEA でなく、UIが日本語化されてる Visual Studio Code で折り返しの切り替えと置換を駆使してローカルで terraform plan が成功するようにできたので突破かなと判断。
- おまけに、Terraform Cloud ではそうやって頑張って有効化した文字列だとエラーになって、クレデンシャルのjsonをそのままコピペして Variables の Value に貼り付ければいいだけだったのにはよかったけど脱力。
-
-
ヒアドキュメントの部分を変数化するところで少しハマりました。
- 一発目、末尾に改行を入れてなくてシンタックスエラーを喰らい
- 普通に string を入れるのかな?と思ってヒアドキュメントでなくしたら変化が発生
- ハマり事例 (後述 Appendix Qiita系の2番目の記事) を見つけて参考にして末尾に改行入れたら通りました
つぎにやること
ズバリ、apply までやるリソースを検討し、実行しようと思っています。
今のところ、とある事情で Azure が第一候補ですが、どこで何やるかまだ未定。
あしあと(スクリーンショット集)
Workspace の削除方法がまだわかってない都合などでいろいろ伏せてますが(ここをクリックすると展開)
-
Workspaces
-
Runs
-
Variables
-
Settings - Version Control
-
Settings - Notifications
-
Runs - plan - success
-
Runs - plan - fail
Appendix
参照した情報たち。先人に感謝。
HashiCorp 系
- GitLab.com - VCS Providers - Terraform Cloud - Terraform by HashiCorp
-
Remote State Storage | Terraform - HashiCorp Learn
- HashiCorp Learn を初めて発見
Qiita 系
- 既存の GCP リソースを Terrafom Cloud で管理する - Qiita (terraformer で既存の GCP リソースをインポート のところ)
- terraform tfvarsでヒアドキュメントを使用した時にハマったこと - Qiita
その他
- 5人まで無料! Terraform Cloudを使ってみた | Developers.IO
-
Terraform Cloud は AWS の credentials を持たせずに tfstate だけ管理することができる | Developers.IO
- Developers.IO からの推薦
-
Organising Variables in Terraform - Just Tech - Medium
- 結局使わなかったが、
terraform.tfvars.json
の書き方のヒントをもらったと思う
- 結局使わなかったが、
-
terraform 0.12でのtfvarsの扱い|vshimoda
- variable の欠損を避けるには merge がよいみたい
-
GitHub ActionsでTerraformを実行する時にTerraform Cloudをバックエンドに指定する - febc技術メモ
- GitHub Actions からも利用できそうですね
Discussion