Pub/Sub to Splunk ํ…œํ”Œ๋ฆฟ

Pub/Sub to Splunk ํ…œํ”Œ๋ฆฟ์€ Splunk์˜ HTTP Event Collector(HEC)๋ฅผ ํ†ตํ•ด Pub/Sub ๊ตฌ๋…์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ๊ณ  Splunk์— ๋ฉ”์‹œ์ง€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์“ฐ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” Splunk๋กœ ๋กœ๊ทธ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์›Œํฌํ”Œ๋กœ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ ค๋ฉด Dataflow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Splunk๋กœ ํ”„๋กœ๋•์…˜์— ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ๊ทธ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐฐํฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Splunk์— ์“ฐ๊ธฐ ์ „์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ๋ฉ”์‹œ์ง€ ํŽ˜์ด๋กœ๋“œ์— ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฉ”์‹œ์ง€๋Š” ์ถ”๊ฐ€์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ์žฌ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Pub/Sub ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€ ์ฃผ์ œ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

HEC ํ† ํฐ์˜ ์ถ”๊ฐ€ ๋ณด์•ˆ ๋ ˆ์ด์–ด๋กœ Cloud KMS ํ‚ค๋กœ ์•”ํ˜ธํ™”๋œ base64 ์ธ์ฝ”๋”ฉ HEC ํ† ํฐ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ Cloud KMS ํ‚ค๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. HEC ํ† ํฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud KMS API ์•”ํ˜ธํ™” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํŒŒ์ดํ”„๋ผ์ธ ์š”๊ตฌ์‚ฌํ•ญ

  • ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์†Œ์Šค Pub/Sub ๊ตฌ๋…์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— Pub/Sub ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์ฃผ์ œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Splunk HEC ์—”๋“œํฌ์ธํŠธ๋Š” Dataflow ์ž‘์—…์ž ๋„คํŠธ์›Œํฌ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Splunk HEC ํ† ํฐ์ด ์ƒ์„ฑ๋˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜

ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜

  • inputSubscription: ์ž…๋ ฅ์„ ์ฝ์„ Pub/Sub ๊ตฌ๋…์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด projects/your-project-id/subscriptions/your-subscription-name์ž…๋‹ˆ๋‹ค.
  • url : Splunk HEC URL์ž…๋‹ˆ๋‹ค. URL์€ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋˜๋Š” VPC์—์„œ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด https://splunk-hec-host:8088์ž…๋‹ˆ๋‹ค.
  • outputDeadletterTopic: ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  Pub/Sub ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด projects/<PROJECT_ID>/topics/<TOPIC_NAME>์ž…๋‹ˆ๋‹ค.

์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜

  • token : Splunk HEC ์ธ์ฆ ํ† ํฐ์ž…๋‹ˆ๋‹ค. tokenSource ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ PLAINTEXT ๋˜๋Š” KMS๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋Š” ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • batchCount : Splunk์— ์ด๋ฒคํŠธ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์น˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1(์ผ๊ด„ ์ฒ˜๋ฆฌ ์—†์Œ)์ž…๋‹ˆ๋‹ค.
  • disableCertificateValidation: SSL ์ธ์ฆ์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false(์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‚ฌ์šฉ ์„ค์ •)์ž…๋‹ˆ๋‹ค. true์ด๋ฉด ์ธ์ฆ์„œ ์œ ํšจ์„ฑ์ด ๊ฒ€์‚ฌ๋˜์ง€ ์•Š๊ณ (๋ชจ๋“  ์ธ์ฆ์„œ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์Œ) rootCaCertificatePath ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
  • parallelism: ์ตœ๋Œ€ ๋™์‹œ ์š”์ฒญ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค(๋™์‹œ ๋กœ๋“œ ์—†์Œ).
  • includePubsubMessage: ํŽ˜์ด๋กœ๋“œ์˜ ์ „์ฒด Pub/Sub ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค(๋ฐ์ดํ„ฐ ์š”์†Œ๋งŒ ํŽ˜์ด๋กœ๋“œ์— ํฌํ•จ๋จ).
  • tokenKMSEncryptionKey: HEC ํ† ํฐ ๋ฌธ์ž์—ด์„ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  Cloud KMS ํ‚ค์ž…๋‹ˆ๋‹ค. tokenSource๊ฐ€ KMS๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋Š” ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Cloud KMS ํ‚ค๊ฐ€ ์ œ๊ณต๋˜๋ฉด HEC ํ† ํฐ ๋ฌธ์ž์—ด์ด ์•”ํ˜ธํ™”๋˜์–ด ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด projects/your-project-id/locations/global/keyRings/your-keyring/cryptoKeys/your-key-name์ž…๋‹ˆ๋‹ค.
  • tokenSecretId: ํ† ํฐ์˜ Secret Manager ๋ณด์•ˆ ๋น„๋ฐ€ ID์ž…๋‹ˆ๋‹ค. tokenSource๊ฐ€ SECRET_MANAGER๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋Š” ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด projects/your-project-id/secrets/your-secret/versions/your-secret-version์ž…๋‹ˆ๋‹ค.
  • tokenSource: ํ† ํฐ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. PLAINTEXT, KMS, SECRET_MANAGER ๊ฐ’์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. tokenSource๊ฐ€ KMS, tokenKMSEncryptionKey๋กœ ์„ค์ •๋˜๊ณ  ์•”ํ˜ธํ™”๋œ ๊ฒฝ์šฐ, token์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. tokenSource๊ฐ€ SECRET_MANAGER๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ tokenSecretId๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. tokenSource๊ฐ€ PLAINTEXT๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ token๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • rootCaCertificatePath: Cloud Storage์˜ ๋ฃจํŠธ CA ์ธ์ฆ์„œ์— ๋Œ€ํ•œ ์ „์ฒด URL์ž…๋‹ˆ๋‹ค. Cloud Storage์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธ์ฆ์„œ๋Š” DER๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋˜๋Š” ์ธ์‡„ ๊ฐ€๋Šฅํ•œ (Base64) ์ธ์ฝ”๋”ฉ์œผ๋กœ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์„œ๊ฐ€ Base64 ์ธ์ฝ”๋”ฉ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ ์‹œ์ž‘ ๋ถ€๋ถ„์— -----BEGIN CERTIFICATE-----๋กœ ๋ฐ”์ธ๋”ฉ๋˜๊ณ  ๋งˆ์ง€๋ง‰์— -----END CERTIFICATE-----๋กœ ๋ฐ”์ธ๋”ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ œ๊ณต๋˜๋ฉด Splunk HEC ์—”๋“œํฌ์ธํŠธ์˜ SSL ์ธ์ฆ์„œ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋น„๊ณต๊ฐœ CA ์ธ์ฆ์„œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€ Dataflow ์ž‘์—…์ž์˜ ํŠธ๋Ÿฌ์ŠคํŠธ ์ €์žฅ์†Œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ํŠธ๋Ÿฌ์ŠคํŠธ ์ €์žฅ์†Œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด gs://mybucket/mycerts/privateCA.crt์ž…๋‹ˆ๋‹ค.
  • enableBatchLogs: Splunk์— ๊ธฐ๋ก๋œ ๋ฐฐ์น˜์— ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’: true
  • enableGzipHttpCompression: Splunk HEC๋กœ ์ „์†ก๋œ HTTP ์š”์ฒญ์„ ์••์ถ•ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(gzip ์ฝ˜ํ…์ธ  ์ธ์ฝ”๋”ฉ). ๊ธฐ๋ณธ๊ฐ’: true
  • javascriptTextTransformGcsPath: ์‚ฌ์šฉํ•  JavaScript ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)๋ฅผ ์ •์˜ํ•˜๋Š” .js ํŒŒ์ผ์˜ Cloud Storage URI์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด gs://my-bucket/my-udfs/my_file.js์ž…๋‹ˆ๋‹ค.
  • javascriptTextTransformFunctionName: ์‚ฌ์šฉํ•  JavaScript ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF) ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด JavaScript ํ•จ์ˆ˜๊ฐ€ myTransform(inJson) { /*...do stuff...*/ }์ด๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„์€ myTransform์ž…๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ JavaScript UDF๋Š” UDF ์˜ˆ์‹œ(https://github.com/GoogleCloudPlatform/DataflowTemplates#udf-examples)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • javascriptTextTransformReloadIntervalMinutes: ์ž‘์—…์ž๊ฐ€ ํŒŒ์ผ์„ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ธฐ ์œ„ํ•ด JavaScript UDF ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๊ฒฉ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜

์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด ํ…œํ”Œ๋ฆฟ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์ด ๊ฐ ์ž…๋ ฅ ์š”์†Œ์— ๋Œ€ํ•ด UDF๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ ํŽ˜์ด๋กœ๋“œ๋Š” JSON ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Dataflow ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•จ์ˆ˜ ์‚ฌ์–‘

UDF์˜ ์‚ฌ์–‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ: JSON ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”๋œ Pub/Sub ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
  • ์ถœ๋ ฅ: Splunk HEC ์ด๋ฒคํŠธ ์—”๋“œํฌ์ธํŠธ๋กœ ์ „์†กํ•  ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ์€ ๋ฌธ์ž์—ด ๋˜๋Š” ๋ฌธ์ž์—ดํ™”๋œ JSON ๊ฐ์ฒด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ์‹คํ–‰

์ฝ˜์†”

  1. Dataflow ํ…œํ”Œ๋ฆฟ์—์„œ ์ž‘์—… ๋งŒ๋“ค๊ธฐ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ…œํ”Œ๋ฆฟ์—์„œ ์ž‘์—… ๋งŒ๋“ค๊ธฐ๋กœ ์ด๋™
  3. ์ž‘์—… ์ด๋ฆ„ ํ•„๋“œ์— ๊ณ ์œ ํ•œ ์ž‘์—… ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  4. (์„ ํƒ์‚ฌํ•ญ) ๋ฆฌ์ „ ์—”๋“œํฌ์ธํŠธ์˜ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ ๊ฐ’์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฆฌ์ „์€ us-central1์ž…๋‹ˆ๋‹ค.

    Dataflow ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์ „ ๋ชฉ๋ก์€ Dataflow ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  5. Dataflow ํ…œํ”Œ๋ฆฟ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ the Pub/Sub to Splunk template์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  6. ์ œ๊ณต๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•„๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  7. (์„ ํƒ์‚ฌํ•ญ) ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌ์—์„œ ์ ์–ด๋„ ํ•œ ๋ฒˆ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ์ ์–ด๋„ ํ•œ ๋ฒˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  8. ์ž‘์—… ์‹คํ–‰์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

์…ธ ๋˜๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud dataflow jobs run JOB_NAME \
    --gcs-location gs://dataflow-templates-REGION_NAME/VERSION/Cloud_PubSub_to_Splunk \
    --region REGION_NAME \
    --staging-location STAGING_LOCATION \
    --parameters \
inputSubscription=projects/PROJECT_ID/subscriptions/INPUT_SUBSCRIPTION_NAME,\
token=TOKEN,\
url=URL,\
outputDeadletterTopic=projects/PROJECT_ID/topics/DEADLETTER_TOPIC_NAME,\
javascriptTextTransformGcsPath=PATH_TO_JAVASCRIPT_UDF_FILE,\
javascriptTextTransformFunctionName=JAVASCRIPT_FUNCTION,\
batchCount=BATCH_COUNT,\
parallelism=PARALLELISM,\
disableCertificateValidation=DISABLE_VALIDATION,\
rootCaCertificatePath=ROOT_CA_CERTIFICATE_PATH

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • JOB_NAME: ์„ ํƒํ•œ ๊ณ ์œ ํ•œ ์ž‘์—… ์ด๋ฆ„
  • REGION_NAME: Dataflow ์ž‘์—…์„ ๋ฐฐํฌํ•  ๋ฆฌ์ „(์˜ˆ: us-central1)
  • VERSION: ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ ๋ฒ„์ „

    ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • latest: ๋ฒ„ํ‚ท์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์œ„ ํด๋”(gs://dataflow-templates-REGION_NAME/latest/)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„์ „ ์ด๋ฆ„(์˜ˆ: 2023-09-12-00_RC00): ๋ฒ„ํ‚ท์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋œ ํ•ด๋‹น ์ƒ์œ„ ํด๋”(gs://dataflow-templates-REGION_NAME/)์— ์ค‘์ฒฉ๋˜์–ด ์žˆ๋Š” ํŠน์ • ๋ฒ„์ „์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • STAGING_LOCATION: ๋กœ์ปฌ ํŒŒ์ผ์˜ ์Šคํ…Œ์ด์ง• ์œ„์น˜(์˜ˆ: gs://your-bucket/staging)
  • INPUT_SUBSCRIPTION_NAME: Pub/Sub ๊ตฌ๋… ์ด๋ฆ„
  • TOKEN: Splunk์˜ Http Event Collector ํ† ํฐ
  • URL: Splunk์˜ Http Event Collector์˜ URL ๊ฒฝ๋กœ(์˜ˆ: https://splunk-hec-host:8088)
  • DEADLETTER_TOPIC_NAME: Pub/Sub ์ฃผ์ œ ์ด๋ฆ„
  • JAVASCRIPT_FUNCTION: ์‚ฌ์šฉํ•  JavaScript ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด JavaScript ํ•จ์ˆ˜๊ฐ€ myTransform(inJson) { /*...do stuff...*/ }์ด๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„์€ myTransform์ž…๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ JavaScript UDF๋Š” UDF ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • PATH_TO_JAVASCRIPT_UDF_FILE: ์‚ฌ์šฉํ•  JavaScript ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)๋ฅผ ์ •์˜ํ•˜๋Š” .js ํŒŒ์ผ์˜ Cloud Storage URI. ์˜ˆ๋ฅผ ๋“ค๋ฉด gs://my-bucket/my-udfs/my_file.js์ž…๋‹ˆ๋‹ค.
  • BATCH_COUNT: Splunk์— ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋ฐฐ์น˜ ํฌ๊ธฐ
  • PARALLELISM: Splunk์— ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋™์‹œ ์š”์ฒญ ์ˆ˜
  • DISABLE_VALIDATION: SSL ์ธ์ฆ์„œ ๊ฒ€์ฆ์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ true
  • ROOT_CA_CERTIFICATE_PATH: Cloud Storage์˜ ๋ฃจํŠธ CA ์ธ์ฆ์„œ ๊ฒฝ๋กœ(์˜ˆ: gs://your-bucket/privateCA.crt)

API

REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…œํ”Œ๋ฆฟ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด HTTP POST ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. API ๋ฐ ์Šน์ธ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ projects.templates.launch๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

POST https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/LOCATION/templates:launch?gcsPath=gs://dataflow-templates-LOCATION/VERSION/Cloud_PubSub_to_Splunk
{
   "jobName": "JOB_NAME",
   "environment": {
       "ipConfiguration": "WORKER_IP_UNSPECIFIED",
       "additionalExperiments": []
   },
   "parameters": {
       "inputSubscription": "projects/PROJECT_ID/subscriptions/INPUT_SUBSCRIPTION_NAME",
       "token": "TOKEN",
       "url": "URL",
       "outputDeadletterTopic": "projects/PROJECT_ID/topics/DEADLETTER_TOPIC_NAME",
       "javascriptTextTransformGcsPath": "PATH_TO_JAVASCRIPT_UDF_FILE",
       "javascriptTextTransformFunctionName": "JAVASCRIPT_FUNCTION",
       "batchCount": "BATCH_COUNT",
       "parallelism": "PARALLELISM",
       "disableCertificateValidation": "DISABLE_VALIDATION",
       "rootCaCertificatePath": "ROOT_CA_CERTIFICATE_PATH"
   }
}

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PROJECT_ID: Dataflow ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ ค๋Š” Google Cloud ํ”„๋กœ์ ํŠธ ID
  • JOB_NAME: ์„ ํƒํ•œ ๊ณ ์œ ํ•œ ์ž‘์—… ์ด๋ฆ„
  • LOCATION: Dataflow ์ž‘์—…์„ ๋ฐฐํฌํ•  ๋ฆฌ์ „(์˜ˆ: us-central1)
  • VERSION: ์‚ฌ์šฉํ•  ํ…œํ”Œ๋ฆฟ ๋ฒ„์ „

    ๋‹ค์Œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • latest: ๋ฒ„ํ‚ท์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์œ„ ํด๋”(gs://dataflow-templates-REGION_NAME/latest/)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„์ „ ์ด๋ฆ„(์˜ˆ: 2023-09-12-00_RC00): ๋ฒ„ํ‚ท์˜ ๋‚ ์งœ๊ฐ€ ์ง€์ •๋œ ํ•ด๋‹น ์ƒ์œ„ ํด๋”(gs://dataflow-templates-REGION_NAME/)์— ์ค‘์ฒฉ๋˜์–ด ์žˆ๋Š” ํŠน์ • ๋ฒ„์ „์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • STAGING_LOCATION: ๋กœ์ปฌ ํŒŒ์ผ์˜ ์Šคํ…Œ์ด์ง• ์œ„์น˜(์˜ˆ: gs://your-bucket/staging)
  • INPUT_SUBSCRIPTION_NAME: Pub/Sub ๊ตฌ๋… ์ด๋ฆ„
  • TOKEN: Splunk์˜ Http Event Collector ํ† ํฐ
  • URL: Splunk์˜ Http Event Collector์˜ URL ๊ฒฝ๋กœ(์˜ˆ: https://splunk-hec-host:8088)
  • DEADLETTER_TOPIC_NAME: Pub/Sub ์ฃผ์ œ ์ด๋ฆ„
  • JAVASCRIPT_FUNCTION: ์‚ฌ์šฉํ•  JavaScript ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด JavaScript ํ•จ์ˆ˜๊ฐ€ myTransform(inJson) { /*...do stuff...*/ }์ด๋ฉด ํ•จ์ˆ˜ ์ด๋ฆ„์€ myTransform์ž…๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ JavaScript UDF๋Š” UDF ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • PATH_TO_JAVASCRIPT_UDF_FILE: ์‚ฌ์šฉํ•  JavaScript ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(UDF)๋ฅผ ์ •์˜ํ•˜๋Š” .js ํŒŒ์ผ์˜ Cloud Storage URI. ์˜ˆ๋ฅผ ๋“ค๋ฉด gs://my-bucket/my-udfs/my_file.js์ž…๋‹ˆ๋‹ค.
  • BATCH_COUNT: Splunk์— ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋ฐฐ์น˜ ํฌ๊ธฐ
  • PARALLELISM: Splunk์— ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ๋™์‹œ ์š”์ฒญ ์ˆ˜
  • DISABLE_VALIDATION: SSL ์ธ์ฆ์„œ ๊ฒ€์ฆ์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ true
  • ROOT_CA_CERTIFICATE_PATH: Cloud Storage์˜ ๋ฃจํŠธ CA ์ธ์ฆ์„œ ๊ฒฝ๋กœ(์˜ˆ: gs://your-bucket/privateCA.crt)

๋‹ค์Œ ๋‹จ๊ณ„