terraform-exec の使い方

What is terraform-exec

Hashicorpにメンテナンスされているterraform cliGolangから使うためのモジュール

GitHub - hashicorp/terraform-exec: Terraform CLI commands via Go.

How to use

package main

import (
        "context"
        "encoding/json"
        "fmt"
        "log"

        "github.com/hashicorp/go-version"
        "github.com/hashicorp/hc-install/product"
        "github.com/hashicorp/hc-install/releases"
        "github.com/hashicorp/terraform-exec/tfexec"
)

func main() {
        installer := &releases.ExactVersion{
                Product: product.Terraform,
                // versionは必須
                Version: version.Must(version.NewVersion("1.0.6")),
        }

        execPath, err := installer.Install(context.Background())
        if err != nil {
                log.Fatalf("error installing Terraform: %s", err)
        }

        workingDir := "path/to/working/dir/terraform"
        tf, err := tfexec.NewTerraform(workingDir, execPath)
        if err != nil {
                log.Fatalf("error running NewTerraform: %s", err)
        }

        err = tf.Init(context.Background(), tfexec.Upgrade(true))
        if err != nil {
                log.Fatalf("error running Init: %s", err)
        }

    
       // terraform plan -out を使う場合はPlanOptionを使う
        planConfig := []tfexec.PlanOption{
                tfexec.Out("./out.txt"),
        }

        plan, err := tf.Plan(context.Background(), planConfig...)
        if err != nil {
                log.Fatalf("error running plan: %s", err)
        }
        // 差分が有る場合はtrueになる
        fmt.Println(plan)
   
        show, err := tf.Show(context.Background())
        if err != nil {
                log.Fatalf("error show: %s", err)
        }

        b, err := json.Marshal(show)
        if err != nil {
                log.Fatalf("err %s", err)
        }
        // json形式でplan結果が表示される
        fmt.Println(string(b))

        // ファイル出力したバイナリを使う場合
  
        // planStr2, err := tf.ShowPlanFile(context.Background(), "./out.txt")
        // if err != nil {
        //      log.Fatalf("err %s", err)
        // }

        // b, err := json.Marshal(planStr2)
        // if err != nil {
        //      log.Fatalf("err %s", err)
        // }
        // fmt.Println(string(b))

        // tf.Apply(context.Background())
}