IAM ์กฐ๊ฑด์œผ๋กœ ์•ก์„ธ์Šค ์ œ์–ด

์ด ๋ฌธ์„œ์—์„œ๋Š” IAM ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ BigQuery ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

IAM ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์ •๋œ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ BigQuery ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ œํ•œ๋œ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋˜๋Š” ํŠน์ • ์‹œ๊ฐ„์— ์ •๊ธฐ์ ์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค์˜ ์กฐ์ง, ํด๋”, ํ”„๋กœ์ ํŠธ, ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ˆ˜์ค€์—์„œ IAM ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ์žˆ๋Š” ํ—ˆ์šฉ ์ •์ฑ…์€ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค์— ์ƒ์†๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์ˆ˜์ค€์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฆฌ์†Œ์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

IAM ์กฐ๊ฑด์€ ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค์— ๋™์‹œ์— Identity and Access Management(IAM) ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ์—†๋Š” BigQuery ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃน์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด IAM ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  1. ์ด ๋ฌธ์„œ์˜ ๊ฐ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ํฌํ•จ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  2. IAM API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์—ญํ• 

BigQuery ๋ฆฌ์†Œ์Šค์— IAM ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋‹ค์Œ IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”.

์—ญํ•  ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด๋Ÿฌํ•œ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์—๋Š” BigQuery ๋ฆฌ์†Œ์Šค์— IAM ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ •ํ™•ํ•œ ๊ถŒํ•œ์„ ๋ณด๋ ค๋ฉด ํ•„์ˆ˜ ๊ถŒํ•œ ์„น์…˜์„ ํŽผ์น˜์„ธ์š”.

ํ•„์ˆ˜ ๊ถŒํ•œ

BigQuery ๋ฆฌ์†Œ์Šค์— IAM ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ ์กฐ๊ฑด๋ถ€ IAM ์•ก์„ธ์Šค ์„ค์ •: resourcemanager.projects.setIamPolicy
  • ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ์กฐ๊ฑด๋ถ€ IAM ์•ก์„ธ์Šค ๊ถŒํ•œ ์„ค์ •:
    • bigquery.datasets.setIamPolicy
    • bigquery.datasets.update

์ปค์Šคํ…€ ์—ญํ• ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ์ง ์ „์ฒด์— IAM ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์กฐ์ง ์ •์ฑ…์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

BigQuery์—์„œ IAM ์—ญํ•  ๋ฐ ๊ถŒํ•œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM ์†Œ๊ฐœ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

IAM API ์‚ฌ์šฉ ์„ค์ •

IAM API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

Identity and Access Management(IAM) API ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

API ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ธฐ

gcloud

gcloud services enable ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud services enable iam.googleapis.com

๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์ •์ฑ… ๋ณด๊ธฐ

๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. BigQuery ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    BigQuery๋กœ ์ด๋™

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

  3. ๊ณต์œ  > ๊ถŒํ•œ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์—ฐ๊ฒฐ๋œ ์—ญํ•  ์˜†์— ์žˆ๋Š” ์กฐ๊ฑด:TITLE์„ ํด๋ฆญํ•˜์—ฌ ํ•ด๋‹น ์—ญํ• ์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

bq

Cloud Shell์—์„œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์ •์ฑ…์„ ๋ณด๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด Cloud Shell ๋ฒ„์ „ 503.0.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ์•ก์„ธ์Šค ์ •์ฑ…์„ ๊ฐ€์ ธ์™€์„œ JSON์˜ ๋กœ์ปฌ ํŒŒ์ผ๋กœ ์ถœ๋ ฅํ•˜๋ ค๋ฉด Cloud Shell์—์„œ bq show ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

bq show --format=prettyjson PROJECT_ID:DATASET > PATH_TO_FILE

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

  • PROJECT_ID: ํ”„๋กœ์ ํŠธ ID
  • DATASET: ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ด๋ฆ„
  • PATH_TO_FILE: ๋กœ์ปฌ ๋จธ์‹ ์˜ JSON ํŒŒ์ผ ๊ฒฝ๋กœ

๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฆฌ์†Œ์Šค JSON ํŒŒ์ผ์˜ access ์†์„ฑ์—๋Š” ์•ก์„ธ์Šค ์ •์ฑ…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

API

์กฐ๊ฑด์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์•ก์„ธ์Šค ์ •์ฑ…์„ ๋ณด๋ ค๋ฉด accessPolicyVersion=3๋ฅผ ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ datasets.get์„ ํ˜ธ์ถœํ•˜์„ธ์š”. ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฆฌ์†Œ์Šค์˜ access ์†์„ฑ์—๋Š” ์•ก์„ธ์Šค ์ •์ฑ…์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค์˜ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์ˆ˜์ •

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์กฐ์ง, ํด๋” ๋˜๋Š” ํ”„๋กœ์ ํŠธ์— ์กฐ๊ฑด ์ถ”๊ฐ€

BigQuery์˜ ์กฐ์ง, ํด๋” ๋˜๋Š” ํ”„๋กœ์ ํŠธ์— ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์กฐ๊ฑด์ด ์žˆ๋Š” ์ •์ฑ… ํ—ˆ์šฉ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”. ์กฐ๊ฑด์„ ๋นŒ๋“œํ•  ๋•Œ๋Š” ์†์„ฑ ํ˜•์‹ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋ฐ์ดํ„ฐ ์„ธํŠธ์— ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์ถ”๊ฐ€

๋ฐ์ดํ„ฐ ์„ธํŠธ์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์„ ๋นŒ๋“œํ•  ๋•Œ๋Š” ์†์„ฑ ํ˜•์‹ ํ‘œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฝ˜์†”

  1. BigQuery ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    BigQuery๋กœ ์ด๋™

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

  3. ์„ธ๋ถ€์ •๋ณด ํŒจ๋„์—์„œ ๊ณต์œ  > ๊ถŒํ•œ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์ฃผ ๊ตฌ์„ฑ์› ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. ์ƒˆ ์ฃผ ๊ตฌ์„ฑ์› ํ•„๋“œ์— ์ฃผ ๊ตฌ์„ฑ์›์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  6. ์—ญํ•  ์„ ํƒ ๋ชฉ๋ก์—์„œ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ•  ๋˜๋Š” ์ปค์Šคํ…€ ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  7. IAM ์กฐ๊ฑด ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  8. ์กฐ๊ฑด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ condition ํ•„๋“œ์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  9. IAM ์กฐ๊ฑด ์ถ”๊ฐ€ ํŒจ๋„์—์„œ ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  10. DATASET์— ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ ํŒจ๋„์—์„œ ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

bq

Cloud Shell์—์„œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์ •์ฑ…์„ ๋ณด๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด Cloud Shell ๋ฒ„์ „ 503.0.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Cloud Shell์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ๋ฐ์ดํ„ฐ ์„ธํŠธ JSON ํŒŒ์ผ์˜ access ์„น์…˜์— ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ์„ธํŠธ JSON ํŒŒ์ผ์˜ access ์„น์…˜์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋ฉด 2032๋…„ 12์›” 31์ผ๊นŒ์ง€ cloudysanfrancisco@gmail.com์— roles/bigquery.dataViewer ์—ญํ• ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

"access": [
  {
    "role": "roles/bigquery.dataViewer",
    "userByEmail": "cloudysanfrancisco@gmail.com",
    "condition": {
      "title": "Grant roles/bigquery.dataViewer until 2033",
      "description": "Role expires on December 31, 2032.",
      "expression": "request.time < timestamp('2032-12-31T12:00:00Z')"
    }
  }
]

API

BigQuery API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜์— accessPolicyVersion=3์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ์— ๊ด€ํ•œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฆฌ์†Œ์Šค์˜ access.condition ์†์„ฑ์— ์•ก์„ธ์Šค ์กฐ๊ฑด์ด ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์ •์ฑ…์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” accessPolicyVersion ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ํ‘œ์ค€ ์ฝ๊ธฐ, ์ˆ˜์ •, ์—…๋ฐ์ดํŠธ ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์กฐ๊ฑด ์•ก์„ธ์Šค ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์‚ญ์ œํ•˜๊ธฐ

๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ์กฐ๊ฑด์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์„ ๋นŒ๋“œํ•  ๋•Œ๋Š” ์†์„ฑ ํ˜•์‹ ํ‘œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฝ˜์†”

  1. BigQuery ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    BigQuery๋กœ ์ด๋™

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

  3. ์„ธ๋ถ€์ •๋ณด ํŒจ๋„์—์„œ ๊ณต์œ  > ๊ถŒํ•œ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ทจ์†Œํ•˜๋ ค๋Š” ์ฃผ ๊ตฌ์„ฑ์›์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  5. ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  6. ์ฃผ ๊ตฌ์„ฑ์› ์‚ญ์ œ? ๋Œ€ํ™”์ƒ์ž์—์„œ ์‚ญ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

bq

Cloud Shell์—์„œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์ •์ฑ…์„ ๋ณด๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด Cloud Shell ๋ฒ„์ „ 503.0.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Cloud Shell์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ์ทจ์†Œ์˜ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ๋ฐ์ดํ„ฐ ์„ธํŠธ JSON ํŒŒ์ผ์˜ access ์„น์…˜์—์„œ ์กฐ๊ฑด์ด ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API

BigQuery API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ทจ์†Œํ•˜๋ ค๋ฉด ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜์— accessPolicyVersion=3์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ์ทจ์†Œ์— ๊ด€ํ•œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฆฌ์†Œ์Šค์˜ access ์†์„ฑ์—์„œ ์กฐ๊ฑด์ด ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ์ •์ฑ…์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” accessPolicyVersion ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ํ‘œ์ค€ ์ฝ๊ธฐ, ์ˆ˜์ •, ์—…๋ฐ์ดํŠธ ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์กฐ๊ฑด ์•ก์„ธ์Šค ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด ์†์„ฑ

๋‹ค์Œ ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ BigQuery ๋ฆฌ์†Œ์Šค์— IAM ์กฐ๊ฑด์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • request.time: ์‚ฌ์šฉ์ž๊ฐ€ BigQuery ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ˆ์‹œ๋Š” ๋‚ ์งœ/์‹œ๊ฐ„ ์†์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • resource.name: BigQuery ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ํ˜•์‹์€ ์†์„ฑ ํ˜•์‹์˜ ํ‘œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • resource.type: BigQuery ๋ฆฌ์†Œ์Šค์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ํ˜•์‹์€ ์†์„ฑ ํ˜•์‹์˜ ํ‘œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • resource.service: BigQuery ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. Google Cloud ํ˜•์‹์€ ์†์„ฑ ํ˜•์‹์˜ ํ‘œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • resource.tags: BigQuery ๋ฆฌ์†Œ์Šค์— ์—ฐ๊ฒฐ๋œ ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค. ํƒœ๊ทธ๋Š” BigQuery ๋ฐ์ดํ„ฐ ์„ธํŠธ, ํ…Œ์ด๋ธ”, ๋ทฐ ๋ฆฌ์†Œ์Šค์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ํ˜•์‹์€ ์†์„ฑ ํ˜•์‹ ๋ฐ IAM ๋ฌธ์„œ์˜ ํ‘œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์†์„ฑ ํ˜•์‹

BigQuery ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์กฐ๊ฑด์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๊ฐ’
resource.type bigquery.googleapis.com/Dataset
resource.name projects/PROJECT_ID/datasets/DATASET_ID
resource.service bigquery.googleapis.com
resource.tags hasTagKey, hasTagKeyId, matchTag, matchTagId๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฆฌ์†Œ์Šค ํƒœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

BigQuery ํ…Œ์ด๋ธ” ๋ฐ ๋ทฐ์˜ ์กฐ๊ฑด์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๊ฐ’
resource.type bigquery.googleapis.com/Table
resource.name projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID
resource.service bigquery.googleapis.com
resource.tags hasTagKey, hasTagKeyId, matchTag, matchTagId๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฆฌ์†Œ์Šค ํƒœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

BigQuery ๋ฃจํ‹ด์˜ ์กฐ๊ฑด์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๊ฐ’
resource.type bigquery.googleapis.com/Routine
resource.name projects/PROJECT_ID/datasets/DATASET_ID/routines/ROUTINE_ID
resource.service bigquery.googleapis.com

BigQuery ๋ชจ๋ธ์˜ ์กฐ๊ฑด์„ ๋งŒ๋“ค ๋•Œ๋Š” ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๊ฐ’
resource.type bigquery.googleapis.com/Model
resource.name projects/PROJECT_ID/datasets/DATASET_ID/models/MODEL_ID
resource.service bigquery.googleapis.com

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

  • PROJECT_ID: ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ID
  • DATASET_ID: ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ID
  • TABLE_ID: ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ํ…Œ์ด๋ธ” ๋˜๋Š” ๋ทฐ์˜ ID
  • ROUTINE_ID: ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋ฃจํ‹ด์˜ ID
  • MODEL_ID: ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋ชจ๋ธ์˜ ID

์กฐ๊ฑด ๊ถŒ์žฅ์‚ฌํ•ญ

BigQuery์—์„œ ์กฐ๊ฑด์„ ๋นŒ๋“œํ•  ๋•Œ๋Š” ๋‹ค์Œ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ๋”ฐ๋ฅด์„ธ์š”.

  • ์ •ํ™•์„ฑ์„ ๋†’์ด๋ ค๋ฉด resource.type, resource.name, resource.service์— ์–‘์ˆ˜ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ง€์›๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์€ ๋นˆ ๋ฌธ์ž์—ด๋กœ ํ‘œ์‹œ๋˜๋ฏ€๋กœ ๋ถ€์ • ์กฐ๊ฑด์ด ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค์™€ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ถ€์ • ์กฐ๊ฑด์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ˆ˜์ค€ IAM ์กฐ๊ฑด์€ ํ…Œ์ด๋ธ”, ๋ทฐ, ๋ชจ๋ธ, ๋ฃจํ‹ด๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋‚ด ๋ฆฌ์†Œ์Šค์— ์ ์šฉ๋˜๋Š” ์—ญํ• ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. bigquery.user ๋˜๋Š” bigquery.jobUser์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋˜๋Š” ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•˜๋Š” ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ˆ˜์ค€ ์ •์ฑ…์—๋Š” resource.type == 'bigquery.googleapis.com/Dataset' ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์ธ์ฆ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์†์„ฑ์€ ํ…Œ์ด๋ธ”, ๋ทฐ, ๋ฃจํ‹ด, ๋ชจ๋ธ๊ณผ ๊ฐ™์€ ํ•˜์œ„ ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ตฌ์ฒด์„ฑ ์ˆ˜์ค€์ด ํ•„์š”ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์กฐ๊ฑด์— resource.type, resource.name, resource.service๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์กฐ๊ฑด์„ ์œ ์ง€ํ•˜์—ฌ ํ–ฅํ›„ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋•Œ๋Š” ์˜๋„์น˜ ์•Š๊ฒŒ ๊ณผ๋„ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š๋„๋ก ์ตœ๋Œ€ํ•œ ์ข์€ ๋ฒ”์œ„์˜ ๊ถŒํ•œ ์ง‘ํ•ฉ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • resource.name.startsWith๋ฅผ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”. BigQuery ํ…Œ์ด๋ธ” ๋ฐ ๋ทฐ ๊ฒฝ๋กœ์—๋Š” ์ƒ์œ„ ํ”„๋กœ์ ํŠธ ID ๋ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ ID๊ฐ€ ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ์ถฉ๋ถ„ํžˆ ๊ตฌ์ฒด์ ์ด์ง€ ์•Š์œผ๋ฉด ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋ถ€์—ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ resource.name.startsWith ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ํ…Œ์ด๋ธ”์—์„œ ์™€์ผ๋“œ ์นด๋“œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ SELECT * FROM my_dataset.table_prefix* ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์„ธํŠธ, ํ…Œ์ด๋ธ”, ๋ทฐ, ๋ฃจํ‹ด, ๋ชจ๋ธ ์ด์™ธ์˜ BigQuery ๋ฆฌ์†Œ์Šค์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ์˜ฌ๋ฐ”๋ฅธ ๋ฆฌ์†Œ์Šค์— ์˜ฌ๋ฐ”๋ฅธ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌ์†Œ์Šค(bigquery.RESOURCE.list)๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์€ ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ๋ถ€์—ฌ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๋ฆฌ์†Œ์Šค(bigquery.RESOURCE.delete)๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์€ ๋ฆฌ์†Œ์Šค ์ˆ˜์ค€์—์„œ ๋ถ€์—ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จ๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ์‚ญ์ œ๋˜๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ ์‚ญ์ œ์—๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ”, ๋ชจ๋ธ, ๋ฃจํ‹ด ์‚ญ์ œ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ด๋ธ” ์Šค๋ƒ…์ƒท ๋ฐ ์‹œ๊ฐ„ ์ด๋™์€ ๊ถŒํ•œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถ€์ • ์กฐ๊ฑด

resource.name != resource์™€ ๊ฐ™์€ ๋ถ€์ • ์กฐ๊ฑด์€ ์˜๋„์น˜ ์•Š๊ฒŒ ๊ณผ๋„ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์›๋˜์ง€ ์•Š๋Š” BigQuery ๋ฆฌ์†Œ์Šค์—๋Š” ๋ฆฌ์†Œ์Šค ์†์„ฑ์ด ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๋ถ€์ • ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. BigQuery ์™ธ๋ถ€ ์„œ๋น„์Šค์˜ ๋ฆฌ์†Œ์Šค๋„ ๋ถ€์ • ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ถ€์ • ์กฐ๊ฑด์€ ์‚ฌ์šฉ์ž๊ฐ€ ์™€์ผ๋“œ ์นด๋“œ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ€์ • ์กฐ๊ฑด resource.name != /projects/my_project/datasets/my_dataset/tables/secret์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์กฐ๊ฑด์€ secret์ด๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ์—ฌ์ „ํžˆ SELECT * from my_project.my_dataset.secre*;์™€ ๊ฐ™์€ ์™€์ผ๋“œ ์นด๋“œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ…Œ์ด๋ธ”, ๋ฃจํ‹ด, ๋ชจ๋ธ์— ๋Œ€ํ•œ ๋ถ€์ • ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ์ƒ์œ„ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ๊ณผ๋„ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‚ญ์ œ ๊ถŒํ•œ์ด ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ˆ˜์ค€์—์„œ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œํ•œ์‚ฌํ•ญ

  • IAM ์กฐ๊ฑด์œผ๋กœ ์Šน์ธ๋œ ๋ทฐ, ์Šน์ธ๋œ ๋ฃจํ‹ด ๋˜๋Š” ์Šน์ธ๋œ ๋ฐ์ดํ„ฐ ์„ธํŠธ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด์ด ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋Š” ๋™์•ˆ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” accessPolicyVersion์ด ์‚ฌ์šฉ๋˜๋ฉด ๋ฐ”์ธ๋”ฉ์— withcond ๋’ค์— ํ•ด์‹œ ๊ฐ’์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •์ฑ… ๋ฐ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์—์„œ withcond ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋˜๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” Google Cloud ์ฝ˜์†”์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ ์ˆ˜์ •์€ bq ๋„๊ตฌ ๋ฐ BigQuery API๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • ํ–‰ ์ˆ˜์ค€ ๋ฐ ์—ด ์ˆ˜์ค€ ์•ก์„ธ์Šค ์ œ์–ด๋Š” IAM ์กฐ๊ฑด์„ ํ†ตํ•ด ์ง์ ‘ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ BigQuery ๊ด€๋ฆฌ์ž ์—ญํ• (roles/bigquery.admin)์„ ์ž์‹ ์—๊ฒŒ ๋ถ€์—ฌํ•œ ํ›„ ํ–‰ ๋ฐ ์—ด ์•ก์„ธ์Šค ์ •์ฑ…์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • IAM ์ •์ฑ… ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋ ค๋ฉด ์ตœ๋Œ€ 5๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” INFORMATION_SCHEMA ๋ทฐ๋ฅผ ์ฟผ๋ฆฌํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด๋ถ€ ํ…Œ์ด๋ธ” ์•ก์„ธ์Šค ๊ถŒํ•œ๋งŒ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ํ…Œ์ด๋ธ” ์™€์ผ๋“œ ์นด๋“œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ

๋‹ค์Œ์€ BigQuery์—์„œ IAM ์กฐ๊ฑด์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

ํŠน์ • ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ

์ด ์˜ˆ์‹œ์—์„œ๋Š” cloudysanfrancisco@gmail.com์—๊ฒŒ dataset_1 ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ table_1 ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ BigQuery ๋ฐ์ดํ„ฐ ๋ทฐ์–ด ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ญํ• ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” bq ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ”์„ ์ฟผ๋ฆฌํ•˜๊ณ  ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ bigquery.tables.list ๊ถŒํ•œ์ด ์—†์œผ๋ฏ€๋กœ Google Cloud ์ฝ˜์†”์—์„œ ํ…Œ์ด๋ธ”์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataViewer,
  "condition": {
    "title": "Table dataset_1.table_1",
    "description": "Allowed to read table with name table_1 in dataset_1 dataset",
    "expression":
resource.name == projects/project_1/datasets/dataset_1/tables/table_1
&& resource.type == bigquery.googleapis.com/Table
  }
}

ํŠน์ • ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ ๋‚˜์—ด ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ

์ด ์˜ˆ์‹œ์—์„œ๋Š” cloudysanfrancisco@gmail.com์—๊ฒŒ dataset_2 ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋Œ€ํ•œ BigQuery ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ทฐ์–ด ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ญํ• ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.metadataViewer,
  "condition": {
    "title": "Dataset dataset_2",
    "description": "Allowed to list resources in dataset_2 dataset",
    "expression":
resource.name == projects/project_2/datasets/dataset_2
&& resource.type == bigquery.googleapis.com/Dataset
  }
}

ํŠน์ • ํ”„๋ฆฌํ”ฝ์Šค๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์†Œ์œ ์ž ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ

์ด ์˜ˆ์—์„œ๋Š” cloudysanfrancisco@gmail.com์—๊ฒŒ public_ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋ชจ๋“  ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ BigQuery ๋ฐ์ดํ„ฐ ์†Œ์œ ์ž ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables public_",
    "description": "Allowed owner access to tables in datasets with public_ prefix",
    "expression":
resource.name.startsWith("projects/project_3/datasets/public_")
&& resource.type == bigquery.googleapis.com/Table
  }
}

ํŠน์ • ํ”„๋ฆฌํ”ฝ์Šค๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋ชจ๋“  ํ…Œ์ด๋ธ”, ๋ชจ๋ธ, ๋ฃจํ‹ด์— ๋Œ€ํ•œ ์†Œ์œ ์ž ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ

์ด ์˜ˆ์—์„œ๋Š” cloudysanfrancisco@gmail.com์—๊ฒŒ general_ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋ชจ๋“  ํ…Œ์ด๋ธ”, ๋ชจ๋ธ, ๋ฃจํ‹ด์— ๋Œ€ํ•œ BigQuery ๋ฐ์ดํ„ฐ ์†Œ์œ ์ž ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables general_",
    "description": "Allowed owner access to tables in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Table
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Models general_",
    "description": "Allowed owner access to models in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Model
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Routines general_",
    "description": "Allowed owner access to routines in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Routine
  }
}

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