๋ฆฌ์†Œ์Šค ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ๊ตฌ์„ฑ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ํ—ˆ์šฉ ์ •์ฑ…์—์„œ ์กฐ๊ฑด๋ถ€ ์—ญํ•  ๊ฒฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด ํ‘œํ˜„์‹์—์„œ ๋ฆฌ์†Œ์Šค ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฃผ ๊ตฌ์„ฑ์›์ด ๊ถŒํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„, ์œ ํ˜•, Google Cloud ์„œ๋น„์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • IAM ์กฐ๊ฑด๋ถ€ ์—ญํ•  ๊ฒฐํ•ฉ์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Identity and Access Management(IAM) ์กฐ๊ฑด ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์กฐ๊ฑด ํ‘œํ˜„์‹์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค ์†์„ฑ์„ ๊ฒ€ํ† ํ•˜์„ธ์š”.
  • ๋ฆฌ์†Œ์Šค ์ด๋ฆ„ ์†์„ฑ์€ ๋‹ค์Œ Google Cloud ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Apigee
    • Application Integration
    • Apigee API ํ—ˆ๋ธŒ
    • ๋ฐฑ์—… ๋ฐ DR ์„œ๋น„์Šค
    • BigQuery
    • BigQuery Reservation API
    • Bigtable
    • Binary Authorization
    • Cloud Deploy
    • Cloud Key Management Service
    • Cloud Logging
    • Cloud SQL
    • Cloud Storage
    • Compute Engine
    • Dataform
    • Google Kubernetes Engine
    • Firestore
    • Integration Connectors
    • Apache Kafka์šฉ Google Cloud ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค
    • Pub/Sub ๋ผ์ดํŠธ
    • Secret Manager
    • Spanner

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

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

  • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ IAM ๊ด€๋ฆฌ์ž(roles/resourcemanager.projectIamAdmin)
  • ํด๋”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ํด๋”์— ๋Œ€ํ•œ ํด๋” ๊ด€๋ฆฌ์ž(roles/resourcemanager.folderAdmin)
  • ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ์กฐ์ง์— ๋Œ€ํ•œ ์กฐ์ง ๊ด€๋ฆฌ์ž(roles/resourcemanager.organizationAdmin)
  • ๊ฑฐ์˜ ๋ชจ๋“  Google Cloud ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ, ํด๋” ๋˜๋Š” ์กฐ์ง์— ๋Œ€ํ•œ ๋ณด์•ˆ ๊ด€๋ฆฌ์ž(roles/iam.securityAdmin)

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

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

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

์กฐ๊ฑด๋ถ€ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๊ด€๋ฆฌ:
    • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ resourcemanager.projects.getIamPolicy ๊ถŒํ•œ
    • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ resourcemanager.projects.setIamPolicy ๊ถŒํ•œ
  • ํด๋”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ:
    • ํด๋”์— ๋Œ€ํ•œ resourcemanager.folders.getIamPolicy ๊ถŒํ•œ
    • ํด๋”์— ๋Œ€ํ•œ resourcemanager.folders.setIamPolicy ๊ถŒํ•œ
  • ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๊ด€๋ฆฌ:
    • ์กฐ์ง์— ๋Œ€ํ•œ resourcemanager.organizations.getIamPolicy ๊ถŒํ•œ
    • ์กฐ์ง์— ๋Œ€ํ•œ resourcemanager.organizations.setIamPolicy ๊ถŒํ•œ

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

๋ฆฌ์†Œ์Šค ์ด๋ฆ„ ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃน์— ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ

์กฐ๊ฑด๋ถ€ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฆ„์ด ํŠน์ • ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๋Š” Compute Engine ๊ฐ€์ƒ ๋จธ์‹ (VM) ์ธ์Šคํ„ด์Šค์™€ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์ด ํ”„๋ฆฌํ”ฝ์Šค์™€ ์ผ์น˜ํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์ด๋ฆ„ ํ”„๋ฆฌํ”ฝ์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ๋ชฉ์ ์„ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค ๋˜๋Š” ํŠน์ • ์†์„ฑ์ด ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฏผ๊ฐํ•œ ์˜๋ฃŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • VM ์ธ์Šคํ„ด์Šค์—์„œ ์›Œํฌ๋กœ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์„ธ์š”. ๋ฏผ๊ฐํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ๋Š” ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” VM ์ธ์Šคํ„ด์Šค์— ์ œํ•œ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•˜๋„๋ก ์„ค์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” VM ์ธ์Šคํ„ด์Šค์—๋Š” sensitiveAccess ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ณ  ๋‹ค๋ฅธ VM ์ธ์Šคํ„ด์Šค์—๋Š” devAccess ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ํ›„ ์กฐ๊ฑด๋ถ€ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๋ฐ˜์ ์ธ devAccess VM ์ธ์Šคํ„ด์Šค๋Š” ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ sensitiveAccess VM ์ธ์Šคํ„ด์Šค์—๋Š” ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

resource.name ์กฐ๊ฑด ์†์„ฑ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ resource.type ์†์„ฑ๊ณผ resource.service ์†์„ฑ๋„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์‚ฌํ•œ ์ด๋ฆ„์˜ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์— ๋Œ€ํ•œ ์•ก์„ธ์Šค์— ์กฐ๊ฑด์ด ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค. ์ด ์„น์…˜์˜ ์˜ˆ์‹œ์—์„œ๋Š” resource.name ์†์„ฑ๊ณผ resource.type ์†์„ฑ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ Compute Engine ๋””์Šคํฌ ๋ฐ ์ธ์Šคํ„ด์Šค์— ์ด๋ฆ„ ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

์ฝ˜์†”

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

    IAM ํŽ˜์ด์ง€๋กœ ์ด๋™

  2. ์ฃผ ๊ตฌ์„ฑ์› ๋ชฉ๋ก์—์„œ ์›ํ•˜๋Š” ์ฃผ ๊ตฌ์„ฑ์›์„ ์ฐพ๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ถŒํ•œ ์ˆ˜์ • ํŒจ๋„์—์„œ ์กฐ๊ฑด์„ ๊ตฌ์„ฑํ•  ์—ญํ• ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ IAM ์กฐ๊ฑด(์„ ํƒ์‚ฌํ•ญ)์—์„œ IAM ์กฐ๊ฑด ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์กฐ๊ฑด ์ˆ˜์ • ํŒจ๋„์—์„œ ์กฐ๊ฑด์˜ ์ œ๋ชฉ ๋ฐ ์„ค๋ช…(์„ ํƒ์‚ฌํ•ญ)์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  5. ์กฐ๊ฑด ์ž‘์„ฑ ๋„๊ตฌ ๋˜๋Š” ์กฐ๊ฑด ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด ํ‘œํ˜„์‹์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด ๋นŒ๋”์—์„œ๋Š” ํ‘œํ˜„์‹์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ์กฐ๊ฑด ์œ ํ˜•, ์—ฐ์‚ฐ์ž, ๊ธฐํƒ€ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์„ธ๋ถ€์ •๋ณด๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ™”ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด ํŽธ์ง‘๊ธฐ์—์„œ๋Š” CEL ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„์‹์„ ์ˆ˜๋™์œผ๋กœ ์ž…๋ ฅํ•˜๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    ์กฐ๊ฑด ์ž‘์„ฑ ๋„๊ตฌ:

    1. ์กฐ๊ฑด ์ž‘์„ฑ ๋„๊ตฌ์—์„œ ๊ธฐ์กด ์กฐ๊ฑด ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด ์ž‘์„ฑ ๋„๊ตฌ์—์„œ ์œ ์ผํ•œ ํ•„ํ„ฐ๋Š” ์ถ”๊ฐ€ ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค.
    2. ๋ฆฌ์†Œ์Šค๊ฐ€ ์ง€์ •๋œ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋””์Šคํฌ์ธ ๊ฒฝ์šฐ true๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ทธ๋ฃนํ™”๋œ ์กฐ๊ฑด ํ‘œํ˜„์‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      1. ์ถ”๊ฐ€ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•œ ํ›„ ๊ทธ๋ฃนํ™”๋œ ์กฐ๊ฑด์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
      2. ์กฐ๊ฑด ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ ๋ฆฌ์†Œ์Šค > ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      3. ์—ฐ์‚ฐ์ž ๋“œ๋กญ๋‹ค์šด์—์„œ ์ผ์น˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      4. ๋ฆฌ์†Œ์Šค ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ compute.googleapis.com/Disk๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      5. ๋ฐฉ๊ธˆ ์ž…๋ ฅํ•œ ์กฐ๊ฑด ๋ฐ”๋กœ ์•„๋ž˜ ์ฒซ ๋ฒˆ์งธ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ํ‘œํ˜„์‹์— ๋‹ค๋ฅธ ์ ˆ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      6. ์กฐ๊ฑด ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ ๋ฆฌ์†Œ์Šค > ์ด๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      7. ์—ฐ์‚ฐ์ž ๋“œ๋กญ๋‹ค์šด์—์„œ ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      8. ๊ฐ’ ํ•„๋“œ์— ์›ํ•˜๋Š” ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ์ ํ•ฉํ•œ ํ˜•์‹์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด projects/PROJECT_ID/region/ZONE_ID/disks/PREFIX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PROJECT_ID ํ”„๋กœ์ ํŠธ ๋ฐ ์ด๋ฆ„์ด PREFIX๋กœ ์‹œ์ž‘ํ•˜๋Š” ZONE_ID ์˜์—ญ์˜ ๋””์Šคํฌ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
      9. ๊ฐ ์กฐ๊ฑด ์œ ํ˜•์˜ ์™ผ์ชฝ์—์„œ And๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋‘ ์ ˆ์ด ๋ชจ๋‘ true์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    3. ๋ฆฌ์†Œ์Šค๊ฐ€ ์ง€์ •๋œ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ธ์Šคํ„ด์Šค์ธ ๊ฒฝ์šฐ true๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ทธ๋ฃนํ™”๋œ ์กฐ๊ฑด ํ‘œํ˜„์‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      1. ๊ธฐ์กด ์กฐ๊ฑด ๊ทธ๋ฃน ์™ธ๋ถ€์—์„œ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํ›„ ๊ทธ๋ฃนํ™”๋œ ์กฐ๊ฑด์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
      2. ์กฐ๊ฑด ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ ๋ฆฌ์†Œ์Šค > ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      3. ์—ฐ์‚ฐ์ž ๋“œ๋กญ๋‹ค์šด์—์„œ ์ผ์น˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      4. ๋ฆฌ์†Œ์Šค ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ compute.googleapis.com/Instance๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      5. ๋™์ผํ•œ ์กฐ๊ฑด ๊ทธ๋ฃน์—์„œ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
      6. ์กฐ๊ฑด ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ ๋ฆฌ์†Œ์Šค > ์ด๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      7. ์—ฐ์‚ฐ์ž ๋“œ๋กญ๋‹ค์šด์—์„œ ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      8. ๊ฐ’ ํ•„๋“œ์— ์›ํ•˜๋Š” ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ํ•ฉํ•œ ํ˜•์‹์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PROJECT_ID ํ”„๋กœ์ ํŠธ ๋ฐ ์ด๋ฆ„์ด PREFIX๋กœ ์‹œ์ž‘ํ•˜๋Š” ZONE_ID ์˜์—ญ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
      9. ๊ทธ๋ฃน์˜ ์กฐ๊ฑด์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๊ฐ€ And๋กœ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    4. ๋ฆฌ์†Œ์Šค๊ฐ€ ๋””์Šคํฌ ๋˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด true๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ทธ๋ฃนํ™”๋œ ์กฐ๊ฑด ํ‘œํ˜„์‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      1. ๊ธฐ์กด ์กฐ๊ฑด ๊ทธ๋ฃน ์™ธ๋ถ€์—์„œ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํ›„ ๊ทธ๋ฃนํ™”๋œ ์กฐ๊ฑด์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
      2. ์กฐ๊ฑด ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ ๋ฆฌ์†Œ์Šค > ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      3. ์—ฐ์‚ฐ์ž ๋“œ๋กญ๋‹ค์šด์—์„œ ๋‹ค๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      4. ๋ฆฌ์†Œ์Šค ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ compute.googleapis.com/Disk๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      5. ๋™์ผํ•œ ์กฐ๊ฑด ๊ทธ๋ฃน์—์„œ ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
      6. ์กฐ๊ฑด ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ ๋ฆฌ์†Œ์Šค > ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      7. ์—ฐ์‚ฐ์ž ๋“œ๋กญ๋‹ค์šด์—์„œ ๋‹ค๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      8. ๋ฆฌ์†Œ์Šค ์œ ํ˜• ๋“œ๋กญ๋‹ค์šด์—์„œ compute.googleapis.com/Instance๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
      9. ๊ทธ๋ฃน์˜ ์กฐ๊ฑด์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๊ฐ€ And๋กœ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    5. ์กฐ๊ฑด ํ‘œํ˜„์‹์˜ ๋ชจ๋“  ๊ทธ๋ฃน์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๊ฐ€ Or์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์กฐ๊ฑด ์ž‘์„ฑ ๋„๊ตฌ๊ฐ€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    6. ์ €์žฅ์„ ํด๋ฆญํ•˜์—ฌ ์กฐ๊ฑด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    7. ์กฐ๊ฑด ์ˆ˜์ • ํŒจ๋„์ด ๋‹ซํžˆ๋ฉด ๊ถŒํ•œ ์ˆ˜์ • ํŒจ๋„์—์„œ ์ €์žฅ์„ ๋‹ค์‹œ ํด๋ฆญํ•˜์—ฌ ํ—ˆ์šฉ ์ •์ฑ…์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    ์กฐ๊ฑด ํŽธ์ง‘๊ธฐ:

    1. ์กฐ๊ฑด ํŽธ์ง‘๊ธฐ ํƒญ์„ ํด๋ฆญํ•˜๊ณ  ๋‹ค์Œ ํ‘œํ˜„์‹์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

      (resource.type == "compute.googleapis.com/Disk" &&
      resource.name.startsWith("projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX")) ||
      (resource.type == "compute.googleapis.com/Instance" &&
      resource.name.startsWith("projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX")) ||
      (resource.type != "compute.googleapis.com/Disk" &&
      resource.type != "compute.googleapis.com/Instance")
    2. ํ‘œํ˜„์‹์„ ์ž…๋ ฅํ•œ ํ›„ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ํ…์ŠคํŠธ ์ƒ์ž ์œ„์— ์žˆ๋Š” ๋ฆฐํ„ฐ ์‹คํ–‰์„ ํด๋ฆญํ•˜์—ฌ CEL ๋ฌธ๋ฒ•์„ ๋ฆฐํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    3. ์ €์žฅ์„ ํด๋ฆญํ•˜์—ฌ ์กฐ๊ฑด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    4. ์กฐ๊ฑด ์ˆ˜์ • ํŒจ๋„์ด ๋‹ซํžˆ๋ฉด ๊ถŒํ•œ ์ˆ˜์ • ํŒจ๋„์—์„œ ์ €์žฅ์„ ๋‹ค์‹œ ํด๋ฆญํ•˜์—ฌ ํ—ˆ์šฉ ์ •์ฑ…์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

gcloud

ํ—ˆ์šฉ ์ •์ฑ…์€ ์ฝ๊ธฐ-์ˆ˜์ •-์“ฐ๊ธฐ ํŒจํ„ด์„ ํ†ตํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

gcloud projects get-iam-policy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ํ˜„์žฌ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ—ˆ์šฉ ์ •์ฑ…์˜ JSON ๋ฒ„์ „์ด ๋””์Šคํฌ์˜ ๊ฒฝ๋กœ๋กœ ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด:

gcloud projects get-iam-policy project-id --format=json > filepath

ํ—ˆ์šฉ ์ •์ฑ…์˜ JSON ํ˜•์‹์ด ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "group:my-group@example.com"
      ],
      "role": "roles/compute.instanceAdmin"
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 1
}

๋ฆฌ์†Œ์Šค ์ด๋ฆ„ ํ”„๋ฆฌํ”ฝ์Šค ์กฐ๊ฑด์œผ๋กœ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ฐ•์กฐํ‘œ์‹œ๋œ ์กฐ๊ฑด ํ‘œํ˜„์‹์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. gcloud CLI์—์„œ ๋ฒ„์ „์„ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "group:my-group@example.com"
      ],
      "role": "roles/compute.instanceAdmin",
      "condition": {
          "title": "PREFIX_only",
          "description": "Only gives access to VMs with the PREFIX prefix",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

๋‹ค์Œ์œผ๋กœ gcloud projects set-iam-policy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ƒˆ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

gcloud projects set-iam-policy project-id filepath

์ƒˆ ์กฐ๊ฑด๋ถ€ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๋ฃน์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์—ญํ•  ๋ฐ”์ธ๋”ฉ์˜ ๊ตฌ์„ฑ์›์ด ๋””์Šคํฌ ๋ฐ ์ธ์Šคํ„ด์Šค ๊ถŒํ•œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ด๋ฆ„์ด ์ง€์ •๋œ ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋””์Šคํฌ ๋ฐ ์ธ์Šคํ„ด์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญํ•  ๋ฐ”์ธ๋”ฉ์˜ ๊ตฌ์„ฑ์›์ด ์ธ์Šคํ„ด์Šค ๊ด€๋ฆฌ์ž ์—ญํ• (roles/compute.instanceAdmin)์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ถŒํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋””์Šคํฌ ๋ฐ ์ธ์Šคํ„ด์Šค ์™ธ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

REST

์ฝ๊ธฐ-์ˆ˜์ •-์“ฐ๊ธฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ํ”„๋กœ์ ํŠธ์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ฝ์Šต๋‹ˆ๋‹ค.

Resource Manager API์˜ projects.getIamPolicy ๋ฉ”์„œ๋“œ๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PROJECT_ID: Google Cloud ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • POLICY_VERSION: ๋ฐ˜ํ™˜ํ•  ์ •์ฑ… ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์—๋Š” ์ •์ฑ… ๋ฒ„์ „ 3์ธ ์ตœ์‹  ์ •์ฑ… ๋ฒ„์ „์ด ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ •์ฑ… ๋ฒ„์ „ ์ง€์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy

JSON ์š”์ฒญ ๋ณธ๋ฌธ:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ JSON ์‘๋‹ต์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:my-user@example.com
      ]
    },
    {
      "members": [
        "group:my-group@example.com"
      ],
      "role": "roles/compute.instanceAdmin"
    }
  ]
}

๋‹ค์Œ์œผ๋กœ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ์ •์ฑ…์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. version ํ•„๋“œ๋ฅผ 3 ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:my-user@example.com"
      ]
    },
    {
      "role": "roles/compute.instanceAdmin",
      "members": [
        "group:my-group@example.com"
      ],
      "condition": {
          "title": "PREFIX_only",
          "description": "Only gives access to VMs with the PREFIX prefix",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
      }
    }
  ]
}

๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

Resource Manager API์˜ projects.setIamPolicy ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญ์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ํ”„๋กœ์ ํŠธ์˜ ์ƒˆ ํ—ˆ์šฉ ์ •์ฑ…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PROJECT_ID: Google Cloud ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

JSON ์š”์ฒญ ๋ณธ๋ฌธ:

{
  "policy": {
    "version": 3,
    "etag": "BwWKmjvelug=",
    "bindings": [
      {
        "role": "roles/owner",
        "members": [
          "user:my-user@example.com"
        ]
      },
      {
        "role": "roles/compute.instanceAdmin",
        "members": [
          "group:my-group@example.com"
        ],
        "condition": {
          "title": "Dev_access_only",
          "description": "Only access to devAccess* VMs",
          "expression":
            "(resource.type == 'compute.googleapis.com/Disk' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
            (resource.type == 'compute.googleapis.com/Instance' &&
            resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
            (resource.type != 'compute.googleapis.com/Instance' &&
            resource.type != 'compute.googleapis.com/Disk')"
        }
      }
    ]
  }
}

์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

์‘๋‹ต์—๋Š” ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.


๋ฆฌ์†Œ์Šค ์ด๋ฆ„์—์„œ ๊ฐ’ ์ถ”์ถœ

์ด์ „ ์˜ˆ์‹œ๋Š” ๋ฆฌ์†Œ์Šค ์ด๋ฆ„ ๋˜๋Š” ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์˜ ์‹œ์ž‘๊ณผ ๋‹ค๋ฅธ ๊ฐ’ ๊ฐ„์˜ ๋ถ€์šธ ๋น„๊ต๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ’์„ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์ด ์•„๋‹Œ ํŠน์ • ๋ถ€๋ถ„๊ณผ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

extract() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ถ”์ถœ ํ…œํ”Œ๋ฆฟ์„ ์ง€์ •ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์˜ ๊ด€๋ จ ๋ถ€๋ถ„์„ ๋ฌธ์ž์—ด๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ์ถ”์ถœ๋œ ๋ฌธ์ž์—ด์„ ํƒ€์ž„์Šคํƒฌํ”„์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์—์„œ ๊ฐ’์„ ์ถ”์ถœํ•œ ๋‹ค์Œ ํ•ด๋‹น ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” extract() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด ํ‘œํ˜„์‹์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. extract() ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM ์กฐ๊ฑด ์†์„ฑ ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ์‹œ: ์ง€๋‚œ 30์ผ ๋™์•ˆ์˜ ์ฃผ๋ฌธ ์ผ์น˜

์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ์—ฌ๋Ÿฌ Cloud Storage ๋ฒ„ํ‚ท์— ์ €์žฅํ•˜๊ณ  ๊ฐ ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด๋ฅผ ๋‚ ์งœ๋ณ„๋กœ ์ •๋ฆฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด ์ด๋ฆ„์€ ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๋น„์Šทํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/order_date=2019-11-03/aef87g87ae0876

์ฃผ ๊ตฌ์„ฑ์›์ด ์ง€๋‚œ 30์ผ ๋™์•ˆ์˜ ๋ชจ๋“  ์ฃผ๋ฌธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์กฐ๊ฑด์€ ์ด๋Ÿฌํ•œ ์ฃผ๋ฌธ์˜ Cloud Storage ๊ฐ์ฒด์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. duration() ๋ฐ date() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ์‹œ๊ฐ„์—์„œ 30์ผ(2,592,000์ดˆ)์„ ๋บ€ ํ›„ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ฃผ๋ฌธ ๋‚ ์งœ์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

resource.type == 'storage.googleapis.com/Object' &&
  request.time - duration('2592000s') < date(resource.name.extract('/order_date={date_str}/'))

date() ๋ฐ duration() ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‚ ์งœ/์‹œ๊ฐ„ ์†์„ฑ ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ์‹œ: ๋ชจ๋“  ์œ„์น˜์—์„œ Compute Engine VM ์ผ์น˜

VM ์œ„์น˜์— ๊ด€๊ณ„์—†์ด ์ด๋ฆ„์ด dev-๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  Compute Engine VM์˜ ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ์—ญํ• ์„ ๋ถ€์—ฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฃผ ๊ตฌ์„ฑ์›์ด ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์œ ํ˜•์—์„œ ํ•ด๋‹น ์—ญํ• ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

VM์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์—์„œ๋Š” projects/PROJECT_ID/zones/ZONE_ID/instances/INSTANCE_ID๊ณผ ์œ ์‚ฌํ•œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์กฐ๊ฑด์€ dev- ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ธ์Šคํ„ด์Šค ์ด๋ฆ„๊ณผ VM ์ด์™ธ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ VM์˜ true๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

resource.type != 'compute.googleapis.com/Instance' ||
  resource.name.extract('/instances/{name}').startsWith('dev-')

์ค‘๊ด„ํ˜ธ ์•ˆ์˜ ํ…์ŠคํŠธ๋Š” ๋น„๊ต๋ฅผ ์œ„ํ•ด ์ถ”์ถœ๋˜๋Š” ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์˜ ์ผ๋ถ€๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ ์ถ”์ถœ ํ…œํ”Œ๋ฆฟ์€ ๋ฌธ์ž์—ด /instances/์˜ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ ๋‹ค์Œ์˜ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค ๊ธฐ๋ฐ˜ ์กฐ๊ฑด์˜ ์ค‘์š”ํ•œ ์‚ฌ์šฉ ๊ณ ๋ ค์‚ฌํ•ญ

๋ฆฌ์†Œ์Šค ๊ธฐ๋ฐ˜ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ์กฐ๊ฑด์ด ์ฃผ ๊ตฌ์„ฑ์›์˜ ๊ถŒํ•œ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์—ญํ• 

์ปค์Šคํ…€ ์—ญํ• ์ด ํฌํ•จ๋œ ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ VM ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ์œ„ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€๋งŒ ์ด๋ฆ„ ํ”„๋ฆฌํ”ฝ์Šค๊ฐ€ ๊ฐ™์€ ๋””์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์ด ์ด๋ฆ„ ํ”„๋ฆฌํ”ฝ์Šค staging์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ VM ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€ ์—ญํ• ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋ถ€์—ฌ๋œ ์—ญํ• ์— ๋””์Šคํฌ ๋ฐ ์ธ์Šคํ„ด์Šค ๋ฆฌ์†Œ์Šค ์œ ํ˜•์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์˜๋ฏธํ•˜๋Š” VM ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๊ถŒํ•œ์ด ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์กฐ๊ฑด ํ‘œํ˜„์‹์—์„œ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์— ๋””์Šคํฌ์™€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ชจ๋‘ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ๋ฉด ์—ญํ• ์— ๋‹ค๋ฅธ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์กฐ๊ฑด ํ‘œํ˜„์‹์€ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. Compute Engine VM์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ถŒํ•œ์ด ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

resource.type == 'compute.googleapis.com/Disk' &&
 resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/staging')

๋‹ค์Œ ์กฐ๊ฑด ํ‘œํ˜„์‹์€ ๋””์Šคํฌ์™€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋ฉฐ ๋‘ ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/staging')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/staging'))

๋‹ค์Œ ์กฐ๊ฑด ํ‘œํ˜„์‹์€ ๋””์Šคํฌ์™€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•˜๋ฉฐ ๋‘ ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์˜ ๊ฒฝ์šฐ ์กฐ๊ฑด ํ‘œํ˜„์‹์€ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์— ๊ด€๊ณ„์—†์ด ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/staging')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/staging')) ||
 (resource.type != 'compute.googleapis.com/Disk' &&
  resource.type != 'compute.googleapis.com/Instance')

์ƒ์œ„ ์š”์†Œ ์ „์šฉ ๊ถŒํ•œ

Google Cloud์˜ ๋ฆฌ์†Œ์Šค ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์—ญํ• ์˜ ์ผ๋ถ€ ๊ถŒํ•œ์€ ์ƒ์œ„ ์ˆ˜์ค€์—์„œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•œ ์กฐ์ง์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚˜์—ดํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”„๋กœ์ ํŠธ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‚˜์—ดํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌํ•จ๋œ ์กฐ์ง์— ๋Œ€ํ•œ resourcemanager.projects.list ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ถŒํ•œ์„ ์ƒ์œ„ ์š”์†Œ ์ „์šฉ ๊ถŒํ•œ์ด๋ผ ํ•˜๋ฉฐ list ์ž‘์—…์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ *.*.list ๊ถŒํ•œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์กฐ๊ฑด ํ‘œํ˜„์‹์€ ๋‚˜์—ดํ•  ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์˜ ์ƒ์œ„ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์— ๋”ฐ๋ผ resource.service ๋ฐ resource.type ์†์„ฑ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”. ์ด์ „ ์„น์…˜์˜ Compute Engine ์˜ˆ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹ค์Œ ํ‘œํ˜„์‹์€ ๊ถŒํ•œ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค์˜ resource.type ์†์„ฑ ๊ฐ’์ด cloudresourcemanager.googleapis.com/Project์ด๊ธฐ ๋•Œ๋ฌธ์— compute.disks.list ๋ฐ compute.instances.list ๊ถŒํ•œ์— ์•ก์„ธ์Šคํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX'))

์ผ๋ฐ˜์ ์œผ๋กœ ์ด list ๊ถŒํ•œ์€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์ž‘์—…์˜ ๋‹ค๋ฅธ ๊ถŒํ•œ๊ณผ ํ•จ๊ป˜ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ถ€์—ฌ ๋ฒ”์œ„๋ฅผ ๋Š˜๋ฆฌ๋ ค๋ฉด cloudresourcemanager.googleapis.com/Project ์œ ํ˜•์˜ ๋ฒ”์œ„๋งŒ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ธ์Šคํ„ด์Šค ๋˜๋Š” ๋””์Šคํฌ ์œ ํ˜•์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ถŒํ•œ์œผ๋กœ ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
 resource.type == 'cloudresourcemanager.googleapis.com/Project'

๋˜๋Š”

(resource.type == 'compute.googleapis.com/Disk' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/disks/PREFIX')) ||
 (resource.type == 'compute.googleapis.com/Instance' &&
  resource.name.startsWith('projects/PROJECT_ID/zones/ZONE_ID/instances/PREFIX')) ||
 (resource.type != 'compute.googleapis.com/Disk' &&
  resource.type != 'compute.googleapis.com/Instance')