阿里云 ECS 实践
阿里云弹性计算服务(ECS)是国内使用最广泛的云服务器平台之一。本文介绍在阿里云 ECS 上使用 Enterprise Linux 发行版(Anolis OS、AlmaLinux、CentOS Stream)的完整实践,包括实例创建、安全组配置、Cloud-Init 定制、OSS 对象存储集成、阿里云 CLI 使用及自定义镜像制作。
选择 EL 发行版镜像
Section titled “选择 EL 发行版镜像”阿里云 ECS 在创建实例时提供多种 Enterprise Linux 镜像:
| 镜像 | 说明 | 推荐场景 |
|---|---|---|
| Anolis OS 8/23 | 阿里巴巴发起的 EL 兼容发行版,深度集成阿里云 | 阿里云深度用户、需要 Cloud Kernel 的场景 |
| AlmaLinux 8/9 | 社区驱动的 EL 兼容发行版 | 通用生产环境、多云部署 |
| CentOS Stream 9 | RHEL 的上游滚动发行版 | 开发测试、追踪最新特性 |
| CentOS 7(已 EOL) | 已于 2024 年 6 月停止维护 | 不推荐新部署 |
在控制台选择镜像
Section titled “在控制台选择镜像”- 登录阿里云 ECS 控制台,点击「创建实例」
- 在「镜像」步骤中选择「公共镜像」
- 操作系统下拉框中选择目标发行版和版本
- Anolis OS 位于「Alibaba Cloud Linux」分类下(Alibaba Cloud Linux 3 基于 Anolis OS 8,Alibaba Cloud Linux 4 基于 Anolis OS 23)
使用共享镜像或镜像市场
Section titled “使用共享镜像或镜像市场”如果公共镜像中没有你需要的版本,可以:
- 在「镜像市场」搜索第三方提供的 EL 镜像
- 使用「自定义镜像」功能从其他账号导入
- 自行制作镜像后上传(参见后文「自定义镜像」章节)
安全组是阿里云 ECS 的虚拟防火墙,控制实例的入站和出站流量。每个 ECS 实例必须关联至少一个安全组。
常见端口规则
Section titled “常见端口规则”方向 协议 端口范围 授权对象 说明入方向 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 允许所有出站安全组最佳实践
Section titled “安全组最佳实践”- 遵循最小权限原则,只开放必要端口
- SSH 端口(22)仅对办公 IP 或堡垒机开放,不要对
0.0.0.0/0开放 - 数据库端口(3306、5432、6379 等)仅对应用服务器的内网 IP 开放
- 使用安全组规则的「优先级」字段(1-100,数字越小优先级越高)精细控制
- 为不同用途的实例创建不同安全组(如 Web 安全组、数据库安全组)
使用 CLI 管理安全组
Section titled “使用 CLI 管理安全组”$ aliyun ecs CreateSecurityGroup \ --RegionId cn-hangzhou \ --SecurityGroupName web-sg \ --Description "Web 服务器安全组" \ --VpcId vpc-xxxxxx$ 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-xxxxxxCloud-Init 在阿里云上的使用
Section titled “Cloud-Init 在阿里云上的使用”阿里云 ECS 使用 Cloud-Init 完成实例首次启动时的自动化配置。你可以在创建实例时传入 user-data 脚本。
通过控制台传入 User-Data
Section titled “通过控制台传入 User-Data”在创建 ECS 实例的「系统配置」步骤中,展开「高级选项」,在「实例自定义数据」文本框中输入 cloud-config 内容。
典型 User-Data 示例
Section titled “典型 User-Data 示例”#cloud-config
# 系统更新package_update: truepackage_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
# 配置防火墙并启动 Nginxruncmd: - 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 - 生产服务器 未经授权禁止访问 ========================================通过 CLI 传入 User-Data
Section titled “通过 CLI 传入 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 则需要手动编码。
查看实例元数据
Section titled “查看实例元数据”阿里云 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 不同。
加固模式元数据
Section titled “加固模式元数据”阿里云支持「加固模式」元数据访问,通过 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)
Section titled “阿里云 CLI(aliyun)”阿里云 CLI 工具 aliyun 可以在命令行管理所有阿里云资源。
# 方式一:通过官方安装脚本$ 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$ aliyun configure按提示输入:
- Access Key ID
- Access Key Secret
- Default Region Id(如
cn-hangzhou) - Default Output Format(推荐
json)
配置文件保存在 ~/.aliyun/config.json。
使用 RAM 角色(推荐)
Section titled “使用 RAM 角色(推荐)”在 ECS 实例上,推荐使用 RAM 实例角色代替 AccessKey,避免将密钥存储在实例中:
$ aliyun configure --mode EcsRamRole --ram-role-name MyEcsRole$ aliyun ecs DescribeInstances --RegionId cn-hangzhou$ aliyun ecs StartInstance --InstanceId i-xxxxxx$ aliyun ecs StopInstance --InstanceId i-xxxxxx$ aliyun ecs RebootInstance --InstanceId i-xxxxxx$ aliyun ecs DescribeInstances --RegionId cn-hangzhou | \ jq '.Instances.Instance[] | {InstanceId, InstanceName, Status, PublicIpAddress}'OSS 对象存储集成
Section titled “OSS 对象存储集成”阿里云对象存储 OSS(Object Storage Service)可用于存储备份文件、静态资源、日志归档等。
安装 ossutil
Section titled “安装 ossutil”$ curl -fsSL https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash$ ossutil version配置 ossutil
Section titled “配置 ossutil”$ ossutil config按提示输入 Endpoint(如 oss-cn-hangzhou.aliyuncs.com)、AccessKey ID 和 AccessKey Secret。
$ 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/$ ossutil ls oss://my-backup-bucket/db-backups/$ ossutil sync /var/log/nginx/ oss://my-backup-bucket/nginx-logs/ --delete自动备份到 OSS
Section titled “自动备份到 OSS”sudo tee /usr/local/bin/backup-to-oss.sh << 'SCRIPT'#!/bin/bashDATE=$(date +%Y%m%d_%H%M%S)BACKUP_DIR="/tmp/backup"BUCKET="oss://my-backup-bucket"
mkdir -p "$BACKUP_DIR"
# 备份 PostgreSQLsudo -u postgres pg_dumpall | gzip > "${BACKUP_DIR}/postgres_${DATE}.sql.gz"
# 上传到 OSSossutil 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.shecho "0 2 * * * root /usr/local/bin/backup-to-oss.sh" | sudo tee /etc/cron.d/backup-to-oss建议在 OSS Bucket 上配置生命周期规则,自动将过期备份转为低频存储或归档存储,降低成本。
自定义镜像可以将已配置好的系统环境打包,用于快速创建新实例或跨地域部署。
从现有实例创建镜像
Section titled “从现有实例创建镜像”准备工作——在创建镜像前,清理敏感信息和临时文件:
# 清理 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$ aliyun ecs CreateImage \ --RegionId cn-hangzhou \ --InstanceId i-xxxxxx \ --ImageName "webapp-alma9-v1" \ --Description "AlmaLinux 9 + Nginx + PostgreSQL 基础镜像"从本地镜像文件导入
Section titled “从本地镜像文件导入”如果你有本地制作的 qcow2 或 raw 格式镜像,可以通过 OSS 导入:
$ ossutil cp alma9-custom.qcow2 oss://my-image-bucket/images/然后在 ECS 控制台的「镜像」页面选择「导入镜像」,指定 OSS 文件路径、操作系统类型和架构。
跨地域复制镜像
Section titled “跨地域复制镜像”$ aliyun ecs CopyImage \ --RegionId cn-hangzhou \ --ImageId m-xxxxxx \ --DestinationRegionId cn-shanghai \ --DestinationImageName "webapp-alma9-v1-shanghai"典型部署模式
Section titled “典型部署模式”单机 Web 应用部署
Section titled “单机 Web 应用部署”适合小型项目或个人站点:
用户 → SLB(可选) → ECS 实例 ├── Nginx(反向代理) ├── 应用进程 └── 数据库(PostgreSQL/MySQL)关键配置要点:
- 选择合适的实例规格(推荐 ecs.g7 或 ecs.c7 系列)
- 系统盘使用 ESSD 云盘,数据盘独立挂载
- 开启自动快照策略,每日备份
- 安全组仅开放 80/443 和受限的 SSH 端口
Web 应用集群部署
Section titled “Web 应用集群部署”适合中大型生产环境:
用户 → SLB(负载均衡) ├── ECS-1(应用节点) ├── ECS-2(应用节点) └── ECS-3(应用节点) │ 内网连接 │ ├── RDS(数据库) ├── Redis(缓存) └── OSS(静态资源)关键配置要点:
- 应用节点使用自定义镜像统一部署,确保环境一致
- 使用 SLB 进行负载均衡和健康检查
- 数据库使用阿里云 RDS(托管服务),不在 ECS 上自建
- 静态资源存储在 OSS,通过 CDN 加速
- 使用专有网络(VPC)隔离内网环境
使用启动模板简化部署
Section titled “使用启动模板简化部署”启动模板可以保存实例创建参数,避免重复配置:
$ 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、内存、磁盘、网络设置告警阈值
- 自动快照:对系统盘和数据盘启用自动快照策略
- 安全加固:定期更新系统补丁,使用安骑士(云安全中心)进行漏洞扫描
- 成本优化:开发测试环境使用抢占式实例,长期稳定负载使用包年包月或节省计划
- Anolis OS 使用指南 — 阿里巴巴发起的 EL 兼容发行版详解
- Cloud-Init 配置 — Cloud-Init 详细配置指南
- 对象存储实践 — 对象存储通用教程
- Terraform 自动化 — 使用 Terraform 管理阿里云资源