You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS EC2 Ubuntu实例启动时UserData脚本执行失败求助

AWS EC2 Ubuntu实例UserData脚本执行失败问题排查与解决

核心问题分析

  1. UserData默认仅首次启动执行:AWS EC2的cloud-init服务默认只在实例**首次启动(创建时)**运行UserData脚本。如果是停止实例后修改UserData再启动,cloud-init会认为实例已完成初始化,不会重新执行脚本——这就是你修改为简单脚本后仍无输出的根本原因。
  2. 原脚本存在语法错误:最初的脚本中,echo用单引号包裹内容,但内部的s/oldurl/newurl/g包含单引号,会提前闭合外层单引号,导致脚本解析失败,无法生成正确的init-ssl.sh文件。
  3. 不必要的sudo使用:UserData脚本默认以root权限执行,无需添加sudo前缀,多余的sudo可能引发权限逻辑问题。

解决方案

一、让实例重新执行UserData(针对停止后重启的实例)

如果不想创建新实例,可通过以下方式让cloud-init重新初始化:

  • 登录实例后,删除cloud-init的状态记录目录:
    rm -rf /var/lib/cloud/instance
    
    重启实例后,cloud-init会重新运行最新的UserData脚本。
  • 或者修改cloud-init配置,设置每次启动都执行UserData:
    编辑/etc/cloud/cloud.cfg文件,调整cloud_init_modules段配置,并添加持久化执行规则:
    cloud_init_modules:
      - bootcmd
      - write-files
      - growpart
      - resizefs
      - set_hostname
      - update_hostname
      - update_etc_hosts
      - ca-certs
      - rsyslog
      - users-groups
      - ssh
    
    preserve_hostname: false
    runcmd:
      - [cloud-init-per, once, myscript, /path/to/your/script.sh]
    

二、修复原脚本的语法错误

修复单引号嵌套问题,移除不必要的sudo,并添加非交互参数避免脚本卡壳,修改后的脚本如下:

#!/bin/bash    
# 用双引号包裹echo内容,避免内部单引号冲突
echo "
#!/bin/bash
sleep 30
apt-get update -y  # 添加-y自动确认更新
cd /etc/apache2/sites-available
sed -i 's/oldurl/newurl/g' 000-default.conf
sed -i 's/oldurl/newurl/g' 000-default.conf
# certbot添加非交互参数,避免手动确认
certbot --apache -d url1 -d url2 --non-interactive --agree-tos
systemctl restart apache2" > /root/init-ssl.sh  # 指定绝对路径,避免目录问题
chmod +x /root/init-ssl.sh
/root/init-ssl.sh

三、排查脚本执行日志

如果仍有问题,查看cloud-init日志定位错误:

  • 查看脚本输出日志:
    cat /var/log/cloud-init-output.log
    
  • 查看cloud-init详细运行日志:
    cat /var/log/cloud-init.log
    
    日志会明确显示脚本是否执行、执行时的错误信息(如权限问题、命令不存在等)。

内容的提问来源于stack exchange,提问作者mr_robot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:45:30