์ธ์Šคํ„ด์Šค ๋กœ๊ทธ ๋ณด๊ธฐ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” Cloud Logging์„ ์ฐพ๊ณ  ์‚ฌ์šฉํ•˜์—ฌ Cloud SQL ์ธ์Šคํ„ด์Šค์˜ ๋กœ๊ทธ๋ฅผ ๋ณด๊ณ  ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Cloud SQL์€ Cloud Logging์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Logging ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  Cloud SQL ์ƒ˜ํ”Œ ์ฟผ๋ฆฌ๋ฅผ ๊ฒ€ํ† ํ•˜์„ธ์š”.

๋กœ๊ทธ ๋ณด๊ธฐ

Cloud SQL ์ธ์Šคํ„ด์Šค ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๋กœ๊ทธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud Logging ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud Logging์œผ๋กœ ์ด๋™

  2. ํŽ˜์ด์ง€ ์ƒ๋‹จ์—์„œ ๊ธฐ์กด Cloud SQL ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฟผ๋ฆฌ ๋นŒ๋”์—์„œ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฆฌ์†Œ์Šค: Cloud SQL Database๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”์ƒ์ž์—์„œ Cloud SQL ์ธ์Šคํ„ด์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ๋กœ๊ทธ ์ด๋ฆ„: Cloud SQL ์„น์…˜์œผ๋กœ ์Šคํฌ๋กคํ•˜๊ณ  ์ธ์Šคํ„ด์Šค์— ์ ํ•ฉํ•œ ๋กœ๊ทธ ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
      • cloudsql.googleapis.com/postgres.log
    • ์‹ฌ๊ฐ๋„: ๋กœ๊ทธ ์ˆ˜์ค€์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๊ฐ„: ๋ฏธ๋ฆฌ ์„ค์ •์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ปค์Šคํ…€ ๋ฒ”์œ„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud

gcloud logging ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ PROJECT_ID๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. limit ํ”Œ๋ž˜๊ทธ๋Š” ๋ฐ˜ํ™˜ํ•  ์ตœ๋Œ€ ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

gcloud logging read "resource.type=cloudsql_database" \
--project=PROJECT-ID \
--limit=10 \
--format=json

์ธ์Šคํ„ด์Šค ์ž‘์—… ๋กœ๊ทธ ๋ณด๊ธฐ

์ž‘์—… ์ฐฝ์—์„œ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์ฐฝ์€ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋œ ๋ชจ๋“  ์ž‘์—…๊ณผ ๋‹ค์Œ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž‘์—…์ด ์™„๋ฃŒ๋œ ์‹œ๊ฐ„(ํ˜„์ง€ ์‹œ๊ฐ„๋Œ€๋กœ ๋ณด๊ณ ๋จ)
  • ์ž‘์—…์˜ ์œ ํ˜•
  • ์ž‘์—…์˜ ์ƒํƒœ
  • ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”์‹œ์ง€

์ž‘์—…์— ์‹คํŒจํ•˜๋ฉด ์ด ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์Šคํ„ด์Šค ์ž‘์—… ๋กœ๊ทธ๋ฅผ ๋ณด๋Š” ๋ฐฉ๋ฒ•

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud SQL ์ธ์Šคํ„ด์Šค ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud SQL ์ธ์Šคํ„ด์Šค๋กœ ์ด๋™

  2. ์ธ์Šคํ„ด์Šค์˜ ๊ฐœ์š” ํŽ˜์ด์ง€๋ฅผ ์—ด๋ ค๋ฉด ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ์ž‘์—…์„ ํด๋ฆญํ•˜์—ฌ ์ž‘์—… ๋กœ๊ทธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ฐฝ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ : ์ž‘์—… ๋กœ๊ทธ์—๋Š” psql ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ด ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Google Cloud ์ฝ˜์†”, gcloud ๋ช…๋ น์ค„ ๋„๊ตฌ ๋˜๋Š” Cloud SQL Admin API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ์ž‘์—…๋งŒ ์ž‘์—… ๋กœ๊ทธ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ ๋ณด๊ธฐ

Cloud SQL์— ์—ฐ๊ฒฐ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋กœ๊ทธ๋ฅผ ๋‹ค๋ฅธ ์œ„์น˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

App Engine(๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ)

์ปดํ“จํŒ… > App Engine > ์„œ๋น„์Šค ์•„๋ž˜:

  • ์„œ๋น„์Šค ๋ชฉ๋ก์—์„œ ์„œ๋น„์Šค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ๋„๊ตฌ ๋“œ๋กญ๋‹ค์šด์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ ์„ ํƒ

Google Cloud ์ฝ˜์†”์˜ ์ž‘์—… > ๋กœ๊น… > ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ ์„น์…˜์—์„œ ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

resource.type="gae_app"
resource.labels.module_id="default"

Cloud Run

Google Cloud ์ฝ˜์†”์˜ Cloud Run ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ ์„น์…˜์—์„œ ๋กœ๊ทธ๋ฅผ ๋ด…๋‹ˆ๋‹ค. Cloud Run์€ Cloud SQL ์ธ์ฆ ํ”„๋ก์‹œ์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

resource.type="cloud_run_revision"
resource.labels.service_name="$SERVICE_NAME"
resource.labels.revision_name="$REVISION_NAME"

Cloud SQL ์ธ์ฆ ํ”„๋ก์‹œ

์ž‘์—… > ๋กœ๊น… > ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ ์•„๋ž˜์—์„œ ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

log_id("appengine.googleapis.com/cloud-sql-proxy")

๊ฐ์‚ฌ ๋กœ๊ทธ ๋ณด๊ธฐ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜•์˜ Cloud SQL ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ด€๋ฆฌ์ž ํ™œ๋™: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋‚˜ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ด€๋ฆฌ์ž ์ž‘์—…์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋กœ๊ทธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋‚˜ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ฝ๋Š” ๊ด€๋ฆฌ์ž ์ž‘์—…์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋กœ๊ทธ์—๋Š” ์‚ฌ์šฉ์ž ์ œ๊ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๋Š” ์ž‘์—…๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ: Google Cloud ์—์„œ ๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•˜๋Š” ์ž๋™ํ™”๋œ ์ž‘์—…์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋กœ๊ทธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌ์ž ํ™œ๋™, ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค, ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ๋ณด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋กœ๊ทธ ๋ณด๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฐ€๊ฒฉ ์ฑ…์ •

Cloud Logging ๊ฐ€๊ฒฉ ์ฑ…์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Logging ๊ฐ€๊ฒฉ ์ฑ…์ • ์š”์•ฝ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฌธ์ œ ํ•ด๊ฒฐ

๋ฌธ์ œ ๋ฌธ์ œ ํ•ด๊ฒฐ
Logging์€ Cloud SQL ์ธ์Šคํ„ด์Šค์—์„œ ๋งŽ์€ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊น…์„ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

log_statement ํ”Œ๋ž˜๊ทธ๋ฅผ '์—†์Œ'์œผ๋กœ ์„ค์ •ํ•˜๊ณ  logging_collector ํ”Œ๋ž˜๊ทธ๋ฅผ '๊บผ์ง'์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊น…์ด ๊ณ„์† ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋กœ๊ทธ ๊ด€๋ จ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋กœ๊ทธ๋Š” ์ž‘์—…์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ฝ๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ฃผ๋„ API ํ˜ธ์ถœ์ธ ๊ฒฝ์šฐ ๋˜๋Š” ์ž‘์—…์ด ๋ฆฌ์†Œ์Šค์˜ ๊ตฌ์„ฑ ํŒŒ์ผ ๋˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.
๋กœ๊ทธ์— ์ž‘์—… ์ •๋ณด๊ฐ€ ์—†์Œ ์ž‘์—…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ฐพ์œผ๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๋Š”๋ฐ ๋ˆ„๊ฐ€ ์‚ญ์ œํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋Š” ์ž‘์—…์ด ์‹œ์ž‘๋˜์—ˆ์Œ์„ ํ‘œ์‹œํ•˜์ง€๋งŒ ๊ทธ ์ด์ƒ์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ž์„ธํ•œ ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด(PII)๋ฅผ ๋กœ๊น…ํ•˜๋ ค๋ฉด ๊ฐ์‚ฌ ๋กœ๊น…์„ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ ํŒŒ์ผ์„ ์ฝ๊ธฐ ์–ด๋ ค์›€ ๋กœ๊ทธ๋ฅผ json ๋˜๋Š” ํ…์ŠคํŠธ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.gcloud logging read ๋ช…๋ น์–ด๋ฅผ Linux ํ›„์ฒ˜๋ฆฌ ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ๋ฅผ JSON์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud logging read \
"resource.type=cloudsql_database \
AND logName=projects/PROJECT_ID \
/logs/cloudsql.googleapis.com%2FLOG_NAME" \
--format json \
--project=PROJECT_ID \
--freshness="1d" \
> downloaded-log.json
    

๋กœ๊ทธ๋ฅผ TEXT๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud logging read \
"resource.type=cloudsql_database \
AND logName=projects/PROJECT_ID \
/logs/cloudsql.googleapis.com%2FLOG_NAME" \
--format json \
--project=PROJECT_ID \
--freshness="1d"| jq -rnc --stream 'fromstream(1|truncate_stream(inputs)) \
| .textPayload' \
--order=asc
> downloaded-log.txt
   
PostgreSQL ๋กœ๊ทธ์—์„œ ์ฟผ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ pgaudit ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1. ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    gcloud sql connect INSTANCE_NAME
          
  2. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    CREATE EXTENSION pgaudit;
          
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    gcloud sql instances patch INSTANCE_NAME \
    --database-flags=cloudsql.enable_pgaudit=on,pgaudit.log=all