Terraform Registry、使ってますか?

boom boom! Hello Cloud! どうも、しみちゃんでございます。

terraform 入門者向けの記事です。

HashiCorp Configuration Language(HCL) にも慣れてきて、 module を書き殴っている日々の中、これに出会った時、「もっと早く知ってれば」と、ある種の後悔にも似た感情を抱いたので書いてみました。

module の記事はめちゃくちゃヒットするのに、 Terraform Registry の記事は全然ヒットしない・・・というわけで書こう!

terraform でちょっとリソースが作れるようになった、特に module について勉強を始めた方に向けた記事です。

module って作るのがまた面倒な件

まず、最初の説明として、 terraform には module という機能があります。
名前のとおり作ったソースコードをテンプレートとして扱うことができるものです。

同じ module を使えば誰が作成しても同じものができるという素晴らしい機能です。

しかし、経験上 module の作成はなかな大変な作業になる事が多いです。

ちょっとインスタンスを作るだけ、などの薄いコンポーネントであれば素のTFファイルのコピペだけで済むので、 module 機能をそもそも使うことも少ないですが、「module化しよう」となる時には「サービスアカウント x ネットワーク x マシン」といったようなサービス群の依存関係を一気通貫に管理・標準化・作業コストダウンを目指したい場合が多く、そこそこ大きなもの作らなければならない場面が多いからです。

また、チームで運用する場合などは、入力する値の柔軟性や制限も考慮しながら作るので、ちょっとした規模の開発になってしまいます。

そこで

terraform module について勉強を始めた方、またはmoduleを作るのに疲れた、という方にお勧めしたいのが Terraform Registry というサービスです。

これは簡単にいうと、みんなが作った terraform の module が共有されているHashiCorp公式プラットフォームです。

TFファイルにレジストリの module のソース名を直接指定して使うことができます。

どう便利か、については実際に Google Cloud でリソースを作ってみましょう。

使い方

※以下は、ご利用のクラウドによって適宜読み替えてください

1. 検索ページへアクセス

まずは以下のURLにアクセスして、プロバイダを「Google」に変更します

検索ページ https://registry.terraform.io/browse/modules

今回は「Bastion Host(踏み台サーバー/要塞VMと呼ばれるもの)」を検索して、作ってみます。

※踏み台サーバーは簡単にいうとセキュリティを向上させるための構成に使われるサーバーです
※GCPにおける、踏み台サーバーについてはこちらを参照してください

お、Google 公式の module が見つかりました。よさげです。

https://registry.terraform.io/modules/terraform-google-modules/bastion-host/google/latest/submodules/iap-tunneling

どんなことをしてくれるのだろ、とひとまず確認

This module will:

  • Create a dedicated service account for the bastion host
  • Create a GCE instance to be the bastion host
  • Create a firewall rule to allow TCP:22 SSH access from the IAP to the bastion
  • Necessary IAM bindings to allow IAP and OS Logins from specified members

よさげです。

ページをすすめると・・・使い方まで丁寧にのっていますね。便利です。

この時に requirements を確認して、必要なものを理解・揃えておきましょう。

Usage
Basic usage of this module is as follows:

module "iap_bastion" {
  source = "terraform-google-modules/bastion-host/google"

  project = var.project
  zone    = var.zone
  network = google_compute_network.net.self_link
  subnet  = google_compute_subnetwork.net.self_link
  members = [
    "group:devs@example.com",
    "user:me@example.com",
  ]
}

2. TFファイルを書いていく

実際に TF ファイルを書いてみましょう。

埋めれるところだけ入れるとこんな感じでしょうか。

#main.tf
#Registry
#https://registry.terraform.io/modules/terraform-google-modules/bastion-host/google/latest

module "iap_bastion" {
  #ターゲットのソース
  source = "terraform-google-modules/bastion-host/google"

  project = "xxxxxxxx"
  zone    = "asia-northeast1-a"
  network = google_compute_network.net.self_link
  subnet  = google_compute_subnetwork.net.self_link
  members = [
    "user:shimizu@grasys.io",
  ]
}

google_compute_networkgoogle_compute_subnetwork のリソースは自分で作らないといけないようですね。

コードを追加します。

#以下を追加
resource "google_compute_network" "net" {
  project = "xxxxxxxx"
  name    = "blog-shimichan"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "net" {
  project       = "xxxxxxxx"
  name          = "blog-subnet1"
  ip_cidr_range = "10.2.0.0/16"
  region        = "asia-northeast1"
  network       = google_compute_network.net.id
  secondary_ip_range {
    range_name    = "blog-subnet1-secondary"
    ip_cidr_range = "192.168.10.0/24"
  }
}

記事が長くなるので、変数などのリファクタリングは今日はやめておきます。

3. terraform を実行する

まずは init してみましょう

$ terraform init
Initializing modules...
Downloading registry.terraform.io/terraform-google-modules/bastion-host/google 5.0.0 for iap_bastion...
- iap_bastion in .terraform/modules/iap_bastion
- iap_bastion.iap_tunneling in .terraform/modules/iap_bastion/modules/iap-tunneling
Downloading registry.terraform.io/terraform-google-modules/vm/google 7.7.0 for iap_bastion.instance_template...
- iap_bastion.instance_template in .terraform/modules/iap_bastion.instance_template/modules/instance_template

Initializing the backend...

()

Terraform has been successfully initialized!

()

どうやらローカルに module をダウンロードしてくれるようですね

そんで plan & apply です

$ terraform plan
() ...

Plan: 15 to add, 0 to change, 0 to destroy.

$ terraform apply
()...
  Enter a value: yes
()...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

良さげです。
※ちゃんとplan/applyの中身を確認しておきましょう

さて、できてるか確認です。

$ gcloud compute instances list --project grasys-study
NAME                                              ZONE               MACHINE_TYPE       PREEMPTIBLE  INTERNAL_IP   EXTERNAL_IP     STATUS
bastion-vm                                        asia-northeast1-a  n1-standard-1                   10.2.0.2                      RUNNING

よさげですね。外部IPもついていません。
アクセスしてみましょう。

$ gcloud compute ssh bastion-vm --project XXXX --zone asia-northeast1-a
Debian GNU/Linux comes with ABSOLUTELY NO WARRnANTY, to the extent
permitted by applicable law.
Last login: Thu Apr 21 10:05:48 2022
shimichan_XXXX@bastion-vm:~$

アクセスできました。

慣れたら

ページに紹介されている Inputs を参考にいろんなパラメータを追加して、好みの設定に変えてみましょう。

module "iap_bastion" {
  source = "terraform-google-modules/bastion-host/google"

  project = var.project
  zone    = "asia-northeast1-a"
  network = google_compute_network.net.self_link
  subnet  = google_compute_subnetwork.net.self_link
  members = [
    "user:shimizu@grasys.io",
  ]

  #追加
  fw_name_allow_ssh_from_iap = "shimichan-allow-ssh-from-iap-to-tunnel"
}

ソースのリポジトリも公開されているので、運用スタイルに合わせてソースからガッツリ変更してもいいともいます。

module をいきなり「作ろう!」となる前に、いったん Terraform Registry から良さそうな module を探してから、 好みにカスタマイズ、なければ「作ろうかな・・・」と悩んでいいと思います。

また、プロバイダ公式の module のソースコードを見てリソース同士の依存関係の理解したり、 HCL の書き方を勉強したりするのに役に立ちます。

特にWebコンソールからだけでは見えずらい、詳細な情報がコードとして見えるので、初めて触るサービス・概念の理解にとても役に立ちます。

まとめ

  • Terraform Registry はみんなが作った module が公開されている公式サービス
  • TFファイルに記述することで、簡単に利用できる
  • 公開されている module を見ることでサービスの理解に役立つ

最後に

どうだったでしょうか。

実は私は Terraform を触り始めて3年以上経ってからこのサービスの存在を知りました。。。

そこそこ Terraform のについて調べてきたはずなのですが、 Terraform Registry というサービスにアクセスする機会がなかったのが不思議なくらいです。

Terraform に初学者の方には、ぜひ使い方を知って欲しいサービスです。

参考

Terraform Registry


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。