在建立部署作業之後,您可以在應用程式或服務有所變動時,隨時更新部署作業。您可以透過以下方式,使用 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 and 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 參考資料。一般來說,不可變動資源缺少可用於更新資源屬性的 - update方法或自訂方法。
限制
- 您可以針對每個部署作業一次套用一個更新。如果更新已在進行中,則在啟動新的更新之前,您必須停止目前的更新。 
- 如果您在修改資源時不使用 Deployment Manager,而是使用諸如 Google Cloud 主控台或 - gcloud等方式,嘗試修改更新中的資源時,可能會看到錯誤或意料之外的問題。
變更設定
如果您有已儲存的設定,請變更該設定,然後在更新要求中使用該設定。
如果您沒有已儲存的設定,請建立新的設定。如需建立設定檔的操作步驟,請參閱設定的相關說明。
Deployment Manager 會將您在更新要求中提供的設定和舊的資訊清單進行比較,並使用兩者差異處來更新部署作業。
例如,下方表格呈現了兩種設定:一種說明現有的部署作業;另一種說明所需的部署作業更新狀態。首先,您會提供已更新的設定,再由 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 要求的網址中。如要查看 Deployment Manager 用於取得資源的屬性,請參閱資源- GET方法的 API 說明文件。以 Compute Engine 執行個體為例,- instances.get方法的要求網址包括- resourceId(設定中的- name)、- zone和- project。
- 資源的 
- CREATE:Deployment Manager 會建立不存在的資源。如果設定中的資源已存在於專案中,部署作業將會失敗。
- ACQUIRE:Deployment Manager 會使用與- CREATE_OR_ACQUIRE相同的條件取得已存在的資源。- 如果專案已有多項資源,您也希望將這些資源當做單一部署來集中管理,請使用 - ACQUIRE政策。- 在範本或設定中,您必須為這些資源提供必要的屬性,這與建立資源時的做法一樣。如果設定中有任何資源不存在於專案內,部署作業將會失敗。 
移除資源的政策
您可以提供下列其中一項用於移除資源的政策:
- DELETE:[預設] 這會移除部署作業中資源的任何參照,並刪除基礎資源。此為永久操作且無法復原,但是您可以重新建立具有相同屬性的新資源。
- ABANDON:可移除部署作業中資源的參照,但不會刪除其基礎資源。例如,捨棄執行個體代表將其從部署作業中移除,但是執行個體仍然存在且可供使用。- ABANDON政策僅適用於刪除整個資源,不適用於刪除資源的屬性,或使用新屬性更新資源。如要保留資源的屬性,您必須在更新後的設定中加入資源及其所有原始屬性。如果更新時使用新的設定檔,建議從原始設定檔複製資源定義。
更新現有資源的政策
如果用於更新現有資源的 UPDATE 方法存在,Deployment Manager 就會使用該方法。
但如果自訂方法存在,Deployment Manager 則會使用該自訂方法。Deployment Manager 支援使用動詞 set 的自訂方法。例如,setMetadata() 為有效的自訂方法,但 addAccessConfigs() 則不是。
(選用) 預覽更新後的設定
您可以使用 Google Cloud CLI 或 API,在提交任何變更之前,先行瀏覽所要進行的更新。Deployment Manager 會展開完整設定並建立「殼層」資源以預覽設定。
預覽設定時,Deployment Manager 不會將任何實際的資源實例化,因此讓您有機會先查看部署作業的情形,然後再進行發布。
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 欄位。請在網址和要求主體中提供部署作業名稱。
例如,下列 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"
}
預覽部署作業後,您就可以透過提交相同的 PUT() 要求,並且省略設定及 preview 查詢參數,以便完整地部署設定。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 就會使用最新預覽的設定進行更新。
請在網址和要求主體中提供部署作業名稱。
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() 要求,並提供最新的指紋屬性。指紋是隨機產生的值,每個更新要求的指紋都不相同。為避免不一致的變更,您必須在要求中提供最新的指紋,以便執行樂觀鎖定,讓系統一次只能進行一項更新。
如要取得部署作業的最新指紋,請使用 get() 取得部署作業,並尋找指紋值。指紋值如下所示:
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
您的要求看起來如下所示:
POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/stop
{
 "fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
 }