# Terraform을 사용한 Google Cloud Pub/Sub 로그 소스 관리 (Beta)

## 개요

{% hint style="info" %}
Terraform으로 Google Cloud Pub/Sub 로그 소스를 관리하는 기능은 Panther 버전 1.121부터 오픈 베타로 제공되며, 모든 고객이 사용할 수 있습니다. 버그 보고서와 기능 요청은 Panther 지원 팀에 공유해 주세요.
{% endhint %}

Terraform에서 Panther를 사용하여 Google Cloud Pub/Sub 로그 소스를 정의할 수 있습니다. [Terraform 제공자](https://registry.terraform.io/providers/panther-labs/panther/latest).

Pub/Sub 로그 소스를 생성하는 다른 방법으로는 다음을 사용하는 방법이 있습니다. [Panther API](/ko/panther/api/rest/log-sources/pubsub-sources.md) 직접 및 [Panther Console에서 수동 생성](/ko/data-onboarding/data-transports/google/pubsub.md).

## Terraform에서 Panther Pub/Sub 로그 소스를 정의하는 방법

다음 섹션에서는 HashiCorp Configuration Language(HCL)에서 Pub/Sub 로그 소스를 정의하는 방법을 설명합니다.

#### 사전 요구 사항

* 시작하기 전에 다음 권한이 있는 API URL과 토큰이 있는지 확인하세요. `로그 소스 관리` 권한. 이는 3단계를 완료하는 데 필요합니다.
  * 필요한 경우 다음을 따르세요. [Panther Console에서 API 토큰을 생성하기 위한 이 지침](/ko/panther/api.md#how-to-create-a-panther-api-token).

### 1단계: 인증 방법 선택

* Pub/Sub 소스의 인증 방법을 다음에 나열된 옵션에서 선택하세요. [Pub/Sub 소스](/ko/data-onboarding/data-transports/google/pubsub.md#step-2-create-the-required-infrastructure-in-your-gcp-cloud).

선택한 인증 방법에 따라 아래 2단계에서 정의할 변수가 결정됩니다.

### 2단계: 변수 정의

* 다음을 정의하세요. `variables.tf` 파일에 아래 코드 블록에 표시된 Panther 변수를 포함합니다.

```hcl
variable "panther_api_token" {
  description = "Panther API 토큰"
  type        = string
}

variable "panther_api_url" {
  description = "Panther API URL"
  type        = string
}

variable "integration_label" {
  description = "통합의 이름입니다."
  type        = string
}

variable "credentials_type" {
  description = "사용되는 인증 방법입니다."
  type        = string
}

variable "subscription_id" {
  description = "Google Cloud Pub/Sub 구독 ID"
  type        = string
}

// 인증 변수는 credentials_type에 따라 다릅니다. 아래 표를 참조하세요.
variable "credentials" {
  description = "서비스 계정 JSON 키 또는 WIF 자격 증명 구성 파일 내용"
  type        = string
  sensitive   = true
}

variable "project_id" {
  description = "Google Cloud 프로젝트 ID (WIF에는 필수, 서비스 계정에는 선택 사항)"
  type        = string
}

// (선택 사항) 리전 엔드포인트
variable "regional_endpoint" {
  description = "Pub/Sub용 리전 엔드포인트"
  type        = string
}

// (선택 사항) log_stream_type = "JsonArray"일 때만 관련됨
variable "json_array_envelope_field" {
  description = "json 배열 스트림용 엔벌로프 필드"
  type        = string
}

// (선택 사항) log_stream_type = "XML"일 때만 관련됨
variable "xml_root_element" {
  description = "XML 로그 스트림의 루트 요소 이름"
  type        = string
}
```

#### **인증 방법별 변수**

다음의 `variables.tf` 파일에서 다음의 값을 포함하세요. **추가 변수** 열에서 1단계에서 선택한 인증 방법에 해당하는 값을 포함하세요.

<table><thead><tr><th width="243">인증 방법</th><th width="204">credentials_type 값</th><th>추가 변수</th></tr></thead><tbody><tr><td>서비스 계정 인증</td><td><code>service_account</code></td><td><code>credentials</code> (JSON 키파일 내용)</td></tr><tr><td>Workload Identity Federation 인증</td><td><code>wif</code></td><td><code>credentials</code> (자격 증명 구성 파일 내용), <code>project_id</code></td></tr></tbody></table>

### 3단계: 정의된 변수에 값 제공

* 다음을 추가하세요. `*.tfvars` 파일은 2단계에서 정의한 변수에 값을 할당합니다. 이 섹션을 완료하려면 사전 요구 사항 섹션에 설명된 API URL과 토큰이 필요합니다.
  * 다음의 `panther_api_url` 값은 루트 API URL이어야 합니다. 이는 다음 중 하나입니다:
    * A [GraphQL API URL](/ko/panther/api/graphql.md#step-1-identify-your-panther-graphql-api-url) 다음을 제외한 `/public/graphql` 접미사
    * A [REST API URL](/ko/panther/api/rest.md#step-1-identify-your-panther-rest-api-url) 있는 그대로 (REST URL은 루트 URL 뒤에 접미사가 없습니다)

```hcl
panther_api_token         = "XXXXXXXXXX"
panther_api_url           = "https://your-panther-url/v1"
integration_label         = "test-pubsub-integration"
credentials_type          = "service_account" // service_account 또는 wif
subscription_id           = "my-subscription"
credentials               = "{ ... }" // JSON 키파일 또는 자격 증명 구성 내용
project_id                = "my-gcp-project" // WIF에는 필수, service_account에는 선택 사항
regional_endpoint         = "us-central1-pubsub.googleapis.com" // 선택 사항
json_array_envelope_field = "records"
xml_root_element          = "" // 선택 사항, log_stream_type = "XML"일 때만 관련됨
```

### 4단계: Terraform 제공자 정의

* 다음을 추가하세요. [Panther](https://registry.terraform.io/providers/panther-labs/panther/latest) Terraform 제공자.

```hcl
terraform {
  required_providers {
    panther = {
      source = "panther-labs/panther"
      version = "~> 0.2.10"
    }
  }
}
```

### 5단계: Panther Pub/Sub 로그 소스 정의

다음 HCL 구성은 Panther에서 Pub/Sub 로그 소스를 정의합니다.

```hcl
provider "panther" {
  token = var.panther_api_token
  url   = var.panther_api_url
}

resource "panther_pubsubsource" "demo_pubsub_source" {
  integration_label   = var.integration_label
  log_stream_type     = "JSON" // 옵션: JSON, JsonArray, Auto, Lines 및 XML
  log_types           = ["GCP.AuditLog"]
  credentials_type    = var.credentials_type
  subscription_id     = var.subscription_id
  credentials         = var.credentials
  project_id          = var.project_id
  regional_endpoint   = var.regional_endpoint // 선택 사항
  // (선택 사항) log_stream_type에 따라 구성
  log_stream_type_options = {
    json_array_envelope_field = var.json_array_envelope_field // "JsonArray"에 관련됨
    xml_root_element          = var.xml_root_element          // "XML"에 관련됨
  }
}
```

### 6단계: 드롭오프 알람 구성(선택 사항)

로그 소스가 데이터 수신을 중지할 때 알러트을 트리거하려면 다음을 추가하세요. `panther_log_source_alarm` 리소스가 위에서 생성한 Pub/Sub 소스를 가리키도록 합니다:

```hcl
resource "panther_log_source_alarm" "demo_alarm" {
  source_id         = panther_pubsubsource.demo_pubsub_source.id
  type              = "SOURCE_NO_DATA"
  minutes_threshold = 60
}
```

전체 인수 참조 및 가져오기 구문은 다음을 참조하세요. [Terraform으로 로그 소스 알람 관리](/ko/panther/terraform/log-source-alarms.md).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.panther.com/ko/panther/terraform/pubsub.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
