当Terraform遇上ECS(一)——DataSource篇

本文涉及的产品
云服务器 ECS,每月免费额度280元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 镜像id、实例类型id,可用区都是创建ECS实例的时候必须要考虑的参数,您是通过什么方式来选择的呢?本文将介绍,如何通过Terraform来轻松筛选这些参数并创建ECS实例。

背景

越来越多的公司已经熟知并运用“基础设施即代码”来构建和维护自己的云基础设施。目前也有许多的自动化构建工具协助用户通过脚本进行云资源的部署和生命周期的管理,如:Terraform、Ansible、Chef等。但是,在实施过程中,都遇到了如何获取镜像id、可用区、实例类型id,如何跟自己的脚本相结合而备受困扰?

请首先检查一下您的构建脚本,是否有imageId=centos_6u8_64_40G_cloudinit_20161115.vhdinstanceType=ecs.s2.largezoneId=cn-beijing-a,类似这样hardcode的代码或者配置?您是否遇到过前几天还顺利运行的脚本, 再次创建的时候却报Image.Invalid错误?另外,您是通过什么方式获取到的这些code值,通过ECS售卖页?本文介绍如何通过Terraform Data Source完美解决这些问题,优雅的创建ECS instance。

Terraform简介

Terraform 是管理云基础设施的开源工具,支持阿里云、AWS、Azure、GoogleCloud、DigitalOcean等。他通过模板来定义基础设施,通过指令来实现资源创建/更新/销毁的全生命周期管理。创建ECS实例模板如下:

resource "alicloud_instance" "web" {
    # cn-beijing
    availability_zone = "cn-beijing-b"
    image_id = "ubuntu_140405_32_40G_cloudinit_20161115.vhd"

    system_disk_category = "cloud_ssd"

    instance_type = "ecs.n1.small"
    internet_charge_type = "PayByBandwidth"
    security_groups = ["${alicloud_security_group.tf_test_foo.id}"]
    instance_name = "test_foo"
    io_optimized = "optimized"
}

Install Terraform, 然后执行terraform apply,稍等片刻一台ECS实例就被创建完成。

Resource Data简介

对于常用的查询类资源,可以通过Resource Data实时获取,也能在模板中进行引用。Resource Data是只读类型的资源,支持参数过滤,不会改变基础架构状态。这里以Ecs instance_type为例,做一个介绍:

  • 之前:
    根据需要去ECS售卖页上去筛选实例规格,然后把规格code复制、粘贴到模板中。这种方式,不仅操作繁琐,也跟自动化运维的思路不相称。
  • 现在:
    以描述的方式填写过滤条件,Resource Data会进行查询并返回结果,模板片段如下:
data "alicloud_instance_types" "1c2g" {
  cpu_core_count = 1
  memory_size = 2
}

这里,我们定义了一个1核2G的Resource Data。执行terraform apply,您将会得到所有1核2G实例规格的一个Map,如下图:

{
                          
   "cpu_core_count": "1",
   "memory_size": "2",
   "id": "2404647170",
   "instance_types.#": "3",
   "instance_types.0.cpu_core_count": "1",
   "instance_types.0.family": "ecs.s1",
   "instance_types.0.id": "ecs.s1.small",
   "instance_types.0.memory_size": "2",
   "instance_types.1.cpu_core_count": "1",
   "instance_types.1.family": "ecs.n1",
   "instance_types.1.id": "ecs.n1.small",
   "instance_types.1.memory_size": "2",
   "instance_types.2.cpu_core_count": "1",
   "instance_types.2.family": "ecs.n4",
   "instance_types.2.id": "ecs.n4.small",
   "instance_types.2.memory_size": "2"
                          
}

其中,

- `cpu_core_count`和`memory_size`是我们自定义的筛选条件
- `instance_types.#`代表返回结果条目数
- 每个实例类型的结构包含`cpu_core_count`、`family`、`id`、`memory_size`四个属性。其中id是实例规格ID,如`ecs.s1.small`

创建Ecs实例

Terraform 已经集成了阿里云地域、可用区、镜像、实例规格类型几种常用Data Resource. 这几个资源组合到一起,可以发挥更大的作用。

举个例子:在大多数情况下,我们往往并不是非常关心实例具体到哪个可用区,但是API接口又需要我们指明可用区,然而不同可用区支持的实例类型、磁盘类型、网络类型都不同。要选到满意的搭配,需要煞费一番周折。但是,通过组合Data Source,多重过滤参数,可以很轻松的进行选配,即使调整参数,也不需要在页面上点来点去。

一般的购买行为是这样的:首先,我们都会有个初始需求。比如,操作系统必须是centos的,实例类型是低配的(1c1g ~ 2c2g),磁盘类型需要是固态云盘。然后,根据这个清单去尝试购买资源,这个过程中根据库存情况进行微调。

用模板描述资源过程是类似的:先定义镜像、实例类型和可用区的筛选条件,然后在Ecs的配置中引用他们,最后尝试去创建资源。如果库存不足,则进行参数调整。

模板如下:

data "alicloud_images" "centos" {
    owners = "system"
    name_regex = "^centos_6"
}

data "alicloud_instance_types" "1c2g" {
    cpu_core_count = 1
    memory_size = 2
    instance_type_family = "ecs.n1"
}

data "alicloud_zones" "default" {
    "available_instance_type"= "${data.alicloud_instance_types.1c2g.instance_types.0.id}"
    "available_disk_category"= "cloud_ssd"
}

resource "alicloud_instance" "instance" {
  image_id = "${data.alicloud_images.centos.0.image_id}"
  instance_type = "${data.alicloud_instance_types.1c2g.instance_types.0.id}"
  
  availability_zone = "${data.alicloud_zones.default.zones.0.id}"
  security_groups = ["${alicloud_security_group.group.id}"]

  internet_charge_type = "PayByTraffic"
  io_optimized = "optimized"

  instance_charge_type = "PostPaid"
  system_disk_category = "cloud_ssd"

}

resource "alicloud_security_group" "group" {
  name = "tf-sg"
  description = "New security group"
}

模板详解:

  • alicloud_images: 筛选centos类型的系统镜像
  • alicloud_instance_types: 选择1核2G的Ecs实例规格
  • alicloud_zones: 选择支持上述实例类型的可用区
  • alicloud_instance: 描述Ecs 实例配置
  • alicloud_security_group: 定义安全组

运行terraform apply,结果如下:

data.alicloud_instance_types.1c2g: Refreshing state...
data.alicloud_images.centos: Refreshing state...
data.alicloud_zones.default: Refreshing state...
alicloud_security_group.group: Creating...
  description: "" => "New security group"
  name:        "" => "tf-sg"
alicloud_security_group.group: Creation complete
alicloud_instance.instance: Creating...
  availability_zone:          "" => "cn-beijing-c"
  instance_type:              "" => "ecs.n1.small"
  image_id:                   "" => "centos_6u8_64_40G_cloudinit_20161115.vhd"

从运行结果来看,我们并没有提前指定实例类型、镜像、可用区的具体值,而是根据需求描述Terraform在运行时去查找到了合适的值。至此,一个模板把整个ECS的选配(从实例类型、镜像、可用区)等自动化配置了起来,不仅不需要人工的干预,还能进行后续的扩展、升级和维护。

反馈

本文讲述了一种自动化选配、构建ECS资源的方法。大家对自动构建工具Terraform感兴趣,或者有问题也可以在github https://github.com/alibaba/terraform-provider 的Issue中提问。

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
存储 弹性计算 运维
Terraform一键部署ECS实例
Terraform一键部署ECS实例
868 0
Terraform一键部署ECS实例
|
存储 弹性计算 Kubernetes
Terraform Aliyun 创建ecs, kubernetes 实例
terraform demo for aliyun 创建vpc, 网关, EIP, ecs, kubernetes, Serverless Kubernetes env : Terraform v0.12.28 provider.alicloud v1.92.0
1080 0
|
数据中心 弹性计算 存储
Terraform 一分钟部署阿里云ECS集群(含视频)
“企业上云”是当下大势所趋,“提效、降成本” 是企业上云、迁云和管理云必须关注的问题。今天将从一个集群部署的场景出发,介绍阿里云如何借助生态工具Terraform持续降低企业上云、迁云和管理云的成本。
2639 0
Terraform 一分钟部署阿里云ECS集群(含视频)
|
存储 弹性计算 数据中心
Terraform 一分钟部署阿里云ECS集群(含视频)
“企业上云”是当下大势所趋,“提效、降成本” 是企业上云、迁云和管理云必须关注的问题。今天将从一个集群部署的场景出发,介绍阿里云如何借助生态工具Terraform持续降低企业上云、迁云和管理云的成本。
5377 1
|
弹性计算 监控 数据中心
Segment:使用Docker、ECS和Terraform重建基础设施
本文讲的是Segment:使用Docker、ECS和Terraform重建基础设施,【编者的话】本文转帖自Segment公司CTO以及联合创始人Calvin French-Owen发表的文章。Segment公司采用独立的AWS账户进行真正意义上的隔离,采用Docker和ECS运行服务,并采用Terraform配置脚本进行整合并为服务描述添加Datadog供应商获得免费的监控告警信息。
1563 0
|
弹性计算 数据中心 对象存储
Terraform 助力 ECS 实例借助 RAM 管理阿里云产品
ECS 实例借助于 RAM Role 可以帮助实例内部应用程序实现对阿里云产品的轻松访问和管理,Terraform 可实现对 RAM Role,Policy,ECS 实例以及其他资源的统一管理和平滑扩容,以降低整个运维流程的复杂度。
5404 0
|
25天前
|
Ubuntu JavaScript 关系型数据库
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
在阿里云Ubuntu 20.04服务器上部署Ghost博客的步骤包括创建新用户、安装Nginx、MySQL和Node.js 18.x。首先,通过`adduser`命令创建非root用户,然后安装Nginx和MySQL。接着,设置Node.js环境,下载Nodesource GPG密钥并安装Node.js 18.x。之后,使用`npm`安装Ghost-CLI,创建Ghost安装目录并进行安装。配置过程中需提供博客URL、数据库连接信息等。最后,测试访问前台首页和后台管理页面。确保DNS设置正确,并根据提示完成Ghost博客的配置。
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
|
28天前
|
存储 弹性计算 数据可视化
要将ECS中的文件直接传输到阿里云网盘与相册(
【2月更文挑战第31天】要将ECS中的文件直接传输到阿里云网盘与相册(
415 4
|
30天前
|
SQL 弹性计算 安全
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
当我们通过阿里云的活动购买完云服务器之后,并不是立马就能使用了,还需要我们设置云服务器密码,配置安全组等基本操作之后才能使用,有的用户还需要购买并挂载数据盘到云服务器上,很多新手用户由于是初次使用阿里云服务器,因此并不知道这些设置的操作流程,下面给大家介绍下这些设置的具体操作流程。
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
|
14天前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。

热门文章

最新文章