不用 SSH:用 hcloud + cloud-init 在华为云 ECS 上部署 2048

举报
yd_245296965 发表于 2026/10/22 14:19:52 2026/10/22
【摘要】 用 cloud-init 把 Nginx 安装与页面部署塞进 ECS 开机流程,一条 hcloud 命令完成部署;附 EIP 绑定、多版本 API 解析、子网 DNS 等四个常见坑。

上一篇写了怎么把作品发布到开发者作品展览馆,这篇接着记 ECS 部署这一段。活动要求把页面真正跑到公网 ECS 上,常规做法是买机器、SSH 登录、手动装 Nginx、传文件——一套下来十几步。其实用 cloud-init 可以让整台机器的初始化在开机时自动完成,人只需要下发一条创建命令。

一、整体思路

ECS 的 CreateServers 接口支持 user_data 参数,实例第一次启动时 cloud-init 会执行这段脚本。把「装 Nginx、写页面、起服务」全部塞进 user_data,机器起来就自带可用站点,完全不需要 SSH。前提是安全组要提前放通 80 端口。

二、关键命令

安全组规则用 VPC 的 v3 接口,注意端口字段是 multiport,不是 port_range_min/port_range_max:

hcloud VPC CreateSecurityGroupRule/v3 --cli-region=cn-north-4 --security_group_rule.security_group_id=<SG_ID> --security_group_rule.direction=ingress --security_group_rule.ethertype=IPv4 --security_group_rule.protocol=tcp --security_group_rule.multiport=80 --security_group_rule.remote_ip_prefix=0.0.0.0/0

创建 ECS 时,user_data 必须是 base64 编码,否则会报参数错误:

hcloud ECS CreateServers/v2 --cli-region=cn-north-4 --server.name=hc-activity --server.imageRef=<IMAGE_ID> --server.flavorRef=s6.medium.2 --server.vpcid=<VPC_ID> --server.nics.1.subnet_id=<SUBNET_ID> --server.security_groups.1.id=<SG_ID> --server.root_volume.volumetype=SAS --server.root_volume.size=40 --server.availability_zone=cn-north-4a --server.user_data=$(base64 -w0 cloudinit.sh)

三、cloud-init 脚本

脚本本身很简单,核心是把静态文件写到 Nginx 的站点目录:

#!/bin/bash
dnf install -y nginx
mkdir -p /usr/share/nginx/html/hc-activity
cat > /usr/share/nginx/html/hc-activity/index.html <<'EOF'
...页面内容...
EOF
systemctl enable --now nginx

四、四个容易踩的坑

1)EIP 不会自动绑定。创建实例时不会带公网 IP,需要先 CreatePublicip 申请 EIP,再用 VPC ListPorts --device_id=<server_id> 找到网卡 port_id,最后 UpdatePublicip 把 EIP 绑上去。漏了这步,机器是通的但没有公网入口。

2)hcloud 多版本 API 会输出提示行。像 ListVpcs 这类 API 会先打印一行「有多个版本,默认使用 v3」,直接往 JSON 解析器里塞会报 JSONDecodeError。用 tail -n +2 跳过首行,或者从第一个 { 开始截取。

3)子网 DNS 要补。新建子网如果不加 100.125.1.250、100.125.129.250 这两个华为云内网 DNS,实例上解析不了外网域名,dnf 装 Nginx 会卡住。复用默认子网可以避开。

4)cloud-init 需要时间。实例变 ACTIVE 只代表开机完成,Nginx 可能还在装。验证要轮询 curl,通常 1 到 2 分钟内返回 200,不要看到 502 就以为部署失败。

五、验证与清理

验证就一句:curl -sI http://<EIP>/hc-activity/index.html,返回 200 即成功。

验证完记得清理,按量计费是按小时走的:

hcloud ECS DeleteServers --cli-region=cn-north-4 --server_id=<SERVER_ID>,实例删除时 EIP 会一并释放;随后 hcloud VPC DeleteSecurityGroup/v3 --security_group_id=<SG_ID> 删安全组。

整套下来,从敲下创建命令到公网可访问大约两分钟,人工操作只有「确认规格」一次。对一次性演示、活动闯关这类场景,比手动登录配服务器省事太多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。