跳转至

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端口检查安全组入站规则
RequestLimitExceededAPI 调用太频繁--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/(第三方比价)