本日も乙

ただの自己満足な備忘録。

Terraformで最新のGCEイメージからGCEを起動する

GCPのAuto Scaler(GCE Instagnce Template, Intance Group, HTTP Load Balancer) をTerraformでコード化しているのですが、起動設定(Instance Template)に登録するGCEのイメージを常に最新にしたい場合があります。
都度都度GCEイメージ名をハードコーディングするとイメージの更新時に漏れてしまう可能性があるため、最新イメージ取得を自動的にやりたいとします。

Terraformのドキュメントを見ていたら「Deploying the Latest Image」というトピックがあり、期待通りに動作したので本記事で共有したいと思います。
Google: google_compute_instance_template - Terraform by HashiCorp

なお、AWSのAMIの場合は以下の記事がとても参考になります。
参考: Terraformでもいつでも最新AMIからEC2を起動したい | DevelopersIO

GCEイメージファミリー

GCEイメージには「ファミリー」というイメージをグルーピングできる機能があります。
このイメージファミリーに含めることで、イメージ名が違ったとしても最新のイメージを取得するのが容易になります。

例えば、 debian-9 というイメージファミリーで検索すると、サポート終了のイメージも含めて多くのイメージがヒットします。ここで最新のイメージは debian-9-stretch-v20181011 となります。

gce-image-family

Terraformで最新のGCEイメージを取得

ドキュメントにあるソース を引っ張ってきました。

data "google_compute_image" "my_image" {
  family  = "debian-9"
  project = "debian-cloud"
}

resource "google_compute_instance_template" "instance_template" {
  name_prefix  = "instance-template-"
  machine_type = "n1-standard-1"
  region       = "us-central1"

  // boot disk
  disk {
    initialize_params {
      image = "${data.google_compute_image.my_image.self_link}"
    }
  }
}

google_compute_image はデータリソースといって、GCPのAPIをリクエストして取得するコンポーネントになります。今回は familydebian-9 なので、先程の図と同じく debian-9-stretch-v20181011 というイメージを指定することになります。実際の参照は${data.google_compute_image.my_image.self_link} となります。

まとめ

Terraformで最新のGCEイメージを取得したい方法を紹介しました。AWS AMIよりシンプルでわかりやすいですが、細かいフィルタ設定ができないので、その場合はイメージファミリーを細かく指定するなどして対応してください。