面向 AWS 专业人员的 Google Cloud Platform 简介:基础架构部署工具

更新时间:2017 年 12 月 6 日

在 Google Cloud Platform (GCP) 和 Amazon Web Services (AWS) 上,您都可以使用基础架构即代码方法管理云端环境。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 权限。您还可以设置 IAM 政策以限制或允许 CloudFormation 的使用。

Deployment Manager

Deployment Manager 使用三种类型的文件来定义部署:

  • 配置文件,用于定义部署结构并配置要部署的资源。该文件采用 YAML 编写。您可以将该文件用作独立配置进行部署,也可以将其与导入的模板文件结合使用,以提高灵活性。
  • 模板文件,这类文件是可组合、可重复使用的资源定义。模板文件采用 Jinja 2.7.3Python 2.7 编写。您可以添加循环以创建相同资源的多个实例,而无需明确声明每个实例。
  • 架构文件,用于定义配置文件在使用特定模板时必须满足的一组规则。

您可以通过 gcloud 命令行工具或 API 将配置文件(配置文件将扩展其引用的任何模板)传递至 Deployment Manager 服务,也可以使用 Cloud 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 注册的其他类型。要创建类型提供程序,必须提供 API 描述符文档,该文档可以是 OpenAPI 规范Google Discovery 文档。创建和注册类型提供程序时,由 API 提供且 RESTful 接口支持的可执行创建、读取、更新和删除 (CRUD) 操作的所有资源均作为您可在部署中使用的类型公开。

您可以通过扩展基本类型来创建复合类型。复合类型是可搭配使用的多个基本类型的组合。例如,网络负载平衡托管式实例组便是一种复合类型。网络负载平衡器需要多个 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 不会实例化任何实际资源,而是会扩展完整配置并创建 shell 资源。这样,您便有机会在提交之前查看部署。

Deployment Manager 还提供一些政策,您在更新部署时可以用来帮助控制 Deployment Manager 如何管理更新。一些资源是不可变的,可能没有更新方法。与 AWS CloudFormation 一样,您应该检查资源的 API 方法,以了解更新产生的影响。

在进行任何更新之前,您还可以查看清单,了解部署的实际样子。您可以通过命令行界面或控制台进行此操作。

费用

AWS CloudFormation 和 GCP Deployment Manager 均可免费使用。无论使用其中哪一种,您都只需为自己启动的资源付费。

后续事项

查看其他“面向 AWS 专业人员的 Google Cloud Platform 简介”文章:

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
面向 AWS 专业人员的 Google Cloud Platform 简介