Terraform チュートリアル(第 2 世代)


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

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

目標

  • Terraform を使用して HTTP 関数をデプロイする方法について学習します。

費用

このドキュメントでは、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 Run, 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 Run, 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/helloworld/helloworldHttp

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

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

    zip -r function-source.zip .
    

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

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" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name                        = "${random_id.default.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  = "functions/hello-world/"
    }
    resource "google_storage_bucket_object" "object" {
      name   = "function-source.zip"
      bucket = google_storage_bucket.default.name
      source = data.archive_file.default.output_path # Add path to the zipped function source code
    }
    
    resource "google_cloudfunctions2_function" "default" {
      name        = "function-v2"
      location    = "us-central1"
      description = "a new function"
    
      build_config {
        runtime     = "nodejs16"
        entry_point = "helloHttp" # Set the entry point
        source {
          storage_source {
            bucket = google_storage_bucket.default.name
            object = google_storage_bucket_object.object.name
          }
        }
      }
    
      service_config {
        max_instance_count = 1
        available_memory   = "256M"
        timeout_seconds    = 60
      }
    }
    
    resource "google_cloud_run_service_iam_member" "member" {
      location = google_cloudfunctions2_function.default.location
      service  = google_cloudfunctions2_function.default.name
      role     = "roles/run.invoker"
      member   = "allUsers"
    }
    
    output "function_uri" {
      value = google_cloudfunctions2_function.default.service_config[0].uri
    }
  3. main.tf ファイルを編集して、次の項目に正しい値が設定されていることを確認します。構成が変更される場合は(別のランタイムを使用する場合や、別の関数をデプロイする場合など)、このファイルを編集する必要があります。

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

Terraform を初期化する

main.tf ファイルを含む nodejs-docs-samples/functions/ ディレクトリで、次のコマンドを実行して必要なプラグインを追加し、.terraform ディレクトリをビルドします。

terraform init

Terraform 構成を適用する

main.tf ファイルを含む nodejs-docs-samples/functions/ ディレクトリで、構成を適用して関数をデプロイします。プロンプトが表示されたら、「yes」と入力します。

terraform apply

関数をテストする

  1. 関数がデプロイされたら、URI プロパティをメモするか、次のコマンドを使用して検索します。

    gcloud functions describe function-v2 --gen2 --region=us-central1 --format="value(serviceConfig.uri)"
    
  2. この URL にリクエストを送信して、関数の「Hello World」メッセージを表示します。この関数のデプロイには認証が必要です。そのため、リクエストには認証情報が必要です。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" YOUR_FUNCTION_URL
    

クリーンアップ

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

Terraform では、main.tf ファイルを含む nodejs-docs-samples/functions/ ディレクトリで terraform destroy コマンドを実行して、構成ファイルで定義されたすべてのリソースを削除できます。

terraform destroy

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