EC2实例默认VPC可执行用户数据脚本,自定义VPC执行失败
排查自定义VPC中EC2用户数据脚本不执行的问题
作为经常处理EC2用户数据问题的人,我来帮你一步步排查。你遇到的情况很典型——默认VPC正常,自定义VPC里脚本完全没生效,甚至本地目录都没创建,我们从最核心的地方开始查:
1. 先确认用户数据是否真的执行了
不管脚本内容是什么,EC2的用户数据执行日志都会记录过程,这是排查的第一步:
- 登录到自定义VPC的EC2实例,查看这两个关键日志文件:
日志里会显示脚本是否被加载、每一步命令的执行结果,如果有错误(比如yum超时、命令不存在)都会在这里体现。cat /var/log/cloud-init.log cat /var/log/cloud-init-output.log
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
相关产品推荐
相关产品推荐

