目次
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 (GCP) でリソースを作ってみましょう。
使い方
※以下は、ご利用のクラウドによって適宜読み替えてください
1. 検索ページへアクセス
まずは以下のURLにアクセスして、プロバイダを「Google」に変更します
検索ページ https://registry.terraform.io/browse/modules
今回は「Bastion Host(踏み台サーバー/要塞VMと呼ばれるもの)」を検索して、作ってみます。
※踏み台サーバーは簡単にいうとセキュリティを向上させるための構成に使われるサーバーです
※GCPにおける、踏み台サーバーについてはこちらを参照してください
お、Google 公式の module が見つかりました。よさげです。
どんなことをしてくれるのだろ、とひとまず確認
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_network
と google_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 に初学者の方には、ぜひ使い方を知って欲しいサービスです。
参考
株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。
grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。
お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。