AWS EC2 User Data 怎么用?cloud-init 与执行日志排查

让初始化脚本幂等可追踪,并从 cloud-init 日志定位失败

讲解 AWS EC2 User Data、shell 与 cloud-init 格式、执行频率、日志、幂等设计、角色凭证和镜像清理。

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

AWS EC2 User Data 与 cloud-init 执行排查图
User Data 需要幂等、可记录,并以最终服务状态作为验收结果。

适合放入 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 角色。

为什么控制台已经保存却没有效果

  1. 先运行 cloud-init status --long,确认是未运行、运行中还是错误。
  2. 查看 /var/log/cloud-init-output.logjournalctl -u cloud-final,找到第一条失败命令。
  3. 检查首行解释器、Linux 换行、软件包管理器和命令是否等待人工输入。
  4. 确认私有子网能访问软件源、S3 或 Systems Manager;DNS 和 HTTPS 出站缺失会让下载阶段失败。
  5. 从自定义 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

完成这项任务后继续检查

官方资料

AWS 教程AWS CloudShell 显示账户验证中怎么办?已验证仍无法创建环境的排查2026-09-15AWS 教程AWS EBS 卷卡在 attaching 怎么排查?可用区、挂载限制与设备识别2026-09-01AWS 教程AWS CloudTrail 怎么查操作记录?Event history、Trail 与审计边界2026-08-28

加入开发者交流社区

与全球开发者、运维和工作室一起交流技术、分享经验、配置、账号与最新优惠信息

  • 云平台使用交流
  • 资源优惠信息
  • 最新教程与资讯
  • 开发者经验分享
联系 Telegram 客服
加入开发者交流社区