TerraformでGCPのPub/Subを作成する②-Pub/Sub の作成

2021-03-26GCP,Terraform

はじめに

Terraform で GCP の Pub/Sub を作成する ①-Terraform をインストール からの続きです。

前回のエントリでは、 Terraform を MacBookPro にインストールするところまでを行いました。
僕の MacBookPro では、インストール時にエラーが多数発生して解決までにいくつもの工程を踏む必要がありました。

今回のエントリでは、 GCP 上に Pub/Sub の Topic(トピック)Subscription(サブスクリプション) を構築していきます。

用語が不明な方は以下を参照ください。

検証環境

$ uname -moi
x86_64 MacBookPro16,1 Darwin

$ bash -version | head -n 1
GNU bash, version 5.0.18(1)-release (x86_64-apple-darwin19.5.0)

$ terraform -version
Terraform v0.14.8

事前準備、前提条件

  • gcloud auth login 済みであること
  • gcloud コマンドを実行して GCP プロジェクト内に Pub/Sub リソースを作成する権限を持っていること

今回は権限ではまりたくないため、GCP プロジェクト内に登録されている自分の権限を利用します。

インフラの設定ファイルは HCL (HashiCorp Configuration Language) を使って記述する

Terraform で GCP の Pub/Sub を作成する ①-Terraform をインストール でも紹介しましたが、 Terraform では、 「手順型のスクリプト」を作成するのではなく、「宣言型の設定ファイル」を作成します。

「宣言型の設定ファイル」 は記述ルールが厳密に決められており、 HCL (HashiCorp Configuration Language) という言語で記述します。

拡張子は tf で作成するようです。

なにはともあれ、 tf ファイルを作成します。

$ touch pubsub.tf

$ vi pubsub.tf

Google Cloud Platform Provider の設定

Terraform は Provider というものを使って、環境構築先のクラウドとそこへの接続を設定します。

GCP を利用したい場合には Google Cloud Platform Provider という Provider を利用します。
設定する項目として projectregion が必要なので、 gcloud コマンドを使って対象 GCP プロジェクトを確認します。

プロジェクト名は実際に検証した環境から置換しています。

NAME                        IS_ACTIVE  ACCOUNT                               PROJECT                     COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
genzouw-xx                  True       genzouw@gmail.com                     genzouw-xx-273608           asia-northeast1-a

IS_ACTIVETrue になっているプロジェクトに環境を作成したいと思います。

tf ファイルに以下のように記述します。

provider "google" {
  project     = "genzouw-xx-273608"
  region      = "asia-northeast1-a"
}

ほぼ空の設定ファイルで terraform コマンドを叩いてみる

この状態でどこまで terraform コマンドが動かせるのか知りたかったのでためしに動かしてみます。

実行前に terraform init でプラグインをインストールする

利用している Providerプラグイン として提供されています。
実行の前に設定ファイル内のプラグインをインストールする必要があります。

terraform init コマンドを利用します。

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/google...
- Installing hashicorp/google v3.59.0...
- Installed hashicorp/google v3.59.0 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

実行前に terraform validate で設定ファイルの文法をチェックする

プラグインをインストールできているため、文法チェックはすでにできているのかもしれませんが、念の為文法チェックを行います。

$ terraform validate
Success! The configuration is valid.

実行プランを terraform plan で確認

こちらも、 Terraform で GCP の Pub/Sub を作成する ①-Terraform をインストール でも紹介していた機能です。

実行プランの作成実行(適用) はコマンドが分けられています。
最終確認としてどんなリソースが作られるのか?更新されるのか?を terraform plan で確認します。

$ terraform plan

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no

Provider しか定義していないので、当然ですね。

実行プランを確認し終わったら terraform apply で反映

$ terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

いけそうなので、 Pub/Sub リソースを定義し、反映させていきたいと思います。

Pub/Sub リソースを作成し、GCP に反映させてみる。

いよいよ Pub/SubTopicSubscription を登録していきます。

用語が不明な方は以下を参照ください。

設定方法は Terraform の公式ドキュメントを参照しました。
Pub/Sub以外の設定を行いたい場合でも、以下のドキュメントページメニューから探すことができます。

provider "google" {
  project     = "genzouw-xx-273608"
  region      = "asia-northeast1-a"
}

resource "google_pubsub_topic" "terraform-topic" {
  name = "terraform-topic"
}

resource "google_pubsub_subscription" "terraform-subscription" {
  name  = "terraform-subscription"
  topic = google_pubsub_topic.terraform-topic.name

  message_retention_duration = "604800s"
  retain_acked_messages      = true

  ack_deadline_seconds = 10

  enable_message_ordering    = false
}

先程の terraform サブコマンドを一つずつ実行して行きます。

$ terraform validate
Success! The configuration is valid.

$ terraform plan
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_pubsub_subscription.terraform-subscription will be created
  + resource "google_pubsub_subscription" "terraform-subscription" {
      + ack_deadline_seconds       = 20
      + enable_message_ordering    = false
      + id                         = (known after apply)
      + message_retention_duration = "1200s"
      + name                       = "terraform-subscription"
      + path                       = (known after apply)
      + project                    = (known after apply)
      + retain_acked_messages      = true
      + topic                      = "terraform-topic"

      + expiration_policy {
          + ttl = (known after apply)
        }
    }

  # google_pubsub_topic.terraform-topic will be created
  + resource "google_pubsub_topic" "terraform-topic" {
      + id      = (known after apply)
      + name    = "terraform-topic"
      + project = (known after apply)

      + message_storage_policy {
          + allowed_persistence_regions = (known after apply)
        }
    }

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

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

$ terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_pubsub_subscription.terraform-subscription will be created
  + resource "google_pubsub_subscription" "terraform-subscription" {
      + ack_deadline_seconds       = 20
      + enable_message_ordering    = false
      + id                         = (known after apply)
      + message_retention_duration = "1200s"
      + name                       = "terraform-subscription"
      + path                       = (known after apply)
      + project                    = (known after apply)
      + retain_acked_messages      = true
      + topic                      = "terraform-topic"

      + expiration_policy {
          + ttl = (known after apply)
        }
    }

  # google_pubsub_topic.terraform-topic will be created
  + resource "google_pubsub_topic" "terraform-topic" {
      + id      = (known after apply)
      + name    = "terraform-topic"
      + project = (known after apply)

      + message_storage_policy {
          + allowed_persistence_regions = (known after apply)
        }
    }

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

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

google_pubsub_topic.terraform-topic: Creating...
google_pubsub_topic.terraform-topic: Creation complete after 3s [id=projects/genzouw-xx-273608/topics/terraform-topic]
google_pubsub_subscription.terraform-subscription: Creating...
google_pubsub_subscription.terraform-subscription: Creation complete after 5s [id=projects/genzouw-xx-273608/subscriptions/terraform-subscription]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

結果

マスキング部分が多いですが、以下のように作成されていました。

ひとこと

簡単だし、楽しいですし、 Terraform いいですね。

2021-03-26GCP,Terraform