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

EC2实例默认VPC可执行用户数据脚本,自定义VPC执行失败

排查自定义VPC中EC2用户数据脚本不执行的问题

作为经常处理EC2用户数据问题的人,我来帮你一步步排查。你遇到的情况很典型——默认VPC正常,自定义VPC里脚本完全没生效,甚至本地目录都没创建,我们从最核心的地方开始查:

1. 先确认用户数据是否真的执行了

不管脚本内容是什么,EC2的用户数据执行日志都会记录过程,这是排查的第一步:

  • 登录到自定义VPC的EC2实例,查看这两个关键日志文件:
    cat /var/log/cloud-init.log
    cat /var/log/cloud-init-output.log
    
    日志里会显示脚本是否被加载、每一步命令的执行结果,如果有错误(比如yum超时、命令不存在)都会在这里体现。

2. 最可能的原因:自定义VPC子网无法访问外网,导致脚本卡住

默认VPC的子网默认是公有子网(自动分配公网IP,路由表指向互联网网关),所以实例能直接访问外网,yum安装httpd很快完成,脚本能执行到后续步骤。而自定义VPC的子网默认是私有子网,如果没有配置NAT网关/实例,实例无法访问外网:

  • 你的脚本1里第一行是yum -y install httpd,如果实例连不上外网,yum会一直重试连接yum源,导致脚本卡在这一步,后面的mkdir等命令根本没机会执行,自然看不到目录。
  • 验证方法:手动在实例里执行yum install httpd,看看是不是卡住或者报错“无法连接到源”。
  • 解决方法:
    • 如果需要实例访问外网,给子网配置NAT网关(推荐),或者修改子网设置为“自动分配公网IP”(适合测试);
    • 如果不需要外网,你可以把脚本改成用本地源,但Amazon Linux默认依赖外网源,所以还是建议配置NAT网关。

3. 检查用户数据的输入是否正确

有时候新手在创建自定义VPC实例时,可能不小心漏填用户数据,或者复制粘贴时出现格式错误:

  • 确认启动实例时,是否在“高级详情”里正确粘贴了脚本,并且脚本开头的#!/bin/bash没有被修改;
  • 注意:用户数据的脚本内容不能有特殊的换行符或者不可见字符,建议直接用纯文本复制粘贴。

4. 验证子网的基础网络配置(别忽略!)

你说觉得NACL、安全组这些无关,但其实有一个关键点:实例元数据服务的访问是否被允许。虽然元数据服务是内网地址(169.254.169.254),但如果NACL或者安全组禁止了对这个地址的访问,实例无法获取用户数据,脚本自然不会执行:

  • 检查子网的NACL:入站规则允许来自VPC内网段(比如10.0.0.0/8)的TCP 80端口(元数据服务用的是HTTP);
  • 检查安全组:允许出站的HTTP请求到169.254.169.254(其实默认安全组是允许所有出站的,除非你手动修改过)。

5. 测试最简脚本排除问题

用你的脚本2(不需要外网的脚本)在自定义VPC实例里测试:

  • 如果脚本2能成功创建/test/index.html,说明问题出在脚本1的外网依赖;
  • 如果脚本2也没生效,那大概率是用户数据没被实例获取到,回到步骤1查日志,或者检查元数据服务的访问权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:27:29