terraform-exec の使い方
What is terraform-exec
Hashicorpにメンテナンスされているterraform cliをGolangから使うためのモジュール
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())
}