修复Bash脚本提取EC2元数据并嵌入HTML页面的问题求助
解决EC2引导脚本显示实例ID和可用区到网页的问题
修正后的完整可运行脚本
#!/bin/bash # 更新系统并安装Apache服务 sudo yum update -y sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd # 从S3复制HTML模板到本地 sudo aws s3 cp s3://mybucket/index1.html /home/ec2-user/index_template.html # 获取EC2元数据访问token(适配IMDSv2,Amazon Linux 2+要求) TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s) # 获取实例ID和可用区信息 INSTANCE_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id -s) INSTANCE_AZ=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/placement/availability-zone -s) # 替换模板中的占位符,生成最终网页文件到Apache根目录 sed -e "s/_instanceID_/$INSTANCE_ID/g" -e "s/_AZ_/$INSTANCE_AZ/g" /home/ec2-user/index_template.html > /var/www/html/index.html # 修复网页文件权限,确保Apache能读取 sudo chown apache:apache /var/www/html/index.html
原脚本的核心错误分析与修正点
变量赋值错误
- 原脚本中
INSTANCE-ID=curl http://...写法完全错误:bash变量名不能包含减号(需改用下划线INSTANCE_ID),且获取命令输出必须用命令替换语法变量名=$(命令)(现代bash推荐写法),否则会把curl当成变量值的一部分,而非执行命令。
- 原脚本中
元数据访问规则不兼容
- 新版EC2实例默认启用IMDSv2,必须先获取token才能访问元数据。原脚本的token请求有语法错误,且未加
-s参数会输出curl调试信息,污染变量值。修正后用静默模式获取token,再携带token请求元数据。
- 新版EC2实例默认启用IMDSv2,必须先获取token才能访问元数据。原脚本的token请求有语法错误,且未加
Sed命令的三重问题
- 单引号包裹的内容中,bash不会解析变量(
$INSTANCE-ID会被当作纯字符串),必须改用双引号才能让变量生效; - 原sed仅输出到终端,不会修改文件,需用重定向
>将结果写入Apache可访问的目录(/var/www/html/是Apache默认根目录); - 两个sed命令可合并为一个,用
-e参数指定多规则替换,提升效率。
- 单引号包裹的内容中,bash不会解析变量(
文件路径与权限缺失
- 原脚本处理完HTML文件后未放到Apache根目录,导致网页无法访问;同时需设置文件权限为
apache用户可读取,避免403错误。
- 原脚本处理完HTML文件后未放到Apache根目录,导致网页无法访问;同时需设置文件权限为
内容的提问来源于stack exchange,提问作者AWS_noob
相关产品推荐
相关产品推荐

