メタデータの設定と起動スクリプトの使用

より複雑な設定をデプロイする場合には、数十、数百、さらには数千の仮想マシン インスタンスを含むこともあります。Compute Engine に精通していれば、起動スクリプトを書いてインスタンスのインストールや設定を自動的に行うことに役立てたいと考えるのは自然なことです。

Deployment Manager では、テンプレートや設定にメタデータを指定することによって、同じ起動スクリプトを実行したり、デプロイの仮想マシン インスタンスにメタデータを追加することができます。

メタデータや起動スクリプトをテンプレートに追加するには、metadata プロパティと、関連するメタデータのキーと値を追加します。たとえば、起動スクリプトを指定するには、メタデータのキーを startup-script にする必要があり、値には起動スクリプトの内容を記述します。

起動スクリプトを指定したテンプレートは次のようになります。

resources:
- name: my-first-vm-template
  type: compute.v1.instance
  properties:
   zone: us-central1-f
   machineType:
   ...[snip]...
   metadata:
     items:
     - key: startup-script
       value: "STARTUP-SCRIPT-CONTENTS"

HTTP サーバーを起動する単純な起動スクリプトをテンプレートに追加しましょう。最後には、仮想マシン インスタンス上で稼働しているサーバーにアクセスできるようになります。

VM テンプレート ファイルを編集する

次のフィールドを vm-template.[jinja|py] ファイル内の properties セクションの下に追加します。

Jinja

metadata:
  items:
  - key: startup-script
    value: |
      #!/bin/bash
      sudo python -m SimpleHTTPServer 80

Python

'metadata': {
  'items': [{
      'key': 'startup-script',
      'value': ''.join(['#!/bin/bash\n',
                        'python -m SimpleHTTPServer 80'])
  }]
 }

テンプレートは次のようになります。

Jinja

{#
Copyright 2016 Google Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
#}

resources:
- name: {{ env["name"] }}
  type: compute.v1.instance
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-8
    networkInterfaces:
    - network: $(ref.{{ properties["network"] }}.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT
    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          python -m SimpleHTTPServer 80

Python

# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Creates the virtual machine with environment variables and startup script."""

COMPUTE_URL_BASE = 'https://www.googleapis.com/compute/v1/'

def GenerateConfig(context):
  """Creates the virtual machine."""

  resources = [{
      'name': context.env['name'],
      'type': 'compute.v1.instance',
      'properties': {
          'zone': context.properties['zone'],
          'machineType': ''.join([COMPUTE_URL_BASE, 'projects/',
                                  context.env['project'], '/zones/',
                                  context.properties['zone'], '/machineTypes/',
                                  context.properties['machineType']]),
          'disks': [{
              'deviceName': 'boot',
              'type': 'PERSISTENT',
              'boot': True,
              'autoDelete': True,
              'initializeParams': {
                  'sourceImage': ''.join([COMPUTE_URL_BASE, 'projects/',
                                          'debian-cloud/global/',
                                          'images/family/debian-8'])
              }
          }],
          'networkInterfaces': [{
              'network': '$(ref.' + context.properties['network']
                         + '.selfLink)',
              'accessConfigs': [{
                  'name': 'External NAT',
                  'type': 'ONE_TO_ONE_NAT'
              }]
          }],
          'metadata': {
              'items': [{
                  'key': 'startup-script',
                  'value': ''.join(['#!/bin/bash\n',
                                    'python -m SimpleHTTPServer 80'])
              }]
          }
      }
  }]
  return {'resources': resources}

変更を保存します。

設定を再デプロイする

gcloud deployment-manager deployments create deployment-with-startup-script --config config-with-many-templates.yaml

起動スクリプトの結果を確認する

  1. the-first-vm の外部 IP を取得します。

    gcloud compute instances describe the-first-vm | grep "natIP"
    
  2. natIP の値をコピーします。

  3. ブラウザを開いて、アドレスバーにその IP アドレスを貼り付けます。

成功していれば、仮想マシン上のファイルのディレクトリ リストが表示されます。

起動スクリプトについて詳しくは、起動スクリプトのドキュメントをご覧ください。

デプロイを削除しないでください!

このガイドの他のセクションとは異なり、このデプロイは次のステップで必要になるので残しておいてください。

次へ: デプロイを更新する

関連トピック

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Deployment Manager のドキュメント