跳转到内容

阿里云 ECS 实践

阿里云弹性计算服务(ECS)是国内使用最广泛的云服务器平台之一。本文介绍在阿里云 ECS 上使用 Enterprise Linux 发行版(Anolis OS、AlmaLinux、CentOS Stream)的完整实践,包括实例创建、安全组配置、Cloud-Init 定制、OSS 对象存储集成、阿里云 CLI 使用及自定义镜像制作。

阿里云 ECS 在创建实例时提供多种 Enterprise Linux 镜像:

镜像说明推荐场景
Anolis OS 8/23阿里巴巴发起的 EL 兼容发行版,深度集成阿里云阿里云深度用户、需要 Cloud Kernel 的场景
AlmaLinux 8/9社区驱动的 EL 兼容发行版通用生产环境、多云部署
CentOS Stream 9RHEL 的上游滚动发行版开发测试、追踪最新特性
CentOS 7(已 EOL)已于 2024 年 6 月停止维护不推荐新部署
  1. 登录阿里云 ECS 控制台,点击「创建实例」
  2. 在「镜像」步骤中选择「公共镜像」
  3. 操作系统下拉框中选择目标发行版和版本
  4. Anolis OS 位于「Alibaba Cloud Linux」分类下(Alibaba Cloud Linux 3 基于 Anolis OS 8,Alibaba Cloud Linux 4 基于 Anolis OS 23)

如果公共镜像中没有你需要的版本,可以:

  • 在「镜像市场」搜索第三方提供的 EL 镜像
  • 使用「自定义镜像」功能从其他账号导入
  • 自行制作镜像后上传(参见后文「自定义镜像」章节)

安全组是阿里云 ECS 的虚拟防火墙,控制实例的入站和出站流量。每个 ECS 实例必须关联至少一个安全组。

典型的 Web 服务器安全组规则
方向 协议 端口范围 授权对象 说明
入方向 TCP 22/22 你的办公 IP/32 SSH 登录
入方向 TCP 80/80 0.0.0.0/0 HTTP
入方向 TCP 443/443 0.0.0.0/0 HTTPS
入方向 ICMP -1/-1 0.0.0.0/0 Ping
出方向 全部 -1/-1 0.0.0.0/0 允许所有出站
  • 遵循最小权限原则,只开放必要端口
  • SSH 端口(22)仅对办公 IP 或堡垒机开放,不要对 0.0.0.0/0 开放
  • 数据库端口(3306、5432、6379 等)仅对应用服务器的内网 IP 开放
  • 使用安全组规则的「优先级」字段(1-100,数字越小优先级越高)精细控制
  • 为不同用途的实例创建不同安全组(如 Web 安全组、数据库安全组)
创建安全组
$ aliyun ecs CreateSecurityGroup \
--RegionId cn-hangzhou \
--SecurityGroupName web-sg \
--Description "Web 服务器安全组" \
--VpcId vpc-xxxxxx
添加入方向规则(开放 80 端口)
$ aliyun ecs AuthorizeSecurityGroup \
--RegionId cn-hangzhou \
--SecurityGroupId sg-xxxxxx \
--IpProtocol tcp \
--PortRange 80/80 \
--SourceCidrIp 0.0.0.0/0 \
--Description "Allow HTTP"
查看安全组规则
$ aliyun ecs DescribeSecurityGroupAttribute \
--RegionId cn-hangzhou \
--SecurityGroupId sg-xxxxxx

阿里云 ECS 使用 Cloud-Init 完成实例首次启动时的自动化配置。你可以在创建实例时传入 user-data 脚本。

在创建 ECS 实例的「系统配置」步骤中,展开「高级选项」,在「实例自定义数据」文本框中输入 cloud-config 内容。

cloud-config:初始化 Web 服务器
#cloud-config
# 系统更新
package_update: true
package_upgrade: true
# 安装软件
packages:
- nginx
- firewalld
- vim-enhanced
# 创建运维用户
users:
- name: deploy
groups: wheel
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAA... your-key-comment
# 配置防火墙并启动 Nginx
runcmd:
- systemctl enable --now firewalld
- firewall-cmd --permanent --add-service=http
- firewall-cmd --permanent --add-service=https
- firewall-cmd --reload
- systemctl enable --now nginx
# 写入配置文件
write_files:
- path: /etc/motd
content: |
========================================
阿里云 ECS - 生产服务器
未经授权禁止访问
========================================
创建实例时指定 User-Data
$ aliyun ecs RunInstances \
--RegionId cn-hangzhou \
--ImageId aliyun_3_x64_20G_alibase_20260101.vhd \
--InstanceType ecs.g7.large \
--SecurityGroupId sg-xxxxxx \
--VSwitchId vsw-xxxxxx \
--UserData $(base64 -w 0 user-data.yaml)

User-Data 需要经过 Base64 编码后传入。控制台会自动处理编码,CLI 则需要手动编码。

阿里云 ECS 实例可以通过元数据服务获取自身信息:

查询实例元数据
# 获取实例 ID
$ curl http://100.100.100.200/latest/meta-data/instance-id
# 获取实例所在地域
$ curl http://100.100.100.200/latest/meta-data/region-id
# 获取实例私网 IP
$ curl http://100.100.100.200/latest/meta-data/private-ipv4
# 获取实例公网 IP
$ curl http://100.100.100.200/latest/meta-data/eipv4
# 获取实例规格
$ curl http://100.100.100.200/latest/meta-data/instance/instance-type
# 获取 User-Data
$ curl http://100.100.100.200/latest/user-data

阿里云元数据服务地址为 100.100.100.200,与 AWS 的 169.254.169.254 不同。

阿里云支持「加固模式」元数据访问,通过 Token 机制防止 SSRF 攻击:

使用加固模式访问元数据
# 获取 Token(有效期 6 小时)
$ TOKEN=$(curl -s -X PUT "http://100.100.100.200/latest/api/token" \
-H "X-Forwarded-For: Chinese" \
-H "X-Metadata-Token-TTL-Seconds: 21600")
# 使用 Token 获取元数据
$ curl -s -H "X-Metadata-Token: $TOKEN" \
http://100.100.100.200/latest/meta-data/instance-id

阿里云 CLI 工具 aliyun 可以在命令行管理所有阿里云资源。

在 EL 系统上安装阿里云 CLI
# 方式一:通过官方安装脚本
$ curl -fsSL https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz | sudo tar xz -C /usr/local/bin/
# 方式二:通过 Homebrew(如果已安装)
$ brew install aliyun-cli
验证安装
$ aliyun version
交互式配置 AccessKey
$ aliyun configure

按提示输入:

  • Access Key ID
  • Access Key Secret
  • Default Region Id(如 cn-hangzhou
  • Default Output Format(推荐 json

配置文件保存在 ~/.aliyun/config.json

在 ECS 实例上,推荐使用 RAM 实例角色代替 AccessKey,避免将密钥存储在实例中:

使用 ECS 实例 RAM 角色
$ aliyun configure --mode EcsRamRole --ram-role-name MyEcsRole
查询 ECS 实例列表
$ aliyun ecs DescribeInstances --RegionId cn-hangzhou
启动/停止/重启实例
$ aliyun ecs StartInstance --InstanceId i-xxxxxx
$ aliyun ecs StopInstance --InstanceId i-xxxxxx
$ aliyun ecs RebootInstance --InstanceId i-xxxxxx
查询实例详情并用 jq 提取关键信息
$ aliyun ecs DescribeInstances --RegionId cn-hangzhou | \
jq '.Instances.Instance[] | {InstanceId, InstanceName, Status, PublicIpAddress}'

阿里云对象存储 OSS(Object Storage Service)可用于存储备份文件、静态资源、日志归档等。

安装 ossutil 命令行工具
$ curl -fsSL https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash
验证安装
$ ossutil version
配置 ossutil 凭证
$ ossutil config

按提示输入 Endpoint(如 oss-cn-hangzhou.aliyuncs.com)、AccessKey ID 和 AccessKey Secret。

创建 Bucket
$ ossutil mb oss://my-backup-bucket --region cn-hangzhou
上传文件
# 上传单个文件
$ ossutil cp /backup/database.sql.gz oss://my-backup-bucket/db-backups/
# 递归上传目录
$ ossutil cp -r /var/www/static/ oss://my-backup-bucket/static/
下载文件
$ ossutil cp oss://my-backup-bucket/db-backups/database.sql.gz /tmp/
列出 Bucket 中的文件
$ ossutil ls oss://my-backup-bucket/db-backups/
同步目录到 OSS(类似 rsync)
$ ossutil sync /var/log/nginx/ oss://my-backup-bucket/nginx-logs/ --delete
创建数据库备份脚本
sudo tee /usr/local/bin/backup-to-oss.sh << 'SCRIPT'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/tmp/backup"
BUCKET="oss://my-backup-bucket"
mkdir -p "$BACKUP_DIR"
# 备份 PostgreSQL
sudo -u postgres pg_dumpall | gzip > "${BACKUP_DIR}/postgres_${DATE}.sql.gz"
# 上传到 OSS
ossutil cp "${BACKUP_DIR}/postgres_${DATE}.sql.gz" "${BUCKET}/db-backups/"
# 清理本地临时文件
rm -f "${BACKUP_DIR}/postgres_${DATE}.sql.gz"
# 清理 OSS 上 30 天前的备份(通过生命周期规则管理更佳)
echo "Backup completed: postgres_${DATE}.sql.gz"
SCRIPT
sudo chmod +x /usr/local/bin/backup-to-oss.sh
添加定时任务
echo "0 2 * * * root /usr/local/bin/backup-to-oss.sh" | sudo tee /etc/cron.d/backup-to-oss

建议在 OSS Bucket 上配置生命周期规则,自动将过期备份转为低频存储或归档存储,降低成本。

自定义镜像可以将已配置好的系统环境打包,用于快速创建新实例或跨地域部署。

准备工作——在创建镜像前,清理敏感信息和临时文件:

镜像创建前的清理工作
# 清理 SSH 主机密钥(Cloud-Init 会在新实例上重新生成)
$ sudo rm -f /etc/ssh/ssh_host_*
# 清理 cloud-init 缓存
$ sudo cloud-init clean --logs
# 清理 DNF 缓存
$ sudo dnf clean all
# 清理日志
$ sudo journalctl --vacuum-time=1d
$ sudo rm -f /var/log/*.gz /var/log/*-????????
# 清理 bash 历史
$ history -c && history -w
通过 CLI 创建自定义镜像
$ aliyun ecs CreateImage \
--RegionId cn-hangzhou \
--InstanceId i-xxxxxx \
--ImageName "webapp-alma9-v1" \
--Description "AlmaLinux 9 + Nginx + PostgreSQL 基础镜像"

如果你有本地制作的 qcow2 或 raw 格式镜像,可以通过 OSS 导入:

上传镜像文件到 OSS
$ ossutil cp alma9-custom.qcow2 oss://my-image-bucket/images/

然后在 ECS 控制台的「镜像」页面选择「导入镜像」,指定 OSS 文件路径、操作系统类型和架构。

将镜像复制到其他地域
$ aliyun ecs CopyImage \
--RegionId cn-hangzhou \
--ImageId m-xxxxxx \
--DestinationRegionId cn-shanghai \
--DestinationImageName "webapp-alma9-v1-shanghai"

适合小型项目或个人站点:

单机部署架构
用户 → SLB(可选) → ECS 实例
├── Nginx(反向代理)
├── 应用进程
└── 数据库(PostgreSQL/MySQL)

关键配置要点:

  • 选择合适的实例规格(推荐 ecs.g7 或 ecs.c7 系列)
  • 系统盘使用 ESSD 云盘,数据盘独立挂载
  • 开启自动快照策略,每日备份
  • 安全组仅开放 80/443 和受限的 SSH 端口

适合中大型生产环境:

集群部署架构
用户 → SLB(负载均衡)
├── ECS-1(应用节点)
├── ECS-2(应用节点)
└── ECS-3(应用节点)
内网连接
├── RDS(数据库)
├── Redis(缓存)
└── OSS(静态资源)

关键配置要点:

  • 应用节点使用自定义镜像统一部署,确保环境一致
  • 使用 SLB 进行负载均衡和健康检查
  • 数据库使用阿里云 RDS(托管服务),不在 ECS 上自建
  • 静态资源存储在 OSS,通过 CDN 加速
  • 使用专有网络(VPC)隔离内网环境

启动模板可以保存实例创建参数,避免重复配置:

创建启动模板
$ aliyun ecs CreateLaunchTemplate \
--RegionId cn-hangzhou \
--LaunchTemplateName web-template \
--ImageId m-xxxxxx \
--InstanceType ecs.g7.large \
--SecurityGroupId sg-xxxxxx \
--VSwitchId vsw-xxxxxx \
--SystemDiskCategory cloud_essd \
--SystemDiskSize 40 \
--UserData $(base64 -w 0 user-data.yaml)
使用启动模板创建实例
$ aliyun ecs RunInstances \
--RegionId cn-hangzhou \
--LaunchTemplateId lt-xxxxxx \
--Amount 3
  • 密钥管理:使用 RAM 角色而非 AccessKey 访问阿里云 API,避免密钥泄露
  • 监控告警:配置云监控(CloudMonitor)对 CPU、内存、磁盘、网络设置告警阈值
  • 自动快照:对系统盘和数据盘启用自动快照策略
  • 安全加固:定期更新系统补丁,使用安骑士(云安全中心)进行漏洞扫描
  • 成本优化:开发测试环境使用抢占式实例,长期稳定负载使用包年包月或节省计划