為 AWS 專家量身打造的 Google Cloud Platform:基礎架構部署工具

更新日期:2017 年 12 月 6 日

無論在 Google Cloud Platform (GCP) 或 Amazon Web Services (AWS) 上,您都可以採用 Infrastructure-as-code 做法來管理雲端環境。GCP 會提供 Deployment Manager,而 AWS 則會提供 CloudFormation 供您管理。

如要將您的基礎架構視為程式碼來處理,則必須透過指令碼、範例和設定檔定義環境,並且要將檔案保存於原始碼存放區。採用這種做法可讓您執行下列操作:

  • 控制您的設定版本。
  • 部署可重現的一致性設定。
  • 審查設定變更的稽核追蹤。
  • 使用設定當做持續部署系統的一部分。
  • 輕鬆容錯回復為先前已知正常的設定

服務模式比較

下表將 CloudFormation 的高階功能、詞彙和概念以及 Deployment Manager 的高階功能、詞彙和概念進行對應比較:

功能 AWS CloudFormation GCP Deployment Manager
部署的資源集合 堆疊 部署
部署檔案 範本檔案 設定檔、範本檔案和結構定義檔案
語法 JSON 和 YAML YAML、Jinja 和 Python
組合和重複使用 巢狀堆疊 範本
個別資源的識別 邏輯 ID 名稱
部署位置的範圍 地區性 全球性
堆疊或部署的預設數量上限 200 1000
圖形使用者介面
預覽
堆疊政策

範本和設定

下表對 CloudFormation 和 Deployment Manager 中的可用範本與設定功能進行比較:

功能 AWS CloudFormation GCP Deployment Manager
範本或設定的大小上限 460.8 KB 1 MB
陳述式
條件
迴圈
參數化
輸出值

AWS CloudFormation

在 AWS CloudFormation 中,您建立範本針對各項服務定義一系列動作,例如建立 S3 值區或啟用 EC2 執行個體。AWS 範本可使用 YAML 或 JSON 語法來表示,而 AWS CloudFormation 可從 S3 值區或本機電腦叫用範本。當 AWS CloudFormation 叫用範本時,即會針對您在範本中定義的服務呼叫 API 以啟動及設定服務。

如要使用範本中定義的服務,您必須具有每項服務適用的 AWS IAM 權限。您也可以設定限制或允許使用 CloudFormation 的 IAM 政策

Deployment Manager

Deployment Manager 會使用下列三種檔案定義部署作業:

  • 設定檔用於定義部署作業的結構,以及設定要部署的資源。這個檔案採用 YAML 語法編寫而成。您可以將這個檔案當做部署作業的獨立設定來使用,也可以和匯入的範本檔案結合,進而提高彈性。
  • 範本檔案是可撰寫且可重複使用的資源定義,範本檔案採用 Jinja 2.7.3Python 2.7 編寫而成。您可藉由新增迴圈的方式建立相同資源的多個執行個體,不需明確宣告每個執行個體。
  • 結構定義檔案定義多組規則,設定檔必須符合這些規則才能使用特定範本。

您可以透過 gcloud 指令列工具或 API 將設定檔 (此檔案將會展開參考的任何範本) 傳送至 Deployment Manager 服務,也可以藉由 GCP Marketplace 啟用預先定義的設定。

根據預設,Deployment Manager 會使用 GCP API 服務帳戶的憑證向其他 API 進行驗證。您必須使用 Deployment Manager 將使用 Deployment Manager 的適當權限授予使用者。您可以使用預先定義的 IAM 角色適當地限制權限。Deployment Manager 可讓您自動建立專案以及專案內含的資源。

Deployment Manager 設定檔由下列部分組成:

imports:
  - path: network.jinja
resources:
- name: network
  type: network.jinja
  properties:
    region: us-central1
    subnets:
      - range: 10.177.0.0/17
        name: web
      - range: 10.177.128.0/17
        name: data
- name: web-instance
  type: compute.v1.instance
  properties:
    zone: us-central1-f
    machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/machineTypes/f1-micro
    disks:
    - deviceName: boot
      type: PERSISTENT
      boot: true
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    networkInterfaces:
    - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

上述 GCP 範例設定由下列部分組成:

匯入。 這部分的內容會參照可撰寫範本的路徑,而可撰寫範本則會展開成為實際部署的一環。您可以自行選擇是否要編寫這部分內容,因為您可能已將個別資源放入複合式範本檔案,因此不需要建立設定,很輕鬆就能完成部署作業。

資源。 這份清單會列出您想要部署做為設定一部分的資源,同時也是設定唯一的必要規定。每個資源都是由下列組成部分定義而成:

  • 名稱。您為這個資源定義的名稱。上述範例包括名稱分別是 networkweb-instance 的兩項資源。
  • 類型。指定資源的基本類型。範例介紹兩種資源類型,web-instance 屬於 compute.v1.instance 類型,第二項資源則是指在設定檔的 imports 部分宣告的匯入檔案。本範例採用 Jinja 檔案類型,但是您也可以匯入 Python 檔案。
  • 屬性。資源的相關屬性。名為 web-instance 的資源會定義 f1-micro, 機器類型的 Compute Engine 執行個體;這種機器具有永久磁碟,因此,刪除執行個體即會自動執行刪除作業。系統會將執行個體部署至 us-central1-f 地區。您需在 network.jinja 個別範本檔案中定義第二個資源,接著在設定檔中定義這個資源的屬性值。而後,系統會將這些值傳送到實際的範本檔案。這種可組合性能夠讓您透過設定檔將值傳送到資源定義,因此非常適合運用可重複使用的資源定義建構複雜的部署工作。舉例來說,您可以使用相同的範本檔案搭配不同的 IP 範圍和名稱,以利建立其他子網路。

設定檔也可以包含輸出中繼資料

結構定義檔定義範本用法的一系列規則。在單一結構定義中定義規則,可讓使用者瞭解如何與您撰寫的範本互動。有了結構定義檔,使用者就不需要檢查組成設定的範本,也不用瞭解要設定哪些屬性以及哪些屬性有預設值。如需取得結構定義檔的詳細資料,請參閱Deployment Manager 說明文件

這個範例範本會使用公開映像檔建立執行個體。GCP 採用全球性做法,因此當您選取映像檔類型來啟動執行個體時,不需要針對每個地區建立映像檔類型的對應關係,但如果使用 AWS CloudFormation 就會多出這道程序。您可以使用 GCP 宣告機器類型和來源映像檔,而且所有專案均可使用這個來源映像檔。

組合和重複使用

AWS CloudFormation 和 GCP Deployment Manager 都鼓勵您組合自己的堆疊和部署,以及重複使用這些堆疊和部署。

AWS CloudFormation

AWS CloudFormation 依賴巢狀堆疊的概念;有了巢狀堆疊,您就可以針對要重複使用的資源建立範本。您將要自主要範本呼叫的範本存放於 S3 值區,並且採用 AWS::CloudFormation::Stack 類型,然後將範本的 S3 網址當做屬性傳送。

藉由參數您就能輕鬆地建立範本,而且之後每次都可使用範本建立堆疊。您還可以使用內在函數搭配參數來建立條件式資源。

您可以使用輸出,透過指派給值的邏輯 ID 匯出值,這樣就能在其他位置使用該值。比方說,您可以匯出負載平衡器和 S3 值區的名稱、將值匯入其他堆疊,然後在主控台中公開這些值。

CloudFormation 會並行建立資源,然後判斷可並行部署哪些資源,但是您可能需要使用建立政策和 DependsOn 屬性來協助強制排定建立資源的順序。舉例來說,部署作業可能必須先建立 EBS 磁碟區,然後才能建立會使用該磁碟區的執行個體。

您可以使用自訂資源,併入非 AWS 資源當做 CloudFormation 堆疊的一部分。您要在範本的 Properties 部分提供服務憑證,才能實作自訂資源。服務憑證會指定 CloudFormation 應傳送要求的目的地。

GCP Deployment Manager

Deployment Manager 可讓您將範本匯入設定檔。您可以在 import 陳述式中宣告範本的路徑,而範本可能儲存在本機、Cloud Storage 值區或是可公開存取的網址 (例如 GitHub)。這樣您就能將範本當做設定的一部分來擴充和重複使用。

您可以將變數傳送給範本,藉以自訂 Deployment Manager 範本。您可以使用下列兩種變數搭配 Deployment Manager:範本變數環境變數。您可以使用範本變數來定義設定檔中的可自訂值,然後再將值傳送給範本檔案。環境變數為預先定義及自動指派。環境變數是設計使用於並未與要部署的資源直接相關的項目,例如專案 ID 和部署作業名稱。

Jinja 和 Python 均可讓您運用其原生的條件及迴圈函數。

Deployment Manager 依賴範本模組的概念。您可以將範本模組和可用於多個範本中的範本片段合併使用。比方說,範本模組可讓您一律依據環境和功能來產生執行個體的名稱。

Deployment Manager 會並行建立所有資源,而您可透過參照內容強制排定建立資源的順序。比方說,如果執行個體在設定中參照新網路,則無論在設定檔的何處宣告網路,您都能確保 Deployment Manager 一定會先建立網路,然後再建立執行個體。

Deployment Manager 的輸出旨在以輕鬆易用的方式公開資源的金鑰屬性,如此一來,其他範本就能使用資源或是在設定中公開提供資源。輸出宣告結果會是鍵/值組合,而且可包含靜態字串、屬性參照範本變數環境變數

如果 GCP 支援的類型不符合需求,那麼您可以建立類型提供者,然後建立可以向 Deployment Manager 註冊的其他類型。您必須提供可能為 OpenAPI 規範Google Discovery 文件的 API 描述元文件,才能建立類型提供者。當您建立並註冊類型提供者時,由 API 提供且獲具有建立、讀取、更新和刪除 (CRUD) 作業的 RESTful 介面支援的所有資源都會以您可在部署作業中使用的類型呈現。

您可以擴充基本類型以建立複合類型。複合類型是由設定為協同合作的多個基本類型組合而成。例如,網路負載平衡的代管執行個體群組即為複合類型。網路負載平衡器需要多個 GCP 資源以及資源間的某項設定。您可以在設定中配置一次這些資源,並且向 Deployment Manager 註冊類型。

中繼資料、輔助指令碼和開機指令碼

AWS CloudFormation 提供一組 Python 指令碼,可協助您在 EC2 執行個體上啟動服務及安裝軟體。這些指令碼位於存放區或是安裝於 Amazon Linux AMI 上,而您可以從範本呼叫這些指令碼。此外,您也可以使用 metadata 屬性在執行個體上新增或擷取中繼資料。

GCP Deployment Manager 可讓您在部署作業中使用開機指令碼,或是藉由在範本或設定內指定中繼資料,而將中繼資料新增至虛擬機器執行個體。開機指令碼的中繼資料鍵必須是 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"

更新堆疊和部署

AWS CloudFormation

您可藉由傳送新的參數值或更新的範本來更新 CloudFormation 堆疊。套用變更集合前,您可以先使用變更集合查看將會變更哪些堆疊設定和資源。

Cloud Deployment Manager

您也可以使用 Deployment Manager 更新部署以及預覽可能發生的變更,這樣就能評估變更可能帶來的影響。預覽設定時,Deployment Manager 不會將任何實際的資源實例化,而是只會展開完整的設定並建立殼層資源。這樣您就能夠先看看部署的情形,然後再發佈。

Deployment Manager 也會提供更新部署時使用的政策,協助您控制 Deployment Manager 管理更新的方式。有些資源無法變更,而且可能沒有更新方法。和使用 AWS CloudFormation 時一樣,您應該先查看資源的 API 方法,瞭解執行更新可能帶來的影響。

您也可以檢視資訊清單以瞭解部署實際看起來的樣貌,然後再進行更新。您可以透過指令列介面或主控台來執行這項操作。

費用

AWS CloudFormation 或 GCP Deployment Manager 為免費工具,使用者無須額外付費。使用這兩項工具時,您僅需要針對自己啟用的資源付費。

後續步驟

請參閱其他「為 AWS 專家量身打造的 Google Cloud Platform」文章:

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
為 AWS 專家量身打造的 Google Cloud Platform