Terraform Pub/Sub のチュートリアル(第 2 世代)


このチュートリアルでは、関数のソースコードの zip ファイルを Cloud Storage バケットにアップロードし、Terraform を使用してリソースをプロビジョニングして、Pub/Sub 関数をデプロイする方法について説明します。オープンソース ツールの Terraform では、宣言型の構成ファイルを使用して、Google Cloud リソースをプロビジョニングできます。

このチュートリアルでは例として Node.js 関数を使用していますが、Python、Go、Java の関数にも対応しています。使用しているランタイムがどれであっても、手順は同じです。

目標

  • Terraform を使用して Pub/Sub 関数をデプロイする方法を学習します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

詳細については、Cloud Functions の料金をご覧ください。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Cloud Functions, Cloud Build, Artifact Registry, and Cloud Storage API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. Cloud Functions, Cloud Build, Artifact Registry, and Cloud Storage API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    gcloud init
  12. gcloud CLI がすでにインストールされている場合は、次のコマンドを実行して更新します。

    gcloud components update
  13. 開発環境を準備します。

    Node.js 設定ガイドに移動

環境設定

このチュートリアルでは、Cloud Shell でコマンドを実行します。Cloud Shell は、Google Cloud CLI がすでにインストールされているシェル環境で、現在のプロジェクトの値もすでに設定されています。Cloud Shell の初期化には数分かかることがあります。

Cloud Shell を開く

アプリケーションの準備

Cloud Shell で次の操作を行います。

  1. Cloud Shell インスタンスにサンプルアプリ リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Cloud Functions のサンプルコードが含まれているディレクトリに移動します。

    cd nodejs-docs-samples/functions/v2/helloPubSub/

    このチュートリアルで使用する Node.js サンプルは、基本的な「Hello World」Pub/Sub 関数です。

  3. 関数のソースコードを含む zip ファイルを作成します。このファイルは、Terraform を使用して Cloud Storage バケットにアップロードします。

    zip -r function-source.zip .
    

    zip ファイルのルートは、関数のソースコードのルート ディレクトリにする必要があります。したがって、上記のコマンドに helloworld ディレクトリ内のファイルは含まれますが、ディレクトリ自体は含まれません。

main.tf ファイルを作成する

  1. nodejs-docs-samples/functions/ ディレクトリに、Terraform 構成用の main.tf ファイルを作成します。

    touch main.tf
    
  2. この Terraform 構成を main.tf ファイルにコピーします。

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = ">= 4.34.0"
        }
      }
    }
    
    resource "random_id" "bucket_prefix" {
      byte_length = 8
    }
    
    resource "google_service_account" "default" {
      account_id   = "test-gcf-sa"
      display_name = "Test Service Account"
    }
    
    resource "google_pubsub_topic" "default" {
      name = "functions2-topic"
    }
    
    resource "google_storage_bucket" "default" {
      name                        = "${random_id.bucket_prefix.hex}-gcf-source" # Every bucket name must be globally unique
      location                    = "US"
      uniform_bucket_level_access = true
    }
    
    data "archive_file" "default" {
      type        = "zip"
      output_path = "/tmp/function-source.zip"
      source_dir  = "function-source/"
    }
    
    resource "google_storage_bucket_object" "default" {
      name   = "function-source.zip"
      bucket = google_storage_bucket.default.name
      source = data.archive_file.default.output_path # Path to the zipped function source code
    }
    
    resource "google_cloudfunctions2_function" "default" {
      name        = "function"
      location    = "us-central1"
      description = "a new function"
    
      build_config {
        runtime     = "nodejs16"
        entry_point = "helloPubSub" # Set the entry point
        environment_variables = {
          BUILD_CONFIG_TEST = "build_test"
        }
        source {
          storage_source {
            bucket = google_storage_bucket.default.name
            object = google_storage_bucket_object.default.name
          }
        }
      }
    
      service_config {
        max_instance_count = 3
        min_instance_count = 1
        available_memory   = "256M"
        timeout_seconds    = 60
        environment_variables = {
          SERVICE_CONFIG_TEST = "config_test"
        }
        ingress_settings               = "ALLOW_INTERNAL_ONLY"
        all_traffic_on_latest_revision = true
        service_account_email          = google_service_account.default.email
      }
    
      event_trigger {
        trigger_region = "us-central1"
        event_type     = "google.cloud.pubsub.topic.v1.messagePublished"
        pubsub_topic   = google_pubsub_topic.default.id
        retry_policy   = "RETRY_POLICY_RETRY"
      }
    }
  3. main.tf ファイルを編集して、次の項目に正しい値が設定されていることを確認します。構成が変更される場合は(別のランタイムを使用する場合や、別の関数をデプロイする場合など)、このファイルを編集する必要があります。

    • ランタイム: この例のランタイムは nodejs16 です。
    • 関数のエントリ ポイント: この例の関数のエントリ ポイントは helloPubSub です。
    • zip ファイルのパス: 上記の例では、main.tf ファイルを nodejs-docs-samples/functions/ ディレクトリに配置した場合、パスは ./v2/helloPubSub/function-source.zip です。

Terraform を初期化する

  1. Cloud Shell で次のコマンドを実行して、Terraform を初期化します。

    docker run -v $(pwd):/app -w /app hashicorp/terraform:0.12.0 init
    

    公開の Terraform Docker イメージを使用します。Docker は Cloud Shell にインストールされています。現在の作業ディレクトリはボリュームとしてマウントされるため、Docker コンテナは Terraform 構成ファイルを読み取ることができます。

  2. 次のコマンドを実行して、必要なプラグインを追加し、.terraform ディレクトリをビルドします。

    terraform init
    

Terraform 構成を検証する

Terraform 構成をプレビューします。このステップは省略可能ですが、main.tf の構文が正しいかどうかを確認できます。このコマンドにより、作成されるリソースのプレビューが表示されます。

terraform plan

Terraform 構成を適用する

構成を適用して関数をデプロイします。プロンプトが表示されたら、「yes」と入力します。

terraform apply

関数のトリガー

Pub/Sub 関数をテストするには:

  1. トピックにメッセージをパブリッシュします(この例のトピック名は functions2-topic です)。

    gcloud pubsub topics publish TOPIC_NAME --message="Friend"
  2. 関数のログで結果を確認します。ここで、FUNCTION_NAME は関数の名前です(この例の関数名は function です)。

    gcloud beta functions logs read FUNCTION_NAME --gen2

    ログの出力に、新しい「Friend」メッセージが含まれているはずです。

クリーンアップ

チュートリアルの完了後は、それ以上の費用が発生しないように、作成したものをすべて削除できます。

Terraform では、terraform destroy コマンドを実行して、構成ファイルで定義されているすべてのリソースを削除できます。

terraform destroy

Terraform でリソースを削除できるようにするには、「yes」と入力します。