不用 SSH:用 hcloud + cloud-init 在华为云 ECS 上部署 2048
上一篇写了怎么把作品发布到开发者作品展览馆,这篇接着记 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> 删安全组。
整套下来,从敲下创建命令到公网可访问大约两分钟,人工操作只有「确认规格」一次。对一次性演示、活动闯关这类场景,比手动登录配服务器省事太多。
- 点赞
- 收藏
- 关注作者
评论(0)