为了提供更加高效灵活的伸缩服务,弹性伸缩配置中新增了实例自定义数据(UserData)。您可以利用 UserData 自动完成 ECS 实例配置,从而安全快速地实现应用级别的扩容和缩容。

本文将详细介绍 UserData,并结合具体场景向您展示 UserData 的使用方式。您可以根据自己的业务场景,灵活地使用 UserData 来满足您的业务需求。

UserData 是阿里云 ECS 为您提供的一种自定义实例启动行为及传入数据的功能,该功能兼容 Windows 实例及 Linux 实例,主要有两种用途:

  • 作为实例自定义脚本,在实例启动时自动执行。
  • 作为普通数据,将一定的信息传入实例中,您可以在实例中引用这些数据。

在使用弹性伸缩调整 ECS 实例数时,如果您希望自动实现应用级别的扩容和缩容,常用方法是利用自定义镜像或者 Terraform 等开源的 IT 基础架构管理工具。

利用 UserData 参数,您只需要准备好自定义脚本数据,然后以 Base64 编码的方式传入伸缩配置中即可。当弹性扩容 ECS 实例时,实例自定义脚本会在实例启动时自动执行。相比自定义镜像和 Terraform 等开源工具,弹性伸缩原生的 UserData 特性更加快捷安全。

注意事项

如果您要在创建伸缩配置时使用 UserData 参数,需要注意:

  • 只有专有网络(VPC)的伸缩配置能够使用 UserData 参数。
  • 要以 Base64 编码的方式传入 UserData 参数。

另外,UserData 将以不加密的方式传入,请避免以明文方式传入机密的信息(比如密码、私钥数据等)。如果必须传入,建议先进行加密,以 Base64 的方式编码后再传入,然后在实例内部以同样的方式反解密。

说明 更多 UserData 参数的使用方法,请参阅 实例自定义数据

最佳实践

本章节将结合 Userdata 参数介绍伸缩组和伸缩配置的创建过程,并设置一个简单的使用场景,以便您理解弹性伸缩服务并准确地应用到自己的业务中。

创建伸缩组

首先,您需要创建一个伸缩组。由于只有专有网络(VPC)的伸缩配置能够使用 UserData 参数,因此本文将基于专有网络伸缩组展开介绍。

  1. 登录 弹性伸缩控制台,单击页面右上角的 创建伸缩组
  2. 创建伸缩组 对话框中,填写必需参数并指定伸缩组所在的虚拟交换机。

  3. 单击 提交 创建一个专有网络伸缩组。

创建伸缩配置

创建完伸缩组以后,会弹出 伸缩组创建成功 对话框,单击 创建伸缩配置 按钮,继续创建伸缩配置,如下图所示:



基本的伸缩配置参数这里不做过多介绍,您可以参考 创建伸缩配置 来了解每个参数的作用和设置方式,完成伸缩配置并启用伸缩组。下面通过 2 个场景来介绍 UserData 参数的设置。

UserData参数设置

UserData 支持 Windows 系统和 Linux 操作系统,这里介绍在 Linux 操作系统中的应用。您可以利用 UserData 实现在 ECS 实例启动时自动执行自定义 shell 脚本,在定义 shell 脚本时,需注意以下几点:

  • 格式:首行必须以 #! 开头,例如 #!/bin/sh
  • 限制:在 Base64 编码前,脚本内容(包括首行在内)不能超过 16 KB。
  • 频率:仅在首次启动实例时执行一次。

示例1

定义一个 shell 脚本,来实现在实例首次启动后向 /root/output10.txt 文件写入字符串 Hello World. The time is now {当前时间}

脚本内容如下:

#!/bin/sh
echo "Hello World.  The time is now $(date -R)!" | tee /root/output10.txt

脚本经过 Base64 编码后内容如下:

IyEvYmluL3NoDQplY2hvICJIZWxsbyBXb3JsZC4gIFRoZSB0aW1lIGlzIG5vdyAkKGRhdGUgLVIpISIgfCB0ZWUgL3Jvb3Qvb3V0cHV0MTAudHh0

示例2

定义一个 shell 脚本,来实现在 ECS 启动时配置 DNS、yum、NTP 等。

脚本内容如下:

#!/bin/sh
# Modify DNS
echo "nameserver 8.8.8.8" | tee /etc/resolv.conf
# Modify yum repo and update
rm -rf /etc/yum.repos.d/*
touch myrepo.repo
echo "[base]" | tee /etc/yum.repos.d/myrepo.repo
echo "name=myrepo" | tee -a /etc/yum.repos.d/myrepo.repo
echo "baseurl=http://mirror.centos.org/centos" | tee -a /etc/yum.repos.d/myrepo.repo
echo "gpgcheck=0" | tee -a /etc/yum.repos.d/myrepo.repo
echo "enabled=1" | tee -a /etc/yum.repos.d/myrepo.repo
yum update -y
# Modify NTP Server
echo "server ntp1.aliyun.com" | tee /etc/ntp.conf
systemctl restart ntpd.service

脚本经过 Base64 编码后内容如下:

IyEvYmluL3NoCiMgTW9kaWZ5IEROUwplY2hvICJuYW1lc2VydmVyIDguOC44LjgiIHwgdGVlIC9ldGMvcmVzb2x2LmNvbmYKIyBNb2RpZnkgeXVtIHJlcG8gYW5kIHVwZGF0ZQpybSAtcmYgL2V0Yy95dW0ucmVwb3MuZC8qCnRvdWNoIG15cmVwby5yZXBvCmVjaG8gIltiYXNlXSIgfCB0ZWUgL2V0Yy95dW0ucmVwb3MuZC9teXJlcG8ucmVwbwplY2hvICJuYW1lPW15cmVwbyIgfCB0ZWUgLWEgL2V0Yy95dW0ucmVwb3MuZC9teXJlcG8ucmVwbwplY2hvICJiYXNldXJsPWh0dHA6Ly9taXJyb3IuY2VudG9zLm9yZy9jZW50b3MiIHwgdGVlIC1hIC9ldGMveXVtLnJlcG9zLmQvbXlyZXBvLnJlcG8KZWNobyAiZ3BnY2hlY2s9MCIgfCB0ZWUgLWEgL2V0Yy95dW0ucmVwb3MuZC9teXJlcG8ucmVwbwplY2hvICJlbmFibGVkPTEiIHwgdGVlIC1hIC9ldGMveXVtLnJlcG9zLmQvbXlyZXBvLnJlcG8KeXVtIHVwZGF0ZSAteQojIE1vZGlmeSBOVFAgU2VydmVyCmVjaG8gInNlcnZlciBudHAxLmFsaXl1bi5jb20iIHwgdGVlIC9ldGMvbnRwLmNvbmYKc3lzdGVtY3RsIHJlc3RhcnQgbnRwZC5zZXJ2aWNl

shell 脚本准备完毕后,伸缩配置中镜像类型选择 系统镜像,然后选择 Linux 类型的镜像(例如 Ubuntu):



高级选项 下的 实例自定义数据 中填写 Base64 编码以后的脚本数据,并勾选 输入已采用base64编码选项,下图为 示例1 的效果:



3. 查看伸缩活动

由于创建伸缩组时指定 伸缩最小实例数 为 1,启动伸缩组后,弹性伸缩服务会立即启动一个伸缩任务,向当前伸缩组添加 1 台实例,以满足最小实例数的限制。您可以进入伸缩活动列表页,查看当前伸缩组对应的伸缩活动执行详情,如下图所示:



4. 验证 UserData 参数效果

登录伸缩活动中创建的实例,查看 /root/output10.txt 文件,验证 示例1 的 UserData 参数的执行结果,如下图所示:



查看服务状态,验证 示例2 的 UserData 参数的执行结果,如下图所示:



可以看出伸缩配置中设置的 UserData 参数已经生效。

本最佳实践向您展示了 UserData 的使用方式,但使用的 shell 脚本比较简单。您可以根据自己的需求定制脚本,更加高效灵活地管理您的 ECS 实例。

更多特性

面对不断变化的业务需求,弹性伸缩不仅为您提供了在业务需求高峰或低谷时自动调节 ECS 实例数量的能力,而且为您提供了在 ECS 实例上快速安全地部署服务的能力。除实例自定义数据(UserData)外,SSH 密钥对(KeyPairName)、RAM 角色名称(RamRoleName)和标签(Tags)也可以帮助您更加高效灵活地管理 ECS 实例。合理地使用弹性伸缩服务,不仅能够有效地降低您的服务器成本,而且能够有效地降低您的服务管理和运维成本。

您可以登录 弹性伸缩控制台 体验弹性伸缩的新特性,同时也可以参考 创建伸缩配置 来使用这些新特性。