🛕

Terraform Cloud に寄せようとしてみてわかったこと

2020/10/03に公開

published_at: 2020-03-20 22:32


とあるコミュニティで 問いかけがあったのを契機に Terraform Cloud を軽く使ってみました。
ちょっとではありますがわかったことを共有します。

やったこと

ド小規模ながら自分が Terraform で管理している各クラウドリソースを、Terraform Cloud のUI上で Queue plan まで通るようにする。
apply は、怖いので絶対にしないでおく。今後新規に作るリソースを Terraform Cloud で運用できそう、というのを掴むところまで。

プロセスとしては以下のような感じです

  1. サインイン(サインアップは以前やっていたみたい)
  2. Organization 作成
  3. Workspace作成
    • この過程で、VCS(自分の場合、GitLab.com と)連携設定
    • Advanced options は以下の調整
      • Terraform Working Directory
        • ローカルで terraform コマンドを実行していた時のディレクトリ相対パスを指定
        • これを指定したら、Automatic Run Triggering が自然に Only trigger runs when files in specified paths change になった
  4. Variables 設定
    • terraform.tfvars に設定していたパラメータをローカルで保持していたファイルからコピー&ペースト
  5. Settings
    • ふと気が付いて、Notifications でSlack通知を設定
  6. 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

google

  • 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点。

aws

一発ですんなり plan できたので特筆できる事項はないです。
さすがに情報が他のパブリッククラウドに比べて多いと感じました。

google

GCPのクレデンシャルをファイルで認識させていた点と、メタデータに設定する ssh_keys で利用していたヒアドキュメントの部分を変数化する点で苦戦しました。

  • Terraform Cloud では file は使えないので、クレデンシャルをどう渡せばいいのか、難儀しました。

    • type = map(object({ project_id = string .....} )) のような頑張った定義を書いたりしましたが、無駄でした。
    • 正解は、こんな感じ。
      • variables.tf
      variable "credentials" {
        type = string
        default = ""
      }
      
      こうしたうえで、terraform.tfvars にクレデンシャルの json を1行にして書くという・・・
      • さらに、 "(ダブルクオート) をエスケープしないとダメ、
      • 途中にある改行文字 \n もエスケープしないとダメ、という・・・
    • 普段使いの IntelliJ IDEA でなく、UIが日本語化されてる Visual Studio Code で折り返しの切り替えと置換を駆使してローカルで terraform plan が成功するようにできたので突破かなと判断。
    • おまけに、Terraform Cloud ではそうやって頑張って有効化した文字列だとエラーになって、クレデンシャルのjsonをそのままコピペして Variables の Value に貼り付ければいいだけだったのにはよかったけど脱力。
  • ヒアドキュメントの部分を変数化するところで少しハマりました。

    • 一発目、末尾に改行を入れてなくてシンタックスエラーを喰らい
    • 普通に string を入れるのかな?と思ってヒアドキュメントでなくしたら変化が発生
    • ハマり事例 (後述 Appendix Qiita系の2番目の記事) を見つけて参考にして末尾に改行入れたら通りました

つぎにやること

ズバリ、apply までやるリソースを検討し、実行しようと思っています。
今のところ、とある事情で Azure が第一候補ですが、どこで何やるかまだ未定。

あしあと(スクリーンショット集)

Workspace の削除方法がまだわかってない都合などでいろいろ伏せてますが(ここをクリックすると展開)
  • Workspaces
    1_workspaces.png (84.4 kB)

  • Runs
    2_workspace-Runs.png (118.6 kB)

  • Variables
    3_workspace-Variables.png (111.1 kB)

  • Settings - Version Control
    4_workspace-Settings-VersionControl.png (107.6 kB)

  • Settings - Notifications
    5_workspace-Settings-Notifications.png (75.3 kB)

  • Runs - plan - success
    6_workspace-Run-plan-success.png (109.3 kB)

  • Runs - plan - fail
    7_workspace-Run-plan-fail.png (114.4 kB)

Appendix

参照した情報たち。先人に感謝。

HashiCorp 系

Qiita 系

その他

Footnotes

脚注
  1. Azure 管理画面(何て言うんだろ...)のアクティビティログに List Storage Account Keys の操作をしたことが表示されたので、Terraform Cloud から「さわった」のだと判断。 ↩︎

  2. 深く確認していないので、Azure Storage側に書き込みができるように設定したらできるのかも。 ↩︎

  3. ヒアドキュメントをつかってたところです。 ↩︎

Discussion