ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ

์ด ๋ฌธ์„œ์—์„œ๋Š” Google Cloud ์ฝ˜์†”, bq update ๋ช…๋ น์–ด, tables.patch API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์— ๋Œ€ํ•ด ์„ค๋ช…, ๋งŒ๋ฃŒ์ผ ๋˜๋Š” ์•ก์„ธ์Šค ์ •์ฑ…์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” BigQuery์˜ ํ…Œ์ด๋ธ” ๋ฐ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์— ์ต์ˆ™ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ ๋ฐ ์—ญํ• 

์ด ์„น์…˜์—์„œ๋Š” ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์— ๋Œ€ํ•ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ Identity and Access Management(IAM) ๊ถŒํ•œ ๋ฐ ์ด๋Ÿฌํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์‚ฌ์ „ ์ •์˜๋œ IAM ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ

ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ ๋ฆฌ์†Œ์Šค
bigquery.tables.update ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท

์—ญํ• 

ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์ „ ์ •์˜๋œ BigQuery ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ญํ•  ๋ฆฌ์†Œ์Šค
๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ:

bigquery.dataEditor
bigquery.dataOwner
biguqery.admin
ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท

์ œํ•œ์‚ฌํ•ญ

ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท ๋ฐ์ดํ„ฐ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋จผ์ € ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์„ ํ‘œ์ค€ ํ…Œ์ด๋ธ”๋กœ ๋ณต์›ํ•œ ํ›„ ํ‘œ์ค€ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท ๋ณต์›์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ

ํ‘œ์ค€ ํ…Œ์ด๋ธ”์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ์„ค๋ช…, ๋งŒ๋ฃŒ ๋ฐ ์•ก์„ธ์Šค ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„น์…˜์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ๊ฐ€ ์ œ๊ณต๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช… ์—…๋ฐ์ดํŠธ

๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ์„ค๋ช…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

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

    BigQuery๋กœ ์ด๋™

  2. ํƒ์ƒ‰๊ธฐ ์ฐฝ์—์„œ ์—…๋ฐ์ดํŠธํ•  ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ํ”„๋กœ์ ํŠธ ๋ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋…ธ๋“œ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ์ด๋ฆ„์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ํ‘œ์‹œ๋œ ์Šค๋ƒ…์ƒท ์ฐฝ์—์„œ ์„ธ๋ถ€์ •๋ณด ํƒญ์„ ํด๋ฆญํ•œ ํ›„ ์„ธ๋ถ€์ •๋ณด ์ˆ˜์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. ์„ค๋ช… ํ•„๋“œ์—์„œ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  6. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

bq

Cloud Shell์— ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Cloud Shell๋กœ ์ด๋™

bq update \
--description="DESCRIPTION" \
PROJECT_ID:DATASET_NAME.SNAPSHOT_NAME

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

  • DESCRIPTION: ์Šค๋ƒ…์ƒท์„ ์„ค๋ช…ํ•˜๋Š” ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด Snapshot after table schema change X.์ž…๋‹ˆ๋‹ค.
  • PROJECT_ID: ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID
  • DATASET_NAME: ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„
  • SNAPSHOT_NAME: ์Šค๋ƒ…์ƒท ์ด๋ฆ„

API

๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ tables.patch ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’
projectId ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
datasetId ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
tableId ์Šค๋ƒ…์ƒท์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
์š”์ฒญ ๋ณธ๋ฌธ description ํ•„๋“œ ์Šค๋ƒ…์ƒท์„ ์„ค๋ช…ํ•˜๋Š” ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด Snapshot after table schema change X์ž…๋‹ˆ๋‹ค.

tables.update ๋ฉ”์„œ๋“œ๊ฐ€ ์ „์ฒด Table ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— tables.update ๋ฉ”์„œ๋“œ๋ณด๋‹ค๋Š” tables.patch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋งŒ๋ฃŒ ์—…๋ฐ์ดํŠธ

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

์ฝ˜์†”

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

    BigQuery๋กœ ์ด๋™

  2. ํƒ์ƒ‰๊ธฐ ์ฐฝ์—์„œ ์—…๋ฐ์ดํŠธํ•  ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ํ”„๋กœ์ ํŠธ ๋ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋…ธ๋“œ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ์ด๋ฆ„์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ํ‘œ์‹œ๋œ ์Šค๋ƒ…์ƒท ์ฐฝ์—์„œ ์„ธ๋ถ€์ •๋ณด ํƒญ์„ ํด๋ฆญํ•œ ํ›„ ์„ธ๋ถ€์ •๋ณด ์ˆ˜์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ํ•„๋“œ์— ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ์ƒˆ๋กœ์šด ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  6. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

bq

Cloud Shell์— ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Cloud Shell๋กœ ์ด๋™

bq update \
--expiration=EXPIRATION_TIME \
PROJECT_ID:DATASET_NAME.SNAPSHOT_NAME

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

  • EXPIRATION_TIME: ํ˜„์žฌ ์‹œ๊ฐ„๋ถ€ํ„ฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„๊นŒ์ง€์˜ ์ดˆ ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • PROJECT_ID: ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID
  • DATASET_NAME: ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„
  • SNAPSHOT_NAME: ์Šค๋ƒ…์ƒท ์ด๋ฆ„

API

๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ tables.patch ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’
projectId ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
datasetId ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
tableId ์Šค๋ƒ…์ƒท์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
์š”์ฒญ ๋ณธ๋ฌธ expirationTime ํ•„๋“œ ์Šค๋ƒ…์ƒท์ด ๋งŒ๋ฃŒ๋˜๋Š” ์‹œ๊ฐ„(์—ํฌํฌ ์ดํ›„์˜ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„ ๊ฒฝ๊ณผ ์‹œ๊ฐ„)์ž…๋‹ˆ๋‹ค.

tables.update ๋ฉ”์„œ๋“œ๊ฐ€ ์ „์ฒด Table ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— tables.update ๋ฉ”์„œ๋“œ๋ณด๋‹ค๋Š” tables.patch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ์—…๋ฐ์ดํŠธ

๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

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

    BigQuery๋กœ ์ด๋™

  2. ํƒ์ƒ‰๊ธฐ ์ฐฝ์—์„œ ์—…๋ฐ์ดํŠธํ•  ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ํ”„๋กœ์ ํŠธ ๋ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋…ธ๋“œ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์˜ ์ด๋ฆ„์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ํ‘œ์‹œ๋œ ์Šค๋ƒ…์ƒท ์ฐฝ์—์„œ ๊ณต์œ ๋ฅผ ํด๋ฆญํ•œ ํ›„ ์ฃผ ๊ตฌ์„ฑ์› ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. ํ‘œ์‹œ๋œ ์ฃผ ๊ตฌ์„ฑ์› ์ถ”๊ฐ€ ์ฐฝ์—์„œ ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์— ๋Œ€ํ•ด ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ฃผ ๊ตฌ์„ฑ์›์˜ ์‹๋ณ„์ž๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  6. ์—ญํ•  ์„ ํƒ ๋“œ๋กญ๋‹ค์šด์—์„œ BigQuery, BigQuery ๋ฐ์ดํ„ฐ ๋ทฐ์–ด๋ฅผ ์ฐจ๋ก€๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  7. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

bq

Cloud Shell์— ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

Cloud Shell๋กœ ์ด๋™

bq add-iam-policy-binding \
    --member="user:PRINCIPAL" \
    --role="roles/bigquery.dataViewer" \
    PROJECT_ID:DATASET_NAME.SNAPSHOT_NAME

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

  • PRINCIPAL: ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ฃผ ๊ตฌ์„ฑ์›์ž…๋‹ˆ๋‹ค.
  • PROJECT_ID: ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID
  • DATASET_NAME: ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„
  • SNAPSHOT_NAME: ์Šค๋ƒ…์ƒท ์ด๋ฆ„

API

๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ tables.setIamPolicy ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’
Resource
projects/PROJECT_ID/datasets/DATASET_NAME/tables/SNAPSHOT_NAME
์š”์ฒญ ๋ณธ๋ฌธ
{
      "policy": {
        "bindings": [
          {
            "members": [
              "user:PRINCIPAL"
            ],
            "role": "roles/bigquery.dataViewer"
          }
        ]
      }
    }

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

  • PROJECT_ID: ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID
  • DATASET_NAME: ์Šค๋ƒ…์ƒท์ด ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„
  • SNAPSHOT_NAME: ์Šค๋ƒ…์ƒท ์ด๋ฆ„
  • PRINCIPAL: ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ฃผ ๊ตฌ์„ฑ์›์ž…๋‹ˆ๋‹ค.

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