更新部署作業

建立部署作業後,您可以在應用程式或服務有所變動時,隨時更新部署作業。您可以透過以下方式,使用 Deployment Manager 更新部署作業:

  • 在部署作業中新增或移除資源。
  • 更新部署作業中現有資源的屬性。

單次更新即可包含下列的變更項目組合。比方說,您可以在同一個要求中,變更現有資源的屬性並加入新資源。您可以依照下列步驟更新部署作業:

  1. 根據所需的變更內容,更改或建立設定檔。
  2. 必要時,您可以選擇要用於更新的政策,或是使用預設政策。
  3. 向 Deployment Manager 提交更新要求。

事前準備

更新準備事項

更新部署作業前,請依照下列指引準備更新:

  • 如果更新部署作業的目的是將新的資源加入專案,請檢查該資源是否已存在。

    根據預設,如果專案中已存在您要新增的資源,部署作業就會取得該項資源,而不會建立新資源。如果您不想取得現有資源,則必須更改要用於更新的政策。

    如要瞭解更新部署作業時可以使用的政策,請參閱新增資源的政策一節。

  • 如果更新部署作業的目的是更換資源,請檢查其依附元件。

    如果您要更換部署作業中的資源,首先必須確認刪除該資源不會導致產生「部署週期」。當資源以直接或間接方式依附於自身時,就會出現部署週期。舉例來說,請考量以下的部署情況:

    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-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,而是使用諸如 GCP Console 或 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
    • 資源的 zoneregion (如適用)

    這些屬性會包含在資源的 GET API 要求的網址中。如要查看 Deployment Manager 用於取得資源的屬性,請參閱資源 GET 方法的 API 說明文件。以 Compute Engine 執行個體為例,instances.get 方法的要求網址包括 resourceId (設定中的 name)、zoneproject

  • CREATE:Deployment Manager 會建立不存在的資源。如果設定中的資源已存在於專案中,部署作業將會失敗。

  • ACQUIRE:Deployment Manager 會使用與 CREATE_OR_ACQUIRE 相同的條件取得已存在的資源。

    如果專案已存在多個資源,且您想要將這些資源做為單一部署共同管理,請使用 ACQUIRE 政策。

    在範本或設定中,您必須為這些資源提供必要的屬性,這與建立資源時的做法一樣。如果設定中有任何資源不存在於專案內,部署作業將會失敗。

移除資源的政策

您可以提供下列其中一項用於移除資源的政策:

DELETE[預設] 這會移除部署作業中資源的任何參照,並刪除基礎資源。此為永久操作且無法復原,但是您可以重新建立具有相同屬性的新資源。

ABANDON:可移除部署作業中資源的參照,但不會刪除其基礎資源。例如,捨棄執行個體代表將其從部署作業中移除,但是執行個體仍然存在且可供使用。

更新現有資源的政策

如果用於更新現有資源的 UPDATE 方法存在,Deployment Manager 就會使用該方法。

但如果自訂方法存在,Deployment Manager 則會使用該自訂方法。Deployment Manager 支援使用動詞 set 的自訂方法。例如,setMetadata() 為有效的自訂方法,但 addAccessConfigs() 則不是。

(選用) 預覽更新後的設定

您可以使用 gcloud 指令列工具或 API,在提交任何變更之前,先行瀏覽所要進行的更新。Deployment Manager 會展開完整設定並建立「殼層」資源以預覽設定。

預覽設定時,Deployment Manager 不會將任何實際的資源實例化,因此讓您有機會先查看部署作業的情形,然後再進行發布。

gcloud

使用 gcloud 指令列工具,提交內含 --preview 參數的 update 要求:

gcloud deployment-manager deployments update example-deployment \
    --config configuration-file.yaml \
    --preview

API

在 API 中使用現有部署作業發出 PUT() 要求,並提供 preview=true 查詢參數。要求主體必須包含 intenttargetname 欄位。請在網址和要求主體中提供部署作業名稱。

例如,下列 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

使用 gcloud 指令列工具提交 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

透過 gcloud 指令列工具,使用 deployments update 子指令提供新的設定,並選擇性地提供更新政策。

gcloud deployment-manager deployments update my-first-deployment \
    --config my-updated-config.yaml \
    --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

使用 gcloud 指令列工具提交 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=="
 }

後續步驟