Terraform + Git + GCP 試してみた

AWS

はじめに

terraformを使う機会がありそうなので、事前に勉強。

Terraform

TerraformはクラウドのIaCを行うためのサービス。
クラウドのSaaSがあるので、それを使ってみる。

Terraform Cloud by HashiCorp
Terraform Cloud helps teams use Terraform together and is available as a hosted service, with free and paid versions to fit an organization’s needs.

Terraform CLI インストール

Install Terraform | Terraform - HashiCorp Learn
Install Terraform on Mac, Linux, or Windows by downloading the binary or using a package manager (Homebrew or Chocolatey). Then create a Docker container locall...

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

このterraform initコマンドは、Terraform構成ファイルを含む作業ディレクトリを初期化するために使用されます。これは、新しいTerraform構成を書き込んだ後、またはバージョン管理から既存の構成を複製した後に実行する必要がある最初のコマンドです。このコマンドを複数回実行しても安全です。

https://www.terraform.io/docs/cli/commands/init.html

terraform plan

このterraform planコマンドは、実行プランを作成するために使用されます。Terraformは、明示的に無効にされていない限り、更新を実行してから、構成ファイルで指定された目的の状態を実現するために必要なアクションを決定します。

https://www.terraform.io/docs/cli/commands/plan.html

terraform apply

このterraform applyコマンドは、構成の目的の状態に到達するために必要な変更、またはterraform plan実行プランによって生成された事前に決定された一連のアクションを適用するために使用されます。

https://www.terraform.io/docs/cli/commands/apply.html


サンプルの確認

テストプランを実行すると、ダミーインフラサービスにリソースが展開された状態となる。

ダミーインフラサービスのリソースを変更してみる。

まずは定義ファイルにリソースを追加してみる。

# 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

Build Infrastructure | Terraform - HashiCorp Learn
Authenticate to Google Cloud and create a VPC network. Write and validate Terraform configuration, initialize a configuration directory, and plan and apply a co...

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

Overview - Configuration Language - Terraform by HashiCorp
Terraform by HashiCorp

terraform { } : Terraformセッティング

Terraform Settings - Configuration Language - Terraform by HashiCorp
The terraform configuration section is used to configure some behaviors of Terraform itself.

terraformブロックには、Terraformの動作に関連するいくつかの設定を含めることができます。terraformブロック内では、定数値のみを使用できます。引数は、リソースや入力変数などの名前付きオブジェクトを参照したり、Terraform言語の組み込み関数を使用したりすることはできません。

https://www.terraform.io/docs/language/settings/index.html

サンプル

terraform {
  required_providers {                  # プロバイダを利用する場合の宣言。googleプロバイダを使うので定義
    google = {                          # google:ローカルネーム
      source = "hashicorp/google"       # プロバイダのソースアドレス。Terraformがここからダウンロードする
      version = "3.5.0"                 # バージョン
    }
  }
}

プロバイダのソースで指定したところからモジュールをダウンロードする。
hashicorp/googleの場合、registry.terraform.ioからダウンロードすることになるので、以下。

https://registry.terraform.io/providers/hashicorp/google/latest

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.

コメント

タイトルとURLをコピーしました