tahoku80のブログ

常体と敬体が入り混じるソフトウェアデベロッパーブログ

Terraform Cloud(Free Plan)でできること

はじめに

Terraform Cloudでできることが分かりづらい。触り始めえればすぐにわかるのだが、簡単に概要を紹介しておく。

結論

Terraform Cloud(Free Plan)では主に下記のようなことができる。

  1. マネージドな環境へのtfstateファイルの保存
  2. 保存したtfstateファイルのバージョン管理
  3. マネージドな環境でのTerraform実行(plan/apply/destroy)
    1. API・ブラウザ操作・OSS版TerraformのCLIからTerraform Cloudをリモートの実行環境として利用可能
    2. アクセスキー等の機微な情報の保存・実行時の利用
  4. Terraform実行のワークフロー構築
    1. GitHub等のVCSと連携したワークフロー構築

補足

Free PlanとPaid Planの機能比較はこのページが見やすい。

Terraform | HashiCorp | 取扱製品 | ネットワールド

公式情報の中だとこちらで概要がわかる。

HashiCorp Terraform: Enterprise Pricing, Packages & Features

tfstateの保存場所のみ手で作っていると環境が散らかりがちになるので、個人で作業する分にも意外と便利。ただしS3等にtfstateを保存している場合に比べて実行は遅め。

補足

そのうち網羅的に整理して再度まとめたい。

Terraformでtemplatefileを利用してcustom_dataにbase64encodeしたcloud-configファイルを渡す

はじめに

紹介するコードで実現できることはタイトルの通り。

templatefileとbase64encodeを併用しているサンプルがあまり見当たらなかったので、自分が書いたものを載せておく。

結論

コードのサンプルは以下。関連する箇所のみ抜粋してある。[...]は中略箇所を表す。

main.tf

resource "azurerm_linux_virtual_machine" "mylinuxvm" {
  custom_data = base64encode(templatefile("./files/cloud-config.cfg", { computer_name = local.computer_name }))

  [...]

}

locals.tf

locals {
  computer_name  = "mycomputername"
}

files/cloud-config.cfg

#cloud-config
runcmd:
 - hostnamectl set-hostname ${computer_name}

provider.tf

terraform {
  required_version = "~> 1.1.6"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.97.0"
    }
  }
}

  backend "azurerm" {
  [...]
  }

provider "azurerm" {
  features {}
}

補足

custom_dataにcloud-configファイルの内容を渡す場合、base64encodeする必要がある。加えてcloud-configファイルに変数を利用したいケースがあると思う。

参照するファイル内に変数を利用したいケースで以前から使用されているtemplate_fileは非推奨。0.12以降ではtemplatefileを使用する。

template_file

In Terraform 0.12 and later, the templatefile function offers a built-in mechanism for rendering a template from a file. Use that function instead, unless you are using Terraform 0.11 or earlier.