Pub/Sub 메시지를 사용하여 이벤트 수신 (Terraform)

이 빠른 시작에서는 Terraform을 사용하여 Pub/Sub에서 직접 이벤트를 수신하고 이벤트를 Cloud Run 서비스로 라우팅하는 Eventarc 트리거를 만드는 방법을 보여줍니다. Terraform을 사용하여 Eventarc 트리거를 만드는 방법에 관한 자세한 내용은 Terraform을 사용하여 트리거 만들기를 참고하세요.

이 빠른 시작에서는 다음을 수행합니다.

  1. Terraform 배포를 준비합니다.

  2. 다음을 실행하는 Terraform 구성을 정의합니다.

    1. API 사용 설정
    2. 서비스 계정을 만들고 필요한 Identity and Access Management (IAM) 역할을 부여합니다.
    3. Cloud Run에 서비스를 이벤트 대상으로 배포합니다.
    4. Pub/Sub 주제를 이벤트 제공업체로 만듭니다.
    5. Eventarc 트리거를 만듭니다.
  3. Terraform 구성을 적용합니다.

  4. Pub/Sub 주제에 메시지를 게시하여 이벤트를 생성하고 Cloud Run 로그에서 확인합니다.

시작하기 전에

조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 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. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Cloud Resource Manager and IAM APIs:

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  7. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  11. Make sure that billing is enabled for your Google Cloud project.

  12. Enable the Cloud Resource Manager and IAM APIs:

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  13. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

  14. 프로젝트 생성자에게는 기본 소유자 역할(roles/owner)이 부여됩니다. 기본적으로 Identity and Access Management (IAM) 역할에는 대부분의 Google Cloud리소스에 대한 전체 액세스에 필요한 권한이 포함되며, 이 단계를 건너뛸 수 있습니다.

    프로젝트 생성자가 아니면 프로젝트에서 적합한 주 구성원에 대해 필수 권한을 부여해야 합니다. 예를 들어 주 구성원은 Google 계정(최종 사용자)이거나 서비스 계정(애플리케이션 및 컴퓨팅 워크로드)일 수 있습니다. 자세한 내용은 이벤트 대상의 역할 및 권한 페이지를 참조하세요.

    필수 권한

    빠른 시작을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

    역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

    커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

Terraform 배포 준비

Terraform 구성 파일을 만들어 Terraform 리소스 배포를 준비합니다. Terraform 구성 파일을 사용하면 Terraform 문법을 사용하여 인프라의 기본 최종 상태를 정의할 수 있습니다.

  1. 로컬 셸을 사용하는 경우 Terraform을 설치하고 구성합니다.

    Terraform은 이미 Cloud Shell 환경에 통합되어 있으며 Terraform을 설치하지 않고도 Cloud Shell을 사용하여 Terraform 리소스를 배포할 수 있습니다.

  2. Cloud Shell 또는 로컬 셸에서 Terraform 구성을 적용할 기본 Google Cloud 프로젝트를 설정합니다. 이 명령어는 프로젝트당 한 번만 실행하면 되며 어떤 디렉터리에서도 실행할 수 있습니다.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    PROJECT_ID를 Google Cloud 프로젝트의 ID로 바꿉니다.

Terraform 구성 파일에서 명시적 값을 설정하면 환경 변수가 재정의됩니다.

디렉터리 준비

각 Terraform 구성 파일에는 자체 디렉터리 (루트 모듈이라고도 함)가 있어야 합니다. 디렉터리를 만들고 해당 디렉터리 내에 새 파일을 만듭니다.

mkdir DIRECTORY && cd DIRECTORY && touch main.tf

파일 이름에는 .tf 확장자가 있어야 합니다. 예를 들어 이 빠른 시작에서는 파일을 main.tf이라고 합니다.

Terraform 구성 정의

다음 Terraform 코드 스니펫을 새로 만든 main.tf 파일에 복사합니다. 원하는 경우 GitHub에서 코드를 복사할 수 있습니다. 코드 스니펫의 오른쪽 상단에서 > GitHub에서 보기를 클릭합니다.

API 사용 설정

Terraform 샘플은 일반적으로 필요한 API가Google Cloud 프로젝트에서 사용 설정되었다고 가정합니다. 다음 코드 스니펫을 사용하여 이 빠른 시작에 필요한 API를 사용 설정합니다.

# Enable Cloud Run API
resource "google_project_service" "run" {
  service            = "run.googleapis.com"
  disable_on_destroy = false
}

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

서비스 계정 만들기 및 액세스 구성

모든 Eventarc 트리거는 IAM 서비스 계정과 연결됩니다. 이 빠른 시작을 완료하려면 사용자 관리 서비스 계정에 다음 IAM 역할을 부여해야 합니다.

다음 코드 스니펫을 사용하여 전용 서비스 계정을 만들고 이벤트를 관리할 수 있는 특정 IAM 역할을 부여합니다.

# Used to retrieve project information later
data "google_project" "project" {}

# Create a dedicated service account
resource "google_service_account" "eventarc" {
  account_id   = "eventarc-trigger-sa"
  display_name = "Eventarc trigger service account"
}

# Grant permission to invoke Cloud Run services
resource "google_project_iam_member" "runinvoker" {
  project = data.google_project.project.id
  role    = "roles/run.invoker"
  member  = "serviceAccount:${google_service_account.eventarc.email}"
}

# Grant permission to publish messages to a Pub/Sub topic
resource "google_project_iam_member" "pubsubpublisher" {
  project = data.google_project.project.id
  member  = "serviceAccount:${google_service_account.eventarc.email}"
  role    = "roles/pubsub.publisher"
}

2021년 4월 8일 이전에 Pub/Sub 서비스 에이전트를 사용 설정한 경우 서비스 에이전트에 서비스 계정 토큰 생성자 역할 (roles/iam.serviceAccountTokenCreator)을 부여합니다.

resource "google_project_iam_member" "tokencreator" {
  project  = data.google_project.project.id
  role     = "roles/iam.serviceAccountTokenCreator"
  member   = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

Cloud Run에 이벤트 수신자 배포

google_cloud_run_v2_service Terraform 리소스를 사용하여 Cloud Run 서비스를 Eventarc 트리거의 이벤트 대상으로 만듭니다.

# Deploy a Cloud Run service
resource "google_cloud_run_v2_service" "default" {
  name     = "hello-events"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # This container will log received events
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.eventarc.email
  }

  depends_on = [google_project_service.run]
}

Pub/Sub 주제를 이벤트 제공자로 만들기

google_pubsub_topic Terraform 리소스를 사용하여 Pub/Sub 주제를 만듭니다.

# Create a Pub/Sub topic
resource "google_pubsub_topic" "default" {
  name = "pubsub_topic"
}

Eventarc 트리거 만들기

google_eventarc_trigger Terraform 리소스를 사용하여 Pub/Sub 메시지를 리슨하는 Eventarc 트리거를 만듭니다.

# Create an Eventarc trigger, routing Pub/Sub events to Cloud Run
resource "google_eventarc_trigger" "default" {
  name     = "trigger-pubsub-cloudrun-tf"
  location = google_cloud_run_v2_service.default.location

  # Capture messages published to a Pub/Sub topic
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.pubsub.topic.v1.messagePublished"
  }

  # Send events to Cloud Run
  destination {
    cloud_run_service {
      service = google_cloud_run_v2_service.default.name
      region  = google_cloud_run_v2_service.default.location
    }
  }

  transport {
    pubsub {
      topic = google_pubsub_topic.default.id
    }
  }

  service_account = google_service_account.eventarc.email
  depends_on = [
    google_project_service.eventarc,
    google_project_iam_member.pubsubpublisher
  ]
}

Terraform 적용

Terraform CLI를 사용하여 구성 파일을 기반으로 인프라를 프로비저닝합니다.

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

  1. Terraform을 초기화합니다. 이 작업은 디렉터리당 한 번만 수행하면 됩니다.

    terraform init

    원하는 경우 최신 Google 공급업체 버전을 사용하려면 -upgrade 옵션을 포함합니다.

    terraform init -upgrade
  2. 구성을 검토하고 Terraform에서 만들거나 업데이트할 리소스가 예상과 일치하는지 확인합니다.

    terraform plan

    필요에 따라 구성을 수정합니다.

  3. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 Terraform 구성을 적용합니다.

    terraform apply

    일반적으로 전체 구성을 한 번에 적용합니다. 하지만 특정 리소스를 타겟팅할 수도 있습니다. 예를 들면 다음과 같습니다.

    terraform apply -target="google_eventarc_trigger.default"

    API를 사용 설정한 후 작업이 전파되고 추가 리소스를 배포할 수 있기까지 몇 분 정도 걸릴 수 있습니다. 문제가 발생하면 Terraform 구성을 다시 적용해 보세요.

    Terraform에 '적용 완료' 메시지가 표시될 때까지 기다립니다.

리소스 생성 확인

  1. Cloud Run 서비스가 생성되었는지 확인합니다.

    gcloud run services list --region us-central1
    

    출력은 다음과 비슷하게 표시됩니다.

    SERVICE: hello-events
    REGION: us-central1
    URL: https://hello-events-13335919645.us-central1.run.app
    LAST DEPLOYED BY: ...
    LAST DEPLOYED AT: 2024-12-16T15:00:52.606160Z
    
  2. Eventarc 트리거가 생성되었는지 확인합니다.

    gcloud eventarc triggers list --location us-central1
    

    출력은 다음과 비슷하게 표시됩니다.

    NAME: trigger-pubsub-cloudrun-tf
    TYPE: google.cloud.pubsub.topic.v1.messagePublished
    DESTINATION: Cloud Run service: hello-events
    ACTIVE: Yes
    LOCATION: us-central1
    

Pub/Sub 주제 이벤트 생성 및 확인

메시지를 Pub/Sub 주제에 게시하면 이벤트를 생성할 수 있습니다. Eventarc 트리거는 메시지를 Cloud Run에 배포된 이벤트 수신자 서비스로 라우팅하고 서비스는 이벤트 메시지를 로깅합니다.

  1. Pub/Sub 주제를 환경 변수로 찾아서 설정합니다.

    gcloud config set eventarc/location us-central1
    export RUN_TOPIC=$(gcloud eventarc triggers describe trigger-pubsub-cloudrun-tf \
        --format='value(transport.pubsub.topic)')
    
  2. Pub/Sub 주제에 메시지를 게시하여 이벤트를 생성합니다.

    gcloud pubsub topics publish $RUN_TOPIC --message "Hello World!"
    

    이벤트는 Cloud Run 서비스로 라우팅되어 이벤트 메시지를 로깅합니다.

  3. 서비스에서 만든 이벤트 관련 로그 항목을 보려면 다음 명령어를 실행하세요.

    gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.pubsub.topic.v1.messagePublished"'
    
  4. 다음과 같은 로그 항목을 찾습니다.

    jsonPayload:
    ...
    message: 'Received event of type google.cloud.pubsub.topic.v1.messagePublished.
        Event data: Hello World!'
    

Terraform을 사용하여 Cloud Run에 이벤트 수신자 서비스를 배포하고 Eventarc 트리거를 만들었습니다. Pub/Sub에서 이벤트를 생성하면 Cloud Run 로그에서 이벤트를 볼 수 있습니다.

삭제

이 빠른 시작에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다.

다음 명령어를 실행하고 프롬프트에 yes를 입력하여 이전에 Terraform 구성에 적용된 리소스를 삭제합니다.

terraform destroy

또는 Google Cloud 프로젝트를 삭제하여 비용 청구를 방지할 수 있습니다. Google Cloud 프로젝트를 삭제하면 프로젝트 내에서 사용되는 모든 리소스에 대한 비용 청구가 중지됩니다.

Delete a Google Cloud project:

gcloud projects delete PROJECT_ID

여러 튜토리얼과 빠른 시작을 살펴보려는 경우 프로젝트를 재사용하면 프로젝트 할당량 한도 초과를 방지할 수 있습니다.

다음 단계