はじめに
terraformを使う機会がありそうなので、事前に勉強。
Terraform
TerraformはクラウドのIaCを行うためのサービス。
クラウドのSaaSがあるので、それを使ってみる。

Terraform CLI インストール
Terraformを利用するにはTerraform CLIをインストールする必要がある。
# yum install -y yum-utils
# yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
# yum -y install terraform
Terraformへのログイン
Webよりログインを行い、トークンを取得するように言われるので、その通りにする。
# terraform login
(snip)
---------------------------------------------------------------------------------
Open the following URL to access the tokens page for app.terraform.io:
https://app.terraform.io/app/settings/tokens?source=terraform-login
---------------------------------------------------------------------------------
(snip)
Token for app.terraform.io:
Enter a value:
Retrieved token for user xxxx
---------------------------------------------------------------------------------
Success! Terraform has obtained and saved an API token.
Terraform初期設定
初期設定用のスクリプトが公開されているので、試してみる
### JSONをみやすく整形するパッケージ。
# yum install jq
### Git
# yum install git
$ git clone https://github.com/hashicorp/tfc-getting-started.git
$ cd tfc-getting-started
$ ./scripts/setup.sh
### 初期設定スクリプトで実施された内容
### 作業ディレクトリの初期化
$ terraform init
### 実行プランの作成
$ terraform plan
### 構成変更の適用
$ terraform apply -auto-approve
terraform init
この
https://www.terraform.io/docs/cli/commands/init.htmlterraform init
コマンドは、Terraform構成ファイルを含む作業ディレクトリを初期化するために使用されます。これは、新しいTerraform構成を書き込んだ後、またはバージョン管理から既存の構成を複製した後に実行する必要がある最初のコマンドです。このコマンドを複数回実行しても安全です。
terraform plan
この
https://www.terraform.io/docs/cli/commands/plan.htmlterraform plan
コマンドは、実行プランを作成するために使用されます。Terraformは、明示的に無効にされていない限り、更新を実行してから、構成ファイルで指定された目的の状態を実現するために必要なアクションを決定します。
terraform apply
この
https://www.terraform.io/docs/cli/commands/apply.htmlterraform apply
コマンドは、構成の目的の状態に到達するために必要な変更、またはterraform plan
実行プランによって生成された事前に決定された一連のアクションを適用するために使用されます。
サンプルの確認
テストプランを実行すると、ダミーインフラサービスにリソースが展開された状態となる。

ダミーインフラサービスのリソースを変更してみる。
まずは定義ファイルにリソースを追加してみる。
# vi main.tf
(snip)
resource "fakewebservices_vpc" "primary_vpc" {
name = "Primary VPC"
cidr_block = "0.0.0.0/1"
}
resource "fakewebservices_server" "servers" {
count = 2
name = "Server ${count.index + 1}"
type = "t2.micro"
vpc = fakewebservices_vpc.primary_vpc.name
}
resource "fakewebservices_load_balancer" "primary_lb" {
name = "Primary Load Balancer"
servers = fakewebservices_server.servers[*].name
}
resource "fakewebservices_database" "prod_db" {
name = "Production DB"
size = 256
}
### 以下を追記
resource "fakewebservices_server" "server-3" {
name = "Server 3"
type = "t2.macro"
}
resource "fakewebservices_server" "server-4" {
name = "Server 4"
type = "t2.macro"
}
アプライする
# terraform apply
ダミーインフラの内容が更新されていることを確認する。

GCP + Terraform
GCP サービスアカウントの作成
新しいサービスアカウントを作成する。
- ロールは「Project-編集者」(全リソースへの編集アクセス権)を選択する。
- キーのタイプはJSONを選択する。

構成ファイル(.tf)の作成
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.5.0"
}
}
}
provider "google" {
credentials = file("<NAME>.json")
project = "<PROJECT_ID>"
region = "us-central1"
zone = "us-central1-c"
}
resource "google_compute_network" "vpc_network" {
name = "terraform-network"
}
Terraform Language Documentation

terraform { } : Terraformセッティング

各
https://www.terraform.io/docs/language/settings/index.htmlterraform
ブロックには、Terraformの動作に関連するいくつかの設定を含めることができます。terraform
ブロック内では、定数値のみを使用できます。引数は、リソースや入力変数などの名前付きオブジェクトを参照したり、Terraform言語の組み込み関数を使用したりすることはできません。
サンプル
terraform {
required_providers { # プロバイダを利用する場合の宣言。googleプロバイダを使うので定義
google = { # google:ローカルネーム
source = "hashicorp/google" # プロバイダのソースアドレス。Terraformがここからダウンロードする
version = "3.5.0" # バージョン
}
}
}
プロバイダのソースで指定したところからモジュールをダウンロードする。
hashicorp/googleの場合、registry.terraform.ioからダウンロードすることになるので、以下。
provider { } : プロバイダの設定
provider "google" { # required_providers で読み込んだプロバイダを利用。その設定。
credentials = file("<NAME>.json") # GCPのサービスアカウントのJSONファイルパスを指定する。
project = "<PROJECT_ID>" # 対象のプロジェクトIDを指定する。
region = "us-central1"
zone = "us-central1-c"
}
resource { } : インフラストラクチャ内に存在するリソースを定義
resource "google_compute_network" "vpc_network" {
name = "terraform-network" # VPCにterraform-networkを作成する。
}
リソースは、Terraform言語で最も重要な要素です。各リソースブロックは、仮想ネットワーク、コンピューティングインスタンス、DNSレコードなどの高レベルのコンポーネントなどの1つ以上のインフラストラクチャオブジェクトを記述します。
https://www.terraform.io/docs/language/resources/index.html
実際に試してみる
### 定義ファイルとサービスアカウントのJSONファイルの準備
# ls
gcp.tf terra.json
### 初回デプロイなので、初期化
# terraform init
(snip)
Terraform has been successfully initialized!
### 定義ファイルの適用
# terraform apply
(snip)
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

コメント