讲解 AWS EC2 User Data、shell 与 cloud-init 格式、执行频率、日志、幂等设计、角色凭证和镜像清理。
准确入口:创建实例时进入“EC2 → 启动实例 → 高级详细信息 → 用户数据”;已有实例要先停止,再从“操作 → 实例设置 → 编辑用户数据”处理。User Data 本身不单独收费,也不会自动删除磁盘,但脚本以 root 身份运行,可能安装软件、改防火墙或创建收费资源。普通 Linux 新机默认按首次启动执行,修改后重启不等于会再次运行。

适合放入 User Data 的任务
- 安装基础代理与系统依赖;
- 写入不含秘密的环境配置;
- 从受控位置拉取带版本的部署脚本;
- 启动并启用 systemd 服务;
- 写入完成标记和执行日志。
一个可追踪的示例
#!/bin/bash
set -euo pipefail
exec > >(tee -a /var/log/bootstrap.log) 2>&1
test -f /var/lib/app-bootstrap.done && exit 0
dnf install -y nginx
systemctl enable --now nginx
curl -fsS http://127.0.0.1/ >/dev/null
touch /var/lib/app-bootstrap.done
示例以 Amazon Linux 为前提;Ubuntu 等系统的软件包命令不同。完成标记用于避免重复执行,业务仍应按实际需要设计更可靠的版本与回滚机制。
脚本没有执行怎么查
cloud-init status --long
sudo tail -n 200 /var/log/cloud-init-output.log
sudo journalctl -u cloud-final --no-pager
sudo find /var/lib/cloud/instances -maxdepth 2 -type f
依次核对首行解释器、换行格式、网络与 DNS、软件源、root 环境、命令是否等待交互,以及 AMI 是否安装和启用了对应初始化代理。
安全与镜像边界
User Data 可通过实例元数据访问,不应保存长期 Access Key、数据库密码或私钥。脚本调用 AWS API 时,应使用实例配置文件提供的 IAM 临时凭证。从实例制作 AMI 前,还要清理 /var/lib/cloud/instances/ 中残留的脚本和状态。
执行频率
Linux User Data 默认多为首次启动执行。修改控制台内容并重启,不代表脚本必然再次运行;需要重复执行时,应明确配置 cloud-init 模块频率或交给 systemd、配置管理工具处理。
提交前把脚本做成可重复执行
同一脚本在测试机连续运行两次,第二次不应重复追加配置、创建相同用户或重置现有文件。软件安装前判断是否已经存在,配置文件先写到临时路径并校验,再原子替换。不要在脚本中放 Access Key、数据库密码或私钥;访问 AWS API 时给实例绑定 IAM 角色。
为什么控制台已经保存却没有效果
- 先运行
cloud-init status --long,确认是未运行、运行中还是错误。 - 查看
/var/log/cloud-init-output.log和journalctl -u cloud-final,找到第一条失败命令。 - 检查首行解释器、Linux 换行、软件包管理器和命令是否等待人工输入。
- 确认私有子网能访问软件源、S3 或 Systems Manager;DNS 和 HTTPS 出站缺失会让下载阶段失败。
- 从自定义 AMI 启动时,核对镜像中是否残留旧实例的 cloud-init 状态。
需要再次执行时怎样避免破坏机器
不要直接删除 /var/lib/cloud 后在生产机试错。优先把初始化逻辑放入新启动模板版本,用同一 AMI 启动测试实例。确需重复任务时,把它改成有完成标记和版本号的 systemd oneshot 服务,或明确配置 cloud-init 模块频率。每次执行都写入独立日志,并在成功后才写完成标记。
验收与回退
验收不以“脚本退出 0”结束,还要检查服务是否自启、监听端口、配置版本、磁盘占用和应用健康页。启动模板保持旧版本,Auto Scaling 先替换一台实例观察;新实例失败就把默认模板切回旧版本并终止故障测试机。已经修改的现有实例应从快照或配置备份恢复,而不是反复重跑未知状态的脚本。
AWS EC2 User Data 怎么用现场验收单
- 入口或命令:EC2 → 实例 → 启动实例 → 高级详细信息 → 用户数据;已有实例先停止再编辑实例用户数据
- 提交前风险:User Data 不单独收费,但安装的软件、下载流量和创建的云资源可能收费;脚本以 root 运行,错误命令会改系统
- 不能继续时:脚本格式错、镜像无 cloud-init、网络未就绪、只在首次启动执行、旧状态未清理
- 完成证据:cloud-init 状态为 done,独立日志无错误,目标服务启用并通过本机健康检查
- 退出办法:保留启动模板旧版本;重跑前先在克隆实例验证,失败切回旧模板或旧 AMI

