AWS EC2 实例管理 — 云端虚拟机,按小时/秒计费的弹性计算资源¶
一句话说明¶
AWS EC2(Elastic Compute Cloud)是亚马逊的云虚拟机服务,可以几分钟内创建一台运行 Linux/Windows 的服务器,随时启停,按实际使用时间付费,适合运行生信流程、机器学习训练等高计算任务。
安装与配置¶
# 通过 AWS CLI 管理 EC2(需先安装 AWS CLI 并配置凭证)
aws configure # 配置 Access Key 和区域
# 或者直接用 AWS Console(网页控制台)
# https://console.aws.amazon.com/ec2/
# 安装 AWS Systems Manager Session Manager(免 SSH 密钥连接)
# 在实例上安装 SSM Agent(Amazon Linux 2023 默认已装)
# 本地安装 Session Manager Plugin
# https://docs.aws.amazon.com/systems-manager/session-manager/
核心用法¶
# ── 创建实例(CLI 方式)──
aws ec2 run-instances \
--image-id ami-0d52744d6551d851e \ # Amazon Linux 2023 AMI ID(东京区域)
--instance-type t3.medium \ # 实例类型:2 vCPU, 4GB RAM
--key-name my-keypair \ # SSH 密钥对名称
--security-group-ids sg-xxxxxxxxxx \ # 安全组(防火墙规则)
--subnet-id subnet-xxxxxxxxxx \ # 子网
--tag-specifications \
'ResourceType=instance,Tags=[{Key=Name,Value=bioinfo-worker}]' \ # 实例名称
--block-device-mappings \
'[{"DeviceName":"/dev/xvda","Ebs":{"VolumeSize":100,"VolumeType":"gp3"}}]' \ # 100GB SSD
--count 1 # 启动1个实例
# ── 查看实例 ──
aws ec2 describe-instances \
--filters "Name=tag:Name,Values=bioinfo-worker" \ # 按名称过滤
--query 'Reservations[*].Instances[*].[InstanceId,State.Name,PublicIpAddress]' \
--output table
# ── 启动/停止/终止 ──
aws ec2 start-instances --instance-ids i-xxxxxxxxxx # 启动(恢复)
aws ec2 stop-instances --instance-ids i-xxxxxxxxxx # 停止(停计费,数据保留)
aws ec2 terminate-instances --instance-ids i-xxxxxxxxxx # 终止(永久删除!)
# ── SSH 连接 ──
ssh -i ~/.ssh/my-keypair.pem ec2-user@<公网IP> # Amazon Linux 用 ec2-user
ssh -i ~/.ssh/my-keypair.pem ubuntu@<公网IP> # Ubuntu 用 ubuntu
实战案例¶
# ── 用 spot 实例跑生信流程(比按需便宜60-90%)──
aws ec2 run-instances \
--image-id ami-0d52744d6551d851e \
--instance-type r6i.4xlarge \ # 内存优化:16 vCPU, 128GB RAM(生信常用)
--instance-market-options '{"MarketType":"spot","SpotOptions":{"SpotInstanceType":"one-time"}}' \
--key-name my-keypair \
--iam-instance-profile Name=EC2-S3-Access-Role \ # 允许访问 S3 的 IAM 角色
--user-data file://startup.sh # 启动时自动运行的脚本
# startup.sh — 实例启动后自动运行的脚本
cat > startup.sh << 'SCRIPT'
#!/bin/bash
# 设置 conda 环境
source /home/ec2-user/miniconda3/etc/profile.d/conda.sh
conda activate bioinfo # 激活生信环境
# 从 S3 下载输入数据
aws s3 sync s3://my-raw-bucket/sample/ /data/input/
# 运行 FASTQC 质控
fastqc /data/input/*.fastq -o /data/results/ -t 16
# 上传结果
aws s3 sync /data/results/ s3://my-results-bucket/qc-results/
# 完成后关机(节省费用)
sudo shutdown -h now
SCRIPT
# ── 创建快照备份(类似虚拟机快照)──
# 先获取实例的根磁盘 ID
VOLUME_ID=$(aws ec2 describe-instances \
--instance-ids i-xxxxxxxxxx \
--query 'Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId' \
--output text)
aws ec2 create-snapshot \
--volume-id $VOLUME_ID \
--description "bioinfo-worker-backup-$(date +%Y%m%d)" # 带日期的快照描述
# ── 批量运行实例(并行处理多个样本)──
SAMPLES=("S001" "S002" "S003" "S004")
for SAMPLE in "${SAMPLES[@]}"; do
aws ec2 run-instances \
--image-id ami-0d52744d6551d851e \
--instance-type r6i.2xlarge \ # 8 vCPU, 64GB
--instance-market-options '{"MarketType":"spot"}' \
--user-data "$(echo "#!/bin/bash
conda activate bioinfo
aws s3 cp s3://raw-bucket/${SAMPLE}.fastq /tmp/
# ... 运行分析
aws s3 sync /results/ s3://results-bucket/${SAMPLE}/
sudo shutdown -h now" | base64)" \ # user-data 需要 base64 编码
--tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=worker-${SAMPLE}}]"
echo "启动实例处理样本 ${SAMPLE}"
done
常见报错与解决¶
| 报错 | 原因 | 解决方法 |
|---|---|---|
InsufficientInstanceCapacity | 该区域该类型实例不够 | 换 AZ(可用区)或实例类型 |
SSH Connection refused | 安全组未开放22端口 | 检查安全组入站规则 |
RequestLimitExceeded | API 调用太频繁 | 加 --cli-connect-timeout 60 并重试 |
| Spot 实例被回收 | AWS 需要容量 | 使用持久 Spot 请求,或改为按需实例 |
| 实例内存不足 OOM | 实例内存小 | 升级实例类型(r 系列内存优化型) |
速查表¶
# 常用实例类型(生信场景)
t3.medium # 2 vCPU 4GB $0.048/h 适合开发测试
m6i.4xlarge # 16vCPU 64GB $0.768/h 通用计算
r6i.4xlarge # 16vCPU 128GB $0.960/h 内存密集(组装)
c6i.8xlarge # 32vCPU 64GB $1.360/h CPU 密集(比对)
p3.2xlarge # 8 vCPU 61GB $3.060/h + 1 Tesla V100 GPU(深度学习)
# 常用 CLI 命令
aws ec2 describe-instances # 列出实例
aws ec2 run-instances # 创建实例
aws ec2 start-instances # 启动
aws ec2 stop-instances # 停止
aws ec2 terminate-instances # 终止(删除)
aws ec2 describe-spot-price-history # 查看 Spot 价格历史
# 区域与 AMI
aws ec2 describe-images --owners amazon --filters "Name=name,Values=al2023-ami-*" # 查找最新 AMI
# 官方文档:https://docs.aws.amazon.com/ec2/
# 实例选型:https://instances.vantage.sh/(第三方比价)