[A-00163]TerraformでPubSubからTriggerしてCloudFunctionsを実行する

Google Cloud上にPubSubのトリガー起因でCloud Functionsを実行する仕組みを作る。

・Architecture

・Terraform作成

resource "google_cloudfunctions2_function" "default" {
    name = "pubsub-event-function"
    location = var.region
    description = "triggered by pubsub topic."
    build_config {
        runtime = "python311"
        entry_point = "hello_pubsub"
        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 = 1
      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 = "<input your service account mail>"
    }

    event_trigger {
      trigger_region = var.region
      event_type = "google.cloud.pubsub.topic.v1.messagePublished"
      pubsub_topic = google_pubsub_topic.default.id
      retry_policy = "RETRY_POLICY_RETRY"
    }
}
resource "random_id" "bucket_prefix" {
    byte_length = 8
}

data "archive_file" "default" {
    type = "zip"
    output_path = "/tmp/function-src.zip"
    source_dir = "function-src/"
}
terraform {
  required_providers {
    google = {
        source = "hashicorp/google"
        version = "4.79.0"
    }
  }
}

provider "google" {
    project = var.project_id
    region = var.region
}
resource "google_pubsub_topic" "default" {
    name = "event-trigger-topic"
}
resource "google_storage_bucket" "default" {
    name = "${random_id.bucket_prefix.hex}-gcf-source"
    location = var.region
    uniform_bucket_level_access = false
}

resource "google_storage_bucket_object" "default" {
    name = "function-src.zip"
    bucket = google_storage_bucket.default.name
    source = data.archive_file.default.output_path
}
variable "project_id" {
    type = string
    default = "<input your project id>"
}

variable "region" {
    type = string
    default = "asia-northeast1"
}

・実行プログラムを配置

terraformソースと同じ場所にディレクトリを作成します。

mkdir function-src && cd function-src && touch main.py requirements.txt

ソースの中身は下記の通りです。

from cloudevents.http import CloudEvent

import functions_framework


@functions_framework.cloud_event
def hello_pubsub(cloud_event: CloudEvent) -> tuple:
    
    print("hello, funcsitons!")
functions-framework==3.3.0
cloudevents==1.9.0

・Terraformの実行

下記のコマンドを実行して環境を作成します。

terraform init
terraform plan
terraform apply

実行が完了したらpub/subでメッセージをpublishしてみます。赤枠をクリックします。

メッセージをpublishしたら次にCloud Functionsを確認します。赤枠をクリックします。

今回はpythonにハードコーディングした”hello, funcsitions!”が出力されましたが、pubsubから受け取ったメッセージを出力することも可能です。

確認ができたので下記のコマンドを実行して後片付けします。

terraform destroy

・Appendix

公式ドキュメントはこちら

https://cloud.google.com/functions/docs/tutorials/terraform-pubsub?hl=ja

https://cloud.google.com/eventarc/docs/creating-triggers-terraform?hl=ja

https://cloud.google.com/functions/docs/samples/functions-v2-full?hl=ja

参考文献はこちら

https://genzouw.com/entry/2021/03/13/080051/2453/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*