๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” Deployment Manager๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์†ํ•˜๋Š” ์šด์˜ ์ฒด์ œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Compute Engine ๊ฐ€์ƒ ๋จธ์‹  ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Deployment Manager๊ฐ€ VM ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” Awesome Project๋ผ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  Database Images๋ผ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์†ํ•˜๋Š” ๋น„๊ณต๊ฐœ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด Database Images ์†Œ์œ ์ž๊ฐ€ Awesome Project์˜ Google API ์„œ๋น„์Šค ๊ณ„์ •์— IAM ์—ญํ•  roles/compute.imageUser๋ฅผ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Awesome Project๊ฐ€ Database Images ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ˜• ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน์— ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ œํ•œ์‚ฌํ•ญ

์ด ๊ธฐ๋Šฅ์— ์ ์šฉ๋˜๋Š” ์ œํ•œ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ compute.imageUser ์—ญํ• ์„ ํ”„๋กœ์ ํŠธ์˜ Google API ์„œ๋น„์Šค ๊ณ„์ •์— ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • compute.imageUser ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ฉด ํŠน์ • ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • allAuthenticatedUsers ๋˜๋Š” allUsers๊ฐ€ ์•„๋‹Œ ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด ์—ญํ• ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์†ํ•˜๋Š” ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์ด๋ฏธ์ง€๋ฅผ ์†Œ์œ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์†Œ์œ ์ž๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ์˜ Google API ์„œ๋น„์Šค ๊ณ„์ •์— ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์†Œ์œ ํ•œ ๋น„๊ณต๊ฐœ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ์˜ Google Cloud ์ฝ˜์†”์—์„œ IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

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

  2. ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ๋ชฉ๋ก์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์ €์žฅ๋œ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ ํ˜•์‹์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๊ฐ€ ํฌํ•จ๋œ Google API ์„œ๋น„์Šค ๊ณ„์ •์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

    [PROJECT_NUMBER]@cloudservices.gserviceaccount.com
    
  4. ์œ„์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ์†Œ์œ ์ž๊ฐ€ Google API ์„œ๋น„์Šค ๊ณ„์ •์— roles/compute.imageUser ์—ญํ• ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ฝ˜์†”

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

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

    2. ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    3. ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ์ƒˆ ๊ตฌ์„ฑ์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    4. ๊ตฌ์„ฑ์› ์ƒ์ž์— ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    5. ์—ญํ•  ๋“œ๋กญ๋‹ค์šด์„ ํŽผ์น˜๊ณ  Compute Engine > Compute ์ด๋ฏธ์ง€ ์‚ฌ์šฉ์ž๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    6. ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ด ๊ณ„์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    gcloud

    Google Cloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ IAM ์ •์ฑ…์— binding์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
        --member serviceAccount:[SERVICE_ACCOUNT_EMAIL] --role roles/compute.imageUser

    ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • [PROJECT_ID]๋Š” ๊ณต์œ ํ•˜๋ ค๋Š” ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.
    • [SERVICE_ACCOUNT_EMAIL]์€ ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    gcloud projects add-iam-policy-binding database-images \
        --member serviceAccount:123456789012@cloudservices.gserviceaccount.com  \
        --role roles/compute.imageUser

    API

    API์—์„œ POST ์š”์ฒญ์„ ๋‹ค์Œ URL๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ [PROJECT_ID]๋Š” ๊ณต์œ ํ•˜๋ ค๋Š” ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.

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

    ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ๋ฐ”์ธ๋”ฉ ๋ชฉ๋ก์ด ์š”์ฒญ ๋ณธ๋ฌธ์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฉฐ, roles/compute.imageUser ์—ญํ• ์ด ๋ฐ”์ธ๋”ฉ์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    {
       "policy": {
           "version": "0",
           "bindings": [
           {
               "role": "roles/owner",
               "members": [
                   "user:example@gmail.com"
               ]
           },
           {
               "role": "roles/compute.imageUser",
               "members": [
                   "serviceAccount:123456789012@cloudservices.gservbiceaccount.com"
               ]
           }
           ]
       }
    

    }

๊ตฌ์„ฑ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ

ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›์œผ๋ฉด ํ”„๋กœ์ ํŠธ ์‚ฌ์šฉ์ž๋Š” ํ…œํ”Œ๋ฆฟ ๋˜๋Š” ๊ตฌ์„ฑ์—์„œ ์ด๋ฏธ์ง€๊ฐ€ ์†ํ•œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image: projects/[PROJECT_ID]/global/images/[IMAGE_NAME]

์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฏธ์ง€ ํ”„๋กœ์ ํŠธ ID๊ฐ€ database-images์ด๋ฉด ๊ตฌ์„ฑ์— ๋‹ค์Œ ์ด๋ฏธ์ง€ URI๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

resources:
- name: a-special-vm
  type: compute.v1.instances
  properties:
    machineType: zones/us-central1-a/machineTypes/f1-micro
    image: projects/database-images/global/images/example-database-image
    ...

์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ตฌ์„ฑ ๋งŒ๋“ค๊ธฐ๋ฅผ ์™„๋ฃŒํ•œ ํ›„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

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