デプロイを作成した後、アプリケーションやサービスの変化に合わせてデプロイを更新できます。Deployment Manager を使用すると、次の方法でデプロイを更新できます。
- デプロイに対してリソースの追加や削除を行います。
- デプロイ内の既存リソースのプロパティを更新します。
さまざまな変更を組み合わせて、単一の更新として実行できます。たとえば、既存のリソースのプロパティを変更できます。同じリクエストで新しいリソースを追加することもできます。デプロイを更新するには、次の操作を行います。
- 変更内容に合わせて構成ファイルを変更、作成します。
- 必要に応じて、更新で使用するポリシーを選択するか、デフォルト ポリシーを使用します。
- Deployment Manager に更新リクエストを送ります。
始める前に
- このガイドのコマンドラインの例を使用する場合、gcloud コマンドライン ツールをインストールします。
- このガイドの API の例を使用する場合は、API アクセスを設定します。
- デプロイを作成する方法について十分に理解してください。
更新を準備する
デプロイを更新する前に、次のガイドラインに沿って更新を準備します。
- プロジェクトに新しいリソースを追加するためにデプロイを更新する場合、追加するリソースがすでに存在しているかどうか確認してください。 - デフォルトでは、追加するリソースがすでにプロジェクト内に存在する場合、それらのリソースがデプロイによって取得され、新しいリソースは作成されません。既存のリソースを取得したくない場合は、更新で使用するポリシーを変更する必要があります。 - デプロイを更新する際に使用できるポリシーについては、リソースの追加ポリシーをご覧ください。 
- デプロイを更新した結果としてリソースが置き換えられる場合は、その依存関係を確認してください。 - デプロイのリソースを置き換える場合は、最初に、そのリソースを削除した結果としてデプロイ サイクルが引き起こされないことを確認する必要があります。デプロイ サイクルが発生するのは、あるリソースが自分自身に、直接か間接かを問わず依存しているときです。たとえば、次のデプロイがあるとします。 - resources: - name: vm-a properties: zone: us-central1-f ... metadata: dependsOn: - vm-depends-on # The second VM - name: vm-depends-on properties: zone: $(ref.vm-a.zone) ...- このデプロイでは、 - vm-aの- dependsOnステートメントで、- vm-depends-onを- vm-aよりも前に作成することを要求しています。しかし、- vm-depends-onでは- vm-aのゾーンへの参照が使用されています。つまり、- vm-aが- vm-depends-onよりも前に作成されている必要があります。このようなシナリオでは、依存関係がループしているため、デプロイに失敗します。- あるリソースが、他のリソースに依存すると同時に他のリソースから依存されている場合は、そのリソースを置き換えるとデプロイ サイクルが発生する可能性があります。 - たとえば、あるデプロイに - disk-aという永続ディスク、- vm-aという VM、- ig-aというインスタンス グループがあるとします。- vm-aの構成の中には- disk-aへの参照があり、- ig-aの構成の中には- vm-aへの参照があります。更新された構成で、- vm-aを削除し、- vm-bと置き換えることもできます。このようなシナリオでは、vm-a と vm-b の依存関係を解決するとデプロイ サイクルが発生する可能性があり、デプロイに失敗します。- 依存関係のチェーン内のリソースを置き換えるときのデプロイ サイクルを回避するには、次のいずれかを行います。 - 置き換え対象のリソースの依存関係を削除します。それには、dependsOn 句を削除するか、他のリソースへの参照を削除または変更します。このような変更を反映してデプロイを更新した後に、別の更新を行ってリソースを置き換えます。 
- 依存リソースのチェーンを削除し、デプロイを更新します。その後の更新で、使用したいリソースを再作成します。 
 
- 更新をサポートする API があることを確認してください。 - Deployment Manager は、各サービスの API を使用してデプロイの作成や変更を行います。Deployment Manager でリクエストが完了しているかどうかを確認するには、更新するリソースの Cloud Platform サービスの API ドキュメントをご覧ください。 - たとえば、デプロイメントの BigQuery データセットを更新する場合は、使用可能なメソッドを Datasets API リファレンスで確認します。このメソッドの - updateメソッドを使用すると、Deployment Manager でデータセットを更新できます。- 一部の API には、リソースを更新できるカスタム メソッドがあります。たとえば、Compute Engine の場合は、インスタンスのメタデータを更新するためのカスタム メソッドとして - setMetadataが用意されています。この場合、Deployment Manager はカスタム メソッドの使用を試みます。
- 更新するリソースが変更可能かどうか確認してください。 - 作成後に更新できないリソースもあります。リソースが変更不可かどうか確認するには、そのリソースの API リファレンスをご覧ください。通常、変更不可のリソースには、リソースのプロパティを更新する - updateAPI メソッドやカスタム メソッドはありません。
制限事項
- デプロイごとに、同時に 1 つの更新を適用できます。更新が実行中の場合は、現在の更新を停止してから、新しい更新を開始する必要があります。 
- Deployment Manager を使用せずにデプロイメント内のリソースを変更した場合( Google Cloud コンソールや - gcloudで更新した場合)、更新でリソースを変更するときにエラーや予期しない問題が発生する可能性があります。
構成を変更する
既存の構成を保存している場合は、構成内容を変更して、更新リクエストで使用します。
既存の構成を保存していない場合は、新しい構成を作成します。構成ファイルの作成手順については、構成ページをご覧ください。
Deployment Manager は、更新リクエストで指定された構成と以前のマニフェストを比較し、その違いに基づいてデプロイメントを更新します。
例として、2 つの構成を下記の表に示します。一方は既存のデプロイを記述するもので、もう一方は更新後のデプロイの状態を記述しています。更新された構成が提供されると、Deployment Manager は差異を検証し、該当する更新を実行します。
この例では、既存のインスタンス リソースを更新し、カスタム メタデータの一部を追加して、新しい仮想マシンリソースをデプロイに追加します。太字の部分は、テンプレート間の違いを表します。
| 現在のテンプレート | 更新後のテンプレート | 
|---|---|
| resources: - name: vm-created-by-cloud-config type: compute.v1.instance properties: zone: us-central1-a machineType: machine-type-url disks: - deviceName: boot type: PERSISTENT boot: true autoDelete: true initializeParams: diskName: disk-created-by-cloud-config sourceImage: image-url networkInterfaces: - network: network-url | resources: - name: vm-created-by-cloud-config type: compute.v1.instance properties: zone: us-central1-a machineType: machine-type-url disks: - deviceName: boot type: PERSISTENT boot: true initializeParams: diskName: disk-created-by-cloud-config sourceImage: image-url networkInterfaces: - network: network-url metadata: items: - key: 'foo' value: 'bar' - key: 'dev' value: 'vm' - name: a-new-vm type: compute.v1.instance properties: zone: us-central1-a machineType: machine-type-url - deviceName: boot type: PERSISTENT boot: true autoDelete: false initializeParams: diskName: a-new-vm-disk sourceImage: image-url networkInterfaces: - network: network-url | 
(省略可)更新に使用するポリシーを決める
次に、更新に使用するポリシーを決めます。ポリシーにより、デプロイメント更新時のリソースの更新方法が決まります。
Deployment Manager は、次のデフォルト ポリシーを使用します。
- リソース追加用のデフォルト ポリシーは CREATE_OR_ACQUIREです。
- リソース削除用のデフォルト ポリシーは DELETEです。
- リソース更新用のデフォルト ポリシーは UPDATEです。
各ポリシーの詳細については、以降のセクションをご覧ください。
リソース追加用のポリシー
リソースを追加する場合、新しいリソースを作成してデプロイに追加するか、既存のリソースを取得するかを選択できます。
- CREATE_OR_ACQUIRE- (デフォルト) Deployment Manager は、プロジェクト内に存在するリソースを取得します。リソースが存在しない場合は、リソースを作成します。リソースを取得するため、Deployment Manager は、作成するリソースのプロパティの構成を確認します。同じプロパティのリソースがすでに存在する場合、Deployment Manager はそのリソースをデプロイの一部として取得します。- Deployment Manager が確認するプロパティは、作成するリソースのタイプによって異なります。たとえば、次のようなものがあります。 - リソースの name
- リソースの type
- リソースの zoneまたはregion(該当する場合)
 - プロパティは、リソースに対する - GETAPI リクエストの URL の一部になります。Deployment Manager がリソースの取得に使用するプロパティについては、リソースの- GETメソッドに関する API ドキュメントをご覧ください。たとえば、Compute Engine インスタンスの場合、- instances.getメソッドのリクエスト URL には、- resourceId(構成内の- name)、- zone、- projectが含まれます。
- リソースの 
- CREATE- Deployment Manager は、存在しないリソースを作成します。プロジェクトにすでに存在するリソースが構成に含まれていると、デプロイに失敗します。
- ACQUIRE- Deployment Manager は、- CREATE_OR_ACQUIREと同じ条件で既存のリソースを取得します。- プロジェクト内にすでに多数のリソースが含まれている場合、それらのリソースを 1 つのデプロイとして管理するには、 - ACQUIREポリシーを使用します。- リソースを作成する場合と同じく、テンプレートまたは構成で、リソースの必須プロパティを指定する必要があります。プロジェクトに存在しないリソースが構成に含まれていると、デプロイに失敗します。 
リソース削除用のポリシー
リソース削除用のポリシーとして次のいずれかを指定します。
- DELETE- (デフォルト)対象リソースへのすべての参照をデプロイメントから削除し、基盤リソースを削除します。この操作を元に戻すことはできませんが、同じプロパティを持つ新しいリソースを再作成できます。
- ABANDON- 対象リソースへのすべての参照をデプロイから削除しますが、基盤リソースは削除しません。たとえば、インスタンスを放棄した場合、デプロイからは削除されますが、インスタンス自体は存在しているため使用できます。- ABANDONポリシーは、リソース全体を削除する場合にのみ適用されます。リソースのプロパティを削除する場合や、リソースを新しいプロパティで更新する場合は適用されません。リソースのプロパティを保持するには、更新された構成に元のすべてのプロパティを持つリソースを含める必要があります。新しい構成ファイルを使用して更新する場合は、元の構成からリソースの定義をコピーすることをお勧めします。
既存リソース更新用のポリシー
既存リソースを更新するときに UPDATE メソッドが存在すると、Deployment Manager はこのメソッドを使用します。
カスタム メソッドが存在する場合、Deployment Manager はカスタム メソッドを使用します。Deployment Manager では、動詞 set を使用するカスタム メソッドがサポートされています。たとえば、setMetadata() は有効なカスタム メソッドですが、addAccessConfigs() は違います。
(省略可)更新後の構成をプレビューする
Google Cloud CLI や API を使用すると、変更を commit する前に更新をプレビューできます。Deployment Manager サービスは、完全な構成を展開して "shell" リソースを生成し、構成をプレビューします。
構成のプレビュー時、Deployment Manager は、実際のリソースのインスタンス化は行いません。そのため、commit する前にデプロイを確認できます。
gcloud
Google Cloud CLI で、--preview パラメータを使用して update リクエストを送信します。
gcloud deployment-manager deployments update example-deployment \
    --config configuration-file.yaml \
    --preview
API
API で、既存のデプロイに対する PUT() リクエストを作成し、preview=true クエリ パラメータを指定します。リクエスト本文には intent フィールド、target フィールド、name フィールドを含める必要があります。URL とリクエスト本文の両方でデプロイ名を指定する必要があります。
たとえば、次の API リクエストはシンプルな更新をプレビューします。
PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?preview=true
{
 "target": {
  "config": {
   "content": "resources:\n- name: vm-created-by-cloud-config\n  type: compute.v1.instance\n  properties:\n    zone: us-central1-a\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n    disks:\n    - deviceName: boot\n      type: PERSISTENT\n      boot: true\n      autoDelete: true\n      initializeParams:\n        diskName: disk-created-by-cloud-config\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n    networkInterfaces:\n    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
  }
 },
 "name": "example-deployment"
}
デプロイのプレビュー後、構成と preview クエリ パラメータの部分を除外して、同じ PUT() リクエストを実行することで、構成を完全にデプロイできます。Deployment Manager は、最後のプレビューを使用して更新を実行します。次に例を示します。
gcloud deployment-manager deployments update example-deployment
更新リクエストの作成方法については、更新リクエストの作成をご覧ください。
更新を続行しない場合は、別の更新またはプレビュー リクエストの前に現在のプレビューをキャンセルします。
プレビューをキャンセルする
更新のプレビュー後、更新を続行するかどうか決める必要があります。続行しない場合、あるいは別の構成ファイルでデプロイを更新する場合は、現在のプレビューをキャンセルします。
gcloud
Google Cloud CLI で、deployments cancel-preview リクエストを行います。
gcloud deployment-manager deployments cancel-preview my-first-deployment
API
API で cancelPreview メソッドに対する PUT() リクエストを作成し、最新のデプロイ フィンガープリントを指定します。フィンガープリントは、更新リクエストごとにランダムに生成される値です。更新中のエラーを防ぐため、リクエストに最新のフィンガープリントを指定します。
デプロイメントの最新のフィンガープリントを取得するには、get() メソッドを使用してデプロイメントを取得し、フィンガープリント値を見つけます。フィンガープリント値は次のようになります。
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
cancelPreview() リクエストは次のようになります。
POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/cancelPreview
{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }
更新リクエストを行う
更新を行うには:
gcloud
Google Cloud CLI で deployments update サブコマンドを使用して新しい構成を指定します。必要に応じて、更新ポリシーを指定することもできます。
gcloud deployment-manager deployments update my-first-deployment \
    --create-policy POLICY \
    --delete-policy POLICY
以前に構成をプレビューした場合は、構成の部分を省略します。Deployment Manager は、最後にプレビューした構成を使用して更新を実行します。
gcloud deployment-manager deployments update my-first-deployment
API
API で update リクエストを作成し、最新のデプロイメント フィンガープリントを指定します。フィンガープリントは、更新リクエストごとにランダムに生成される値です。更新中のエラーを防ぐため、リクエストに最新のフィンガープリントを指定します。
デプロイメントの最新のフィンガープリントを取得するには、get() メソッドを使用してデプロイメントを取得し、フィンガープリント値を見つけます。フィンガープリント値は次のようになります。
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
次に、新しい構成と更新ポリシーとともに、フィンガープリントをリクエストに指定します。以前に構成のプレビューを行っていた場合は、構成と更新ポリシーの部分を除外します。Deployment Manager は、最後にプレビューした構成を使用して更新を実行します。
URL とリクエスト本文の両方でデプロイ名を指定する必要があります。
PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?createPolicy=ACQUIRE&deletePolicy=ABANDON
{
 "target": {
  "config": {
   "content": "resources:\n- name: vm-created-by-cloud-config\n  type: compute.v1.instance\n  properties:\n    zone: us-central1-a\n    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n    disks:\n    - deviceName: boot\n      type: PERSISTENT\n      boot: true\n      autoDelete: true\n      initializeParams:\n        diskName: disk-created-by-cloud-config\n        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n    networkInterfaces:\n    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
  }
 },
 "name": "example-deployment",
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
}
更新を停止する
stop() メソッドを使用すると、進行中の更新を停止できます。メソッドに渡します。更新の進行はキャンセルされますが、すでに実行済みの変更については元に戻すことはできません。
プレビューをキャンセルする場合は、プレビューをキャンセルするをご覧ください。
gcloud
Google Cloud CLI で、deployments stop リクエストを行います。
gcloud deployment-manager deployments stop my-first-deployment
API
API で stop メソッドに対する POST() リクエストを作成し、最新のフィンガープリント プロパティを指定します。フィンガープリントは、更新リクエストごとにランダムに生成される値です。変更の競合を防ぐため、リクエストでは最新のフィンガープリントを指定して、楽観的ロックを実行し、一度に 1 つの更新のみを実行するようにする必要があります。
デプロイメントの最新のフィンガープリントを取得するには、get() メソッドを使用してデプロイメントを取得し、フィンガープリント値を見つけます。フィンガープリント値は次のようになります。
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
リクエストは次のようになります。
POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/stop
{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }
次のステップ
- デプロイにラベルを追加する。
- デプロイメント マニフェストを表示する。