乐趣区

关于github:App-Deploy-as-Code-SAE-Terraform-实现-IaC-式部署应用

企业上云是近些年的倒退热潮,越来越多的企业把本人的利用部署在各个云厂商中,利用云计算带来的弹性、灵便、平安、低成本等个性,轻松帮忙企业搭建本人的利用。

随着企业规模和业务状态的倒退,一个利用须要组合多种云资源能力对外提供服务,为了便于研发人员开发调试,每种利用都须要部署到多套环境,单纯通过人工手动治理云资源的形式会使得基础设施管理人员的累赘一直减轻。

因而越来越多的企业抉择应用代码(而非手动流程)来定义基础设施,即 IaC(Infrastructure as Code),像看待应用软件一样看待基础设施,这样不仅可能免去繁冗的人工操作还能够利用代码配置原生带来的版本化和抽象化等能力。

在云计算的时代下,利用的部署往往会依赖多个基础设施(计算、存储、网络)。企业外部往往须要一个 PaaS 平台来交付本人的利用,然而 PaaS 平台的开发和保护须要企业有较大的技术和人力投入。对于疾速倒退的企业更心愿可能把精力专一于企业的外围业务。

阿里云 Serverless 利用引擎 SAE(Serverless App Engine)是一个面向利用的 Serverless PaaS 平台,人造反对通过 IaC 的形式来创立和治理,而 Terraform 作为 IaC 畛域的事实标准,已成为了企业 IaC 治理的首选工具,将 Terraform 和 SAE 组合会产生一些微妙的化学反应,企业能够以一种 ADaC(Application Deploy as Code)的形式,通过简略的代码配置文件治理企业的利用。

上面,咱们简略的介绍 IaC 和 SAE 给企业带来的微小便当,并通过一个应用 Terraform 创立 SAE 利用的例子感触 SAE & Terraform 给传统企业 IT 设施治理带来的降维打击。

基础设施即代码

企业基础设施治理倒退历程

利用可能失常对外服务须要依赖计算、存储、网络等根底资源。他们是利用失常运行的根底上下文。这些资源也称为环境基础设施。在传统的管理模式下,大多数公司都会有专门的运维团队来治理本人的正式生产和测试环境。随着业务的降级和公司规模的增长,运维团队在根底资源管理上会经验大略 3 个阶段:

  • 手工运维 :在企业倒退初期,企业的业务品种和规模都处于起步阶段,而且根底环境属于变更频率绝对很低的资源,运维团队往往通过人工治理就能够搭建起服务所需的根底资源,应用云服务的企业在云厂商的控制台通过鼠标操作就能够实现云资源的创立。这一阶段研发人员基础设施需要很低,运维人员通过手工运维就能满足。
  • 运维操作脚本化 :随同企业规模和业务的倒退,运维团队会接管到越来越多的环境创立申请,大部分运维团队的成员为了晋升环境创立效率会自发的编写规范化的文档和脚本,或者通过 CLI 来辅助资源的创立,然而因为一个服务往往须要多种基础设施资源配合能力失常对外提供服务,脚本还无奈简略的解决不同基础设施之间的依赖关系,这一段运维人员创立环境会逐渐变成一个繁琐且低效的工作。
  • 基础设施即代码 :手工运维和文档脚本化曾经极大的影响开发效率。企业会逐渐把基础设施形象成代码,用治理代码的形式配置基础设施,对环境基础设施能够像看待代码一样进行版本控制和回滚,而且多个环境之间能够复用雷同的代码模块,实现环境基础设施的疾速交付。

Terraform 应运而生

2014 年,HashiCorp 公司推出了产品 Terraform,它是一个能够平安、高效地建设,变更以及版本化治理基础设施的工具,时至今日 Terraform 相对是 IaC 畛域的王者。应用 Terraform 治理企业基础设施能够给企业带来多种益处:

  • 应用申明式的 IaC 治理基础设施 :申明式的形容可能保障即便代码执行屡次也能达到统一的状态,应用代码来形容根底资源,可能更加形象间接的展现出不同环境之间的差别。不论什么环境呈现问题,都能疾速的复刻出一个新的环境。
  • 丰盛的 modules 生态 :简直蕴含所有云厂商的云资源,使用者能够在官网保护的模块仓库 Terraform Registry 中应用各种官网和社区提供的高质量模块。让使用者不必再反复编写其余云厂商的模块,利用开源社区的能力,不断完善和壮大 Terraform 生态。
  • 资源依赖治理 :Terraform 会依据模板中的定义,构建所有资源的 DAG 拓扑关系图。对于有依赖资源的资源,会依据依赖关系有序执行,对于没有任何依赖关系的资源会以并行的形式创立以保障执行的高效性。

    云计算时代下的企业应用部署

利用的部署往往会波及到 VPC 网络管理和划分,虚拟机的创立,通过负载平衡裸露利用的服务地址。在微服务架构流行的明天,企业还须要部署和运维一些微服务组件,以提供服务发现、配置管理、无损高低线等性能保障利用可能提供稳固一直流的服务。为了可能监控利用的运行状态,通过 Trace、Metrics、Logs 等信息来理解利用衰弱状态是必不可少的局部。

一个衰弱的利用须要组合一系列基础设施的能力,每个利用的测试和上线都会消耗研发和运维管理人员大量的精力。其实不难发现,每个利用的依赖资源都存在类似的中央,很多差异性只体现在一些配置项上。

如果一个产品可能组合这些基础设施的能力,对外提供利用的概念,研发人员只须要关怀业务代码的编写,运维管理人员也不须要治理和保护大量的基础设施,企业研发效率会有极致的晋升。

阿里云提供的 Serverless 利用引擎 SAE 就是这样一个升高企业 IT 人员心智的产品。

SAE 是面向利用的 Serverless PaaS 平台,可能帮忙 PaaS 层用户免运维 IaaS、按需应用、按量计费,做到低门槛微服务利用上云。绝对于其余 Serverless 产品,它将利用的概念抽象化,帮忙企业屏蔽了大量的基础设施的创立和治理,并提供了一整套微服务解决方案,反对 Spring Cloud、Dubbo、HSF 等支流的微服务开发框架,实现了 Serverless 架构和微服务架构的完满联合。

SAE 提供了保姆级的托管服务,研发人员只须要提供一个编译好的 JAR 包或者 WAR 包,就可能部署一个领有全套微服务体验的利用,基础设施管理人员的也无需治理大量的基础设施。

SAE & Terraform,利用即代码

当初你能够通过 Terraform 来创立和治理 SAE 上的利用,联合 Terraform IaC 和 SAE 以利用为核心的能力,这样企业就能将利用的全副配置代码化,轻松形容和治理利用,当因为人为或者其余意外因素导致利用处于不衰弱或者不可用的状态,咱们能够疾速的复刻出一个雷同的利用来把影响最小化。

Terraform 通过申明式的 HCL 语言来形容基础设施,程序员通知 Terraform 我冀望获取的资源状态,剩下的事件就交由 Terraform 来创立即可。不过 Terraform 不关怀创立出的利用的运行状态。运行在 Terraform 创立出资源的服务的失常运行须要研发人员来保障。SAE 底层基于 Kubernetes,利用 Kubernetes 申明式的能力,SAE 可能保障应用服务始终放弃申明的状态,失常的对外提供服务。Terraform 联合 SAE 更好的施展了利用资源申明式形容的能力。

上面,请跟上咱们的步调,一起来感触 IaC 的魅力。

筹备工作

本节为你演示如何利用 Terraform 的 IaC 和依赖治理能力,疾速拉起不同环境的利用以及组合 SAE 和其余云资源来构建你的利用。

开始之前,咱们先把演示相干的代码克隆到本地:

git clone git@github.com:yangsoon/terraform-sae.git

把创立云资源必要的 AK,SK 裸露到环境变量中。(Terraform 创立云资源的时候会应用环境变量中指定 AK 和 SK 创立云资源)。

export ALICLOUD_ACCESS_KEY=(your access key id)
export ALICLOUD_SECRET_KEY=(your secret access key)

疾速创立多环境利用

进入到我的项目的根目录并简略看下我的项目的目录构造。modules 文件夹蕴含了封装好的环境基础设施模块,包含应用阿里云 SLB 实现负载平衡和外网拜访能力的 lb,提供专有网络的 network 模块,webserver 模块对阿里云 SAE 资源进行了进一步封装,不便用户在不同环境创立利用时,可能间接复用,缩小不必要的代码拷贝。

stage 和 prod 别离存储企业在预发环境和生产环境的资源配置。预发环境和生产环境的环境基础设施存在较大的差别,并且生产环境的资源配置有更高的平安需要,为了避免误操作导致生产环境的资源被损坏,咱们通过文件布局进行隔离。

关上 ./stage/webserver/main.tf 文件,能够看到在预发环境咱们指定应用 webserver 组件创立利用。

module "network" {
  source   = "../../modules/network"
  vpc_name = var.vpc_name
}

module "webserver" {
  source = "../../modules/webserver"

  sg_id      = module.network.SG_ID
  vpc_id     = module.network.VPC_ID
  vswitch_id = module.network.VSWITCH_ID

  app_name       = var.app_name
  image_url      = var.image_url
  namespace_name = var.namespace_name
  namespace_id   = var.namespace_id
}

在 ./stage/webserver/vars.tf 中填入预发环境对应的利用名称和镜像地址(这里以 nginx 为例)。

variable "app_name" {
  description = "The name of the application"
  type        = string
  default     = "webserver-stage"
}

variable "image_url" {
  description = "The image of the application"
  type        = string
  default     = "nginx:stable"
}

上面,咱们就利用 Terraform 疾速构建一个预发环境.

  1. 进入到 ./stage/webserver 文件夹,初始化 Terraform 工作区

    cd terraform-sae/stage/webserver
    terraform init

    该步骤会帮你初始化 Terraform 子模块曾经装置必要的插件,执行胜利后显示如下所示信息

  2. 查看预发环境会创立出的资源类型和个数

    terraform plan

执行 terraform plan 之后输入内容较多,这里就截取了局部信息,能够看到预发环境会创立 6 个资源,输入后果会显示新创建的资源的具体配置信息。

  1. 确认无误之后,咱们开始创立预发环境所需的资源。

    terraform apply

terraform apply 会再次为你展现本次执行会创立出的资源信息,确认无误之后,输出 yes,这时候 Terraform 才会真正的为你创立资源。

这里稍等一段时间,期待资源创立实现,你能够登录阿里云控制台查看刚刚创立的利用。

等一系列调试测试验证通过之后,能够持续创立生产环境的资源。
关上 ./prod/webserver/main.tf 文件,能够看到咱们能够间接复用 webserver 模块,并批改一些利用名称和利用镜像为生产环境相干的配置即可,除此之外,咱们新建了一个 SLB,容许利用可能被外界拜访。上面咱们持续创立生产环境的利用。


module "lb" {
  source = "../../modules/lb"

  slb_name     = var.app_name
  address_type = "internet"
  vswitch_id   = module.network.VSWITCH_ID
}

resource "alicloud_sae_load_balancer_internet" "example" {
  app_id          = module.webserver.app_id
  internet_slb_id = module.lb.slb_id
  internet {
    protocol    = "HTTP"
    port        = var.port
    target_port = 80
  }
}

module "webserver" {
  source = "../../modules/webserver"

  sg_id      = module.network.SG_ID
  vpc_id     = module.network.VPC_ID
  vswitch_id = module.network.VSWITCH_ID

  app_name       = var.app_name
  image_url      = var.image_url
  namespace_name = var.namespace_name
  namespace_id   = var.namespace_id
}

批改./prod/webserver/vars.tf 中填入生产环境对应的利用名称和镜像地址等信息。
进入到 ./prod/webserver 文件夹,初始化 Terraform 工作区

cd terraform-sae/prod/webserver
terraform init

查看生产环境会创立出的资源类型和个数

terraform plan

这里生产环境会多创立 2 个和 SLB 相干的资源。

  1. 确认无误之后,咱们开始创立生产环境所需的资源。

    terraform apply

期待一段时间后,咱们创立了一个外网能够拜访的利用。输入后果里蕴含了咱们能够拜访的外网地址。申请该地址,能够看到一个 nginx 服务器曾经搭建胜利。

至此,咱们利用 Terraform 的能力疾速创立了多环境利用。

应用 Terraform 依赖治理能力高效组合 SAE 和其余云资源

SAE 在 Terraform 生态下还有更高阶的玩法,你能够任意组合其余云资源。以 RDS 为例,你能够把 RDS 的一些连贯信息以环境变量的模式注入到 SAE 利用中,利用启动之后能够通过环境变量的信息连贯到指标数据库。

关上 ./prod/webserver-with-db/main.tf,咱们引入了 mysql 模块帮咱们创立一个阿里云 RDS 实例,创立 RDS 之后的数据库连贯信息,以环境变量的模式注入了 SAE 利用中。

module "mysql" {
  source = "../../modules/mysql"

  databases = [
    {
      "name" : "sae-demo",
      "character_set" : "utf8",
      "description" : "sae demo database"
    },
  ]

  rds_instance_name = var.rds_instance_name
  rds_account_name  = var.rds_account_name
  rds_password      = var.rds_password
}


module "webserver" {
  source = "../../modules/webserver"

  sg_id      = module.network.SG_ID
  vpc_id     = module.network.VPC_ID
  vswitch_id = module.network.VSWITCH_ID

  app_name       = var.app_name
  image_url      = var.image_url
  namespace_name = var.namespace_name
  namespace_id   = var.namespace_id

  envs = [{
    name  = "DB_HOST"
    value = module.mysql.DB_HOST
    }, {
    name  = "DB_PORT"
    value = module.mysql.DB_PORT
    }, {
    name  = "DB_PASSWORD"
    value = module.mysql.DB_PASSWORD
    }, {
    name  = "DATABASE_NAME"
    value = module.mysql.DATABASE_NAME
  }]
}

上面咱们演示一下创立一个应用 RDS 作为数据存储的利用。
和之前 2 个例子相似,咱们进入到 terraform-sae/prod/webserver-with-db 目录下,执行工作空间初始化工作。

cd terraform-sae/prod/webserver-with-dbterraform init

开始创立资源

terraform apply

资源创立实现之后,会输入数据库的公网范畴地址。

  1. 查看 SAE 利用中的环境变量

能够看到创立出的 RDS 的连贯信息曾经被配置到了环境变量中。

执行完 Demo 指令创立云资源后,为了防止不必要的扣费,记得及时销毁创立的演示资源。


$ cd terraform-sae/stage/webserver && terraform destroy
$ cd terraform-sae/prod/webserver && terraform destroy
$ cd terraform-sae/prod/webserver-with-db && terraform destroy

总结
SAE 和 Terraform 的联合,可能帮忙企业像解决代码一样治理本人的利用,对资源的操作都变得可审计,可追溯,可回滚,同时也升高人为操作带来的危险。而 SAE 将利用的概念抽象化,帮忙企业屏蔽了大量的环境基础设施的创立和治理,升高了用户应用门槛,助力企业疾速上云。

参考文献

[1] Yevgeniy Brikman.《Terraform: Up & Running: Writing Infrastructure as Code》.O’Reilly Media
[2] 乔梁.《继续交付 2.0》. 人民邮电出版社

更多内容关注 Serverless 微信公众号(ID:serverlessdevs),会集 Serverless 技术最全内容,定期举办 Serverless 流动、直播,用户最佳实际。

退出移动版