デプロイを更新する

デプロイを作成した後に、アプリケーションの進化に応じてデプロイの更新や変更ができます。それには Deployment Manager に更新リクエストを出します。Deployment Manager では次のようなデプロイの変更ができます。

  • デプロイのリソースの追加と削除
  • デプロイ内にあるリソースのプロパティの更新

Deployment Manager は、各 Google Cloud Platform サービスの基盤となる API を使用して、デプロイのリソースを管理することを覚えておいてください。API があるアクションをサポートしていない場合、Deployment Manager もそのアクションを実行できません。たとえば、対応する API に更新メソッドがある場合にのみ、Deployment Manager は既存のリソースを更新できます。

特定の API には、標準的な更新メソッドに加えて、リソースのプロパティを変更できるカスタム メソッドがあります。たとえば、Compute Engine には稼働中のインスタンスのメタデータを変更するメソッドがあります。Deployment Manager は、それらのカスタム メソッドを利用してデプロイを更新することもできます。

どのような種類のメソッドがサポートされているかを確認するには、各プロダクトのドキュメントをご覧ください。

更新ポリシーを選択する

更新を行うときに選択できる更新ポリシーは多数ありますが、ほとんどの場合にはデフォルトの設定で十分です。そのような場合、明示的にポリシーを指定する必要はありません。指定がなければ、Deployment Manager はデフォルト ポリシーを使用します。デフォルトの更新ポリシーには、以下のものがあります。

  • リソース追加のデフォルト ポリシーは CREATE_OR_ACQUIRE で、これはリソースが既存であればそれを取得してデプロイに追加し、なければ作成するというものです。
  • リソース削除のデフォルト ポリシーは DELETE で、これはリソースをデプロイから削除し、そのリソースをユーザーのプロジェクトから削除するというものです。
  • リソース更新のデフォルト ポリシーは、カスタム メソッドがあればそれを使用し、なければ UPDATE メソッドを使用するというものです。

更新ポリシーについて詳しくは、デプロイを更新するをご覧ください。

更新をプレビューする

デプロイ内のどのような変更も commit する前にプレビューすることができ、どのように更新されるかを見た上でデプロイへの変更を決定できます。更新をプレビューすると、Deployment Manager はデプロイの更新を開始しますが、どのリソースも実際に変更はしません。その代わりに、Deployment Manager は目的の変更内容をもった「シェル」リソースを作成します。ただしこれは Deployment Manager 内に存在するだけで Cloud Platform のサービス内には存在しません。その時点で、プレビューをキャンセルするか更新を先に進めるかを決められます。

変更を commit する前に確認できるので、通常は更新のプレビューをおすすめします。

デプロイを更新する

デプロイの更新は 3 段階の手順で行います。

  1. 必要な変更を加えて構成を更新します。
  2. 該当する更新ポリシーを選択するか、デフォルトのポリシーを使用します。
  3. (省略可)更新をプレビューします。
  4. 更新を実行します。

1 つ前のステップ 8 の例を使って vm-template.yaml の起動スクリプトを更新してみましょう。

vm-template ファイルを編集する

メタデータ セクションを変更して、次のようにします。

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
          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 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',
                                    'INSTANCE=$(curl http://metadata.google.',
                                    'internal/computeMetadata/v1/instance/',
                                    'hostname -H "Metadata-Flavor: Google")\n',
                                    '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\n',
                                    'python -m SimpleHTTPServer 80\n'])
              }]
          }
      }
  }]
  return {'resources': resources}

変更を保存します。更新用のデフォルト ポリシーを使用しているので、さらに変更を加える必要はありません。

構成をプレビューする

gcloud deployment-manager deployments update deployment-with-startup-script  \
  --config config-with-many-templates.yaml --preview

新しいリソースを表示したり、マニフェストを作成したりすることで、変更しようとしている内容を確認できます。たとえば、リソースに関して describe サブコマンドを使用すれば、the-first-vm に対する変更内容の記述を取得できます。

gcloud deployment-manager resources describe the-first-vm --deployment deployment-with-startup-script

更新を commit する

gcloud deployment-manager deployments update deployment-with-startup-script

インスタンスを再起動する

更新が行われたかどうかを確認するには、新しい起動スクリプトを実行するためにインスタンスを再起動する必要があります。次のようにして、the-first-vm を再起動します。

gcloud compute instances reset the-first-vm

インスタンスが再起動するまで、しばらく時間がかかることがあります。数分待って確認してください。

変更を確認する

  1. 次のようにして、the-first-vm の外部 IP を取得します。

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

  3. ブラウザを開いてアドレスバーにその IP アドレスを貼り付け、インスタンスにアクセスします。新しいウェブページに、今度は異なったメッセージが表示されるはずです。

ステップ 4 と 5 を the-second-vm を使用してもう一度やってみることもできます。少し異なったメッセージが表示されます。

デプロイを削除する

Compute Engine のリソースには費用が発生します。このデプロイは後のステップでは不要なので削除することをおすすめします。このデプロイを削除すると、その中にあるリソースもすべて削除されます。このデプロイを残したままにすると、以降の例と衝突を起こします

デプロイを削除するには:

gcloud deployment-manager deployments delete deployment-with-startup-script

関連トピック

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

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

Cloud Deployment Manager のドキュメント