讲解阿里云国际 ECS User Data、cloud-init、执行频率、cloud-config 示例、幂等设计、日志排查和元数据安全。
准确入口:在阿里云国际中文控制台进入“云服务器 ECS → 创建实例 → 高级选项 → 实例自定义数据”,填入以 #!/bin/bash 或 #cloud-config 开头的内容。User Data 本身通常不单独收费,也不会自动删盘,但会以高权限改系统,脚本下载流量或创建的云资源仍可能收费。默认把它当首次启动初始化,不要以为修改后重启一定再次执行。

适合和不适合放什么
| 适合 | 不适合 |
|---|---|
| 软件安装、目录创建、基础配置 | 长期 AccessKey、私钥和数据库密码 |
| 监控、日志和安全 Agent | 没有超时的大型部署流程 |
| 拉取配置管理或发布入口 | 依赖人工输入的交互命令 |
| 标准化伸缩实例初始化 | 无法重复执行且无日志的脚本 |
一个 cloud-config 示例
#cloud-config
package_update: true
packages:
- nginx
runcmd:
- [ sh, -c, "mkdir -p /opt/bootstrap" ]
- [ sh, -c, "date -Iseconds > /opt/bootstrap/completed" ]
生产脚本需要固定或约束软件版本、为网络请求设置超时,并把执行结果写入日志。不要从未经校验的公网 URL 下载脚本后直接以 root 执行。
为什么必须具备幂等性
- 创建目录和用户前先判断现有状态;
- 修改配置时避免每次重复追加;
- 数据库变更使用有版本的迁移工具;
- 失败后能区分未开始、进行中和已完成;
- 弹性伸缩创建的新实例使用同一版本脚本。
执行失败怎么查
cloud-init status --long
sudo tail -n 100 /var/log/cloud-init.log
sudo tail -n 100 /var/log/cloud-init-output.log
- 确认镜像安装并启用了正确初始化组件;
- 核对 User Data 格式、大小和换行编码;
- 确认首次启动时 DNS、软件源和公网或 NAT 出口可用;
- 检查脚本解释器和命令是否存在;
- 确认修改已有实例后,该格式是否会在下次启动运行。
元数据安全
User Data 和 RAM 临时凭证可能通过实例元数据访问。Web 应用必须防范 SSRF,不提供可请求任意 URL 的未受控代理接口;优先使用实例元数据安全加固模式和官方凭证工具。
边界条件
阿里云官方文档说明,特定格式可在每次 Linux ECS 启动时执行,而常见模块也有只运行一次的频率。修改已有实例后是否执行必须按实际格式核对,不能把 User Data 当作持续配置管理系统。
提交脚本前先做三个限制
脚本只负责安装基础依赖、写入非敏感配置和启动受控部署程序。数据库密码、AccessKey 和私钥不要写进去,因为实例元数据、控制台权限和日志都可能暴露内容。每项操作先判断现状:包已安装就跳过,配置相同不重复追加,服务已启用不重复创建。
执行失败的取证顺序
- 运行
cloud-init status --long,记录错误阶段和时间。 - 查看
/var/log/cloud-init-output.log、cloud-init 日志和系统日志中的第一条失败。 - 核对首行、缩进、编码、换行和所用发行版的软件包命令。
- 检查 VPC 的 DNS 与 HTTPS 出站;私网实例没有出口时,软件下载会失败。
- 确认自定义镜像保留了 cloud-init,并清理了不应复制的旧实例状态。
为什么不建议在原生产机强制重跑
重复脚本可能再次格式化磁盘、覆盖配置或重置账户。需要复用时,把实例自定义数据写入新的启动模板版本,从同一镜像新建测试 ECS。确需在存量机执行的任务,应拆成可审核的脚本,通过云助手或配置管理工具运行,并加入版本标记、超时和失败退出。
完成标准和回退
检查初始化日志、目标包版本、服务状态、监听端口和应用健康页,再重启一次确认自启动。批量伸缩时先放一台新实例进入测试后端。若失败,停止新模板扩容并切回旧启动模板;原机变更依赖快照或配置备份回退。不要通过反复清空 cloud-init 状态让同一未知脚本继续修改生产机。
阿里云国际 ECS User Data 怎么用现场验收单
- 入口或命令:云服务器 ECS → 实例 → 创建实例 → 高级选项 → 实例自定义数据;已有实例按控制台允许路径编辑
- 提交前风险:User Data 不单独收费,但脚本创建的资源、软件和流量收费;root 脚本可能破坏系统
- 不能继续时:镜像没有 cloud-init、格式或首行错误、网络未就绪、仅首次运行、旧实例状态残留
- 完成证据:cloud-init 完成,输出日志无错误,目标服务自启并通过健康检查
- 退出办法:保留旧启动模板和镜像;在克隆机验证后再替换,失败切回旧版本

