๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ณด๊ธฐ

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

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

๋งค๋‹ˆํŽ˜์ŠคํŠธ ๊ตฌ์กฐ

๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฐํฌ ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐ ๊ตฌ์„ฑ
  • ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ํ™•์žฅ๋œ ์ดํ›„์— ์™„์ „ํžˆ ํ‰๊ฐ€๋œ ๊ตฌ์„ฑ
  • ๋ฐฐํฌ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์„ค๋ช…ํ•˜๋Š” ๋ฐฐํฌ ๋ ˆ์ด์•„์›ƒ

์›๋ž˜ ๊ตฌ์„ฑ

์›๋ž˜ ๊ตฌ์„ฑ์€ ํ…œํ”Œ๋ฆฟ ํ™•์žฅ ์ „์— ๋ฐฐํฌ์— ์ œ๊ณตํ•œ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ตฌ์„ฑ์€ config ์†์„ฑ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

config: |
  imports:
  - path: vm-template.jinja
  - path: network-template.jinja
  - path: firewall-template.jinja
  - path: compute-engine-template.jinja

  resources:
  - name: compute-engine-setup
    type: compute-engine-template.jinja

ํ™•์žฅ๋œ ๊ตฌ์„ฑ

ํ™•์žฅ๋œ ๊ตฌ์„ฑ์€ ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ๋ฐ ๊ทธ ์†์„ฑ์ด ํฌํ•จ๋œ ๋ฐฐํฌ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ด๋ฉฐ ๊ตฌ์„ฑ์˜ ์ตœ์ข… ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ํ™•์žฅ๋œ ๊ตฌ์„ฑ ๋ถ€๋ถ„์€ expandedConfig ์†์„ฑ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

expandedConfig: |
  resources:
  - name: datadisk-example-config-with-templates
    properties:
      sizeGb: 100
      type: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/diskTypes/pd-standard
      zone: us-central1-a
    type: compute.v1.disk
  - name: vm-example-config-with-templates
    properties:
      disks:
      - autoDelete: true
        boot: true
        deviceName: boot
        initializeParams:
          diskName: disk-example-config-with-templates
          sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140619
        type: PERSISTENT
      - autoDelete: true
        deviceName: datadisk-example-config-with-templates
        source: $(ref.datadisk-example-config-with-templates.selfLink)
        type: PERSISTENT
      machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/f1-micro
      metadata:
        items:
        - key: startup-script
          value: |
            #!/bin/bash
            python -m http.server 8080
      networkInterfaces:
      - accessConfigs:
        - name: External NAT
          type: ONE_TO_ONE_NAT
        network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default
      zone: us-central1-a
    type: compute.v1.instance

๊ฐ€์ ธ์˜จ ํ…œํ”Œ๋ฆฟ

๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ imports ์†์„ฑ์—๋Š” ์ด ๊ตฌ์„ฑ์—์„œ ๊ฐ€์ ธ์˜จ ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ ์„น์…˜์€ imports ์„น์…˜์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

imports:
- content: |
    resources:
    - name: {{ env["name"] }}
      type: compute.v1.instance
      properties:
        disks:
        - autoDelete: true
          type: PERSISTENT
          boot: true
          deviceName: boot
          initializeParams:
            sourceImage:  https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140619
        machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
        networkInterfaces:
        - network: $(ref.{{ properties["network"] }}.selfLink)
          accessConfigs:
          - name: External NAT
            type: ONE_TO_ONE_NAT
        zone: {{ properties["zone"] }}
        metadata:
          items:
          - key: startup-script
            value: |
              #!/bin/bash
              INSTANCE=$(curl http://metadata.google.internal/computeMetadata/v1/instance/hostname -H "Metadata-Flavor: Google")
              echo "<html><header><title>Hello from Deployment Manager!</title></header>
              <body><h2>Hello from $INSTANCE</h2>
              <p>Deployment Manager bids you good day!</p>
              </body>
              </html>" > index.html
              python -m http.server 80
  name: vm-template.jinja
- content: |
    resources:
    - name: {{ env["name"] }}
      type: compute.v1.network
      properties:
        IPv4Range: 10.0.0.1/16
  name: network-template.jinja
- content: |
    resources:
    - name: {{ env["name"]}}
      type: compute.v1.firewall
      properties:
        network: $(ref.{{ properties["network"] }}.selfLink)
        sourceRanges: ["0.0.0.0/0"]
        allowed:
        - IPProtocol: TCP
          ports: ["80"]
  name: firewall-template.jinja
- content: |
    {% set  NETWORK_NAME = "a-new-network" %}

    resources:
    - name: the-first-vm
      type: vm-template.jinja
      properties:
        machineType: f1-micro
        zone: us-central1-f
        network: {{ NETWORK_NAME }}
    - name: the-second-vm
      type: vm-template.jinja
      properties:
        machineType: g1-small
        zone: us-central1-f
        network: {{ NETWORK_NAME }}
    - name: {{ NETWORK_NAME }}
      type: network-template.jinja
    - name: {{ NETWORK_NAME }}-firewall
      type: firewall-template.jinja
      properties:
        network: {{ NETWORK_NAME }}
  name: compute-engine-template.jinja

๋ ˆ์ด์•„์›ƒ

๋ ˆ์ด์•„์›ƒ์€ ๋ฐฐํฌ ๋ฐ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ ๊ฐœ์š”์ด๋ฉฐ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„๊ณผ ์œ ํ˜•์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ layout ์†์„ฑ์˜ ๋ ˆ์ด์•„์›ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

layout: |
  resources:
  - name: compute-engine-setup
    resources:
    - name: the-first-vm
      properties:
        machineType: f1-micro
        network: a-new-network
        zone: us-central1-f
      resources:
      - name: the-first-vm
        type: compute.v1.instance
      type: vm-template.jinja
    - name: the-second-vm
      properties:
        machineType: g1-small
        network: a-new-network
        zone: us-central1-f
      resources:
      - name: the-second-vm
        type: compute.v1.instance
      type: vm-template.jinja
    - name: a-new-network
      resources:
      - name: a-new-network
        type: compute.v1.network
      type: network-template.jinja
    - name: a-new-network-firewall
      properties:
        network: a-new-network
      resources:
      - name: a-new-network-firewall
        type: compute.v1.firewall
      type: firewall-template.jinja
    type: compute-engine-template.jinja

๋งค๋‹ˆํŽ˜์ŠคํŠธ ์‹๋ณ„

manifest-TIMESTAMP ํ˜•์‹์˜ ๊ณ ์œ  ID๋กœ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

manifest-1436393348324

์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๋‹น ๋ฐฐํฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋ฐฐํฌ์— ๋Œ€ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋‚˜์—ดํ•˜์—ฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ID๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud

Google Cloud CLI์—์„œ deployments describe ํ•˜์œ„ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud deployment-manager deployments describe example-deployment

gcloud๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

id: '7428522736135856060'
manifest: https://www.googleapis.com/deploymentmanager/v2beta1/projects/myproject/global/deployments/example-deployment/manifests/manifest-1436393348324
name: example-deployment
resources:
NAME    TYPE      ID     STATE   ERRORS
...

API

API์—์„œ GET ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์š”์ฒญ์— ๋ฐฐํฌ ์ด๋ฆ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

GET https://www.googleapis.com/deploymentmanager/v2beta1/projects/myproject/global/deployments/example-deployment-with-config

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

{
 "id": "5899501332770090517",
 "creationTimestamp": "2015-03-30T15:40:58.809-07:00",
 "name": "example-deployment-with-config",
 "fingerprint": "",
 "manifest": "https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment-with-config/manifests/manifest-1427755258810-2b3498d9-530b-4f8e-b014-0342d3c9c66b",
 "state": "DEPLOYED"
}

๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ณด๊ธฐ

๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ get() ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ Google Cloud Console ๋˜๋Š” gcloud๋ฅผ ํ†ตํ•ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

Google Cloud ์ฝ˜์†”์—์„œ ๋ฐฐํฌ์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. Google Cloud ์ฝ˜์†”์˜ ๋ฐฐํฌ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ชฉ๋ก์—์„œ ๋ณด๋ ค๋Š” ๋ฐฐํฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฐฐํฌConsole ์„ธ๋ถ€์ •๋ณด์—์„œ ๊ฐœ์š”๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

Google Cloud CLI์—์„œ manifests describe ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ์ „์ฒด ๋งค๋‹ˆํŽ˜์ŠคํŠธ์™€ ๋ ˆ์ด์•„์›ƒ์„ ๋ชจ๋‘ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

gcloud deployment-manager manifests describe manifest-1436393348324 \
    --deployment example-config-with-templates

gcloud๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 config: |
   imports: ["vm_template.jinja"]

resources:

  • name: vm-instance type: vm_template.jinja properties: zone: us-central1-a project: myproject creationTimestamp: '2015-03-30T15:40:58.815-07:00' evaluatedConfig: | resources:
  • name: datadisk-example-config-with-templates properties: sizeGb: 100 type: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/diskTypes/pd-standard zone: us-central1-a type: compute.v1.disk
  • name: vm-example-config-with-templates properties: disks:
    • autoDelete: true boot: true deviceName: boot initializeParams: diskName: disk-example-config-with-templates sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140619 type: PERSISTENT
    • autoDelete: true deviceName: datadisk-example-config-with-templates source: $(ref.datadisk-example-config-with-templates.selfLink) type: PERSISTENT machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/f1-micro metadata: items:
      • key: startup-script value: | #!/bin/bash python -m http.server 8080 networkInterfaces:
    • accessConfigs:
      • name: External NAT type: ONE_TO_ONE_NAT network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default zone: us-central1-a type: compute.v1.instance id: '7174699452487462421' layout: | resources:
  • name: vm-instance type: vm_template.jinja properties: project: myproject zone: us-central1-a resources:
    • name: datadisk-example-config-with-templates type: compute.v1.disk
    • name: vm-example-config-with-templates type: compute.v1.instance name: manifest-1427755258810-2b3498d9-530b-4f8e-b014-0342d3c9c66b selfLink: https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-config-with-templates/manifests/manifest-1436393348324

API

API์—์„œ GET ์š”์ฒญ์— ๋ฐฐํฌ ์ด๋ฆ„๊ณผ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ด๋ฆ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 GET https://www.googleapis.com/deploymentmanager/v2beta1/projects/myproject/global/deployments/example-deployment/manifests/manifest-1436393348324

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

{
 "id": "7174699452487462421",
 "selfLink": "https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-config-with-templates/manifests/manifest-1436393348324",
 "creationTimestamp": "2015-03-30T15:40:58.815-07:00",
 "name": "manifest-1427755258810-2b3498d9-530b-4f8e-b014-0342d3c9c66b",
 "config": "imports: [\"vm_template.jinja\"]\n\nresources:\n- name: vm-instance\n  type: vm_template.jinja\n  properties:\n    zone: us-central1-a\n    project: myproject\n",
 "evaluatedConfig": "resources:\n- name: datadisk-example-config-with-templates\n  properties:\n    sizeGb: 100\n    type: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/diskTypes/pd-standard\n    zone: us-central1-a\n  type: compute.v1.disk\n- name: vm-example-config-with-templates\n  properties:\n    disks:\n    - autoDelete: true\n      boot: true\n      deviceName: boot\n      initializeParams:\n        diskName: disk-example-config-with-templates\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140619\n      type: PERSISTENT\n    - autoDelete: true\n      deviceName: datadisk-example-config-with-templates\n      source: $(ref.datadisk-example-config-with-templates.selfLink)\n      type: PERSISTENT\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/f1-micro\n    metadata:\n      items:\n      - key: startup-script\n        value: |\n          #!/bin/bash\n          python -m http.server 8080\n    networkInterfaces:\n    - accessConfigs:\n      - name: External NAT\n        type: ONE_TO_ONE_NAT\n      network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default\n    zone: us-central1-a\n  type: compute.v1.instance\n",
 "layout": "resources:\n- name: vm-instance\n  properties:\n    project: myproject\n    zone: us-central1-a\n  resources:\n  - name: datadisk-example-config-with-templates\n    type: compute.v1.disk\n  - name: vm-example-config-with-templates\n    type: compute.v1.instance\n  type: vm_template.jinja\n"
}