跳至内容
aws
aws-ec2集合

aws-ec2集合

EC2

实际很少 cli 操作, 都是用 Terraform 去管理, cli 主要是查一下信息;

AMI

aws 镜像管理

# 显示所有 AMI
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn*" --query 'sort_by(Images, &CreationDate)[].Name' | sort

# 查询指定 AMI 的详细信息
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-kernel-5.10-hvm-2.0.20230808.0-x86_64-gp2"

# 过滤系统名 - al2023
aws ec2 describe-images --owners amazon --filters "Name=name,Values=al2023*" --query 'sort_by(Images, &CreationDate)[].Name' | sort


# 通过 System Manager 获取最新 AMI 的 Path - 编写 CloudFormation 时可以通过查询路径始终获取到当前支持的最新版本
aws ssm get-parameters-by-path --path "/aws/service/ami-amazon-linux-latest" --query 'Parameters[*].Name' | sort

instances 实例

常见规则和费用

m5n.xlarge
m5a.2xlarge
m5.4xlarge                  743.87/月
m5n.2xlarge     0.62
m5a.2xlarge     0.459
c5.2xlarge      0.834
c5.4xlarge      16c32g      608.82/月
c5a.16xlarge    64c128      2500$/月
db.m5.4xlarge   16c32g      800$/月
t2.nano
t2.micro
G6.2xlarge (8vCPU/32GB), 具有一个 Nvidia L4 GPU 和 24GB 显存

常用命令

# 将 ssh 公钥发送到指定到实例上
aws ec2-instance-connect send-ssh-public-key \
    --instance-id i-1234567890abcdef0 \
    --instance-os-user ec2-user \
    --availability-zone us-east-2b \
    --ssh-public-key file://path/my-rsa-key.pub


aws ec2 start-instances --instance-ids i-1234567890abcdef0  # 启动实例
aws ec2 stop-instances --instance-ids i-1234567890abcdef0   # 停止实例
aws ec2 reboot-instances --instance-ids i-1234567890abcdef5
aws ec2 terminate-instances --instance-ids i-1234567890abcdef0  # 终止实例
aws ec2 monitor-instances --instance-ids i-1234567890abcdef0    # 启用详细监控

# 禁用对指定实例的详细监控
aws ec2 unmonitor-instances --instance-ids i-1234567890abcdef0

# 新增一个实例
aws ec2 run-instances --image-id ami-0abcdef1234567890 --instance-type m5a.2xlarge \
    --key-name MyKeyPair \
    --subnet-id subnet-08fc749671b2d077c \
    --security-group-ids sg-0b0384b66d7d692f9 \
    --associate-public-ip-address \
    --count 1 \
    --key-name MyKeyPair \
    # 可选添加标签
    --tag-specifications 'ResourceType=instance,Tags=[{Key=webserver,Value=production}]' 'ResourceType=volume,Tags=[{Key=cost-center,Value=cc123}]' \

    # 传递一个启动时执行的初始化脚本
    --user-data file://my_script.txt

    # 细化磁盘配置
    --block-device-mappings '{"DeviceName":"/dev/sda","Ebs":{"Encrypted":false,"DeleteOnTermination":true,"Iops":3000,"SnapshotId":"snap-0bb9a8661e2745aad","VolumeSize":500,"VolumeType":"gp3","Throughput":125}}' \
    --network-interfaces '{"SubnetId":"subnet-0979ce58b278d0279","AssociatePublicIpAddress":true,"DeviceIndex":0,"Groups":["sg-preview-1"]}' \
    --metadata-options '{"HttpEndpoint":"enabled","HttpPutResponseHopLimit":2,"HttpTokens":"required"}' \
    --private-dns-name-options '{"HostnameType":"ip-name","EnableResourceNameDnsARecord":false,"EnableResourceNameDnsAAAARecord":false}' \

磁盘

# 创建空的通用固态硬盘 (gp3) 卷
aws --region xxx ec2 create-volume \
    --volume-type gp3 --size 80 --availability-zone xxxx2

磁盘扩容-卷

扩容开始会自动进行优化平衡, 不需要等待完成即可扩容系统内部


VOLUMEID=$(aws ec2 describe-instances \
  --instance-id $INSTANCEID \
  --query "Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId" \
  --output text \
  --region $REGION)

# 大小单位是 GB
aws ec2 modify-volume --volume-id $VOLUMEID --size 100

磁盘扩容-系统内

# 磁盘扩容后, 主机内扩容空间
lsblk
growpart /dev/nvme0n1 1
resize2fs /dev/nvme0n1p1

快照


# 创建快照
aws ec2 create-snapshot --volume-id vol-1234567890abcdef0 \
    --description "This is my root volume snapshot"

# 创建多卷快照(连接到此实例的所有卷)
aws ec2 create-snapshots \
    --instance-specification InstanceId=i-1234567890abcdef0 \
    --description "This is snapshot of a volume from my-instance"

ELB

elb = nlb+alb

ip地址透传

  • ALB 不支持客户端的真实 IP 地址透传
  • NLB 以发布 4 层的 TCP, UDP 端口为主; 在 Instance 模式下支持真实 IP 地址透传, IP 模式下不支持透传

目标组(Target Group)的类型

Instance 模式: 可以将流量导入到本 Region 内的 EC2

IP 模式: 将流量导入到本 VPC 内的 IP, 也可以导入到本 VPC 以外的 IP, 例如通过 Direct Connect 专线或者 VPN 连接 只要网络能通就能转发

NLB

Instance 模式, 可以直接获取到真实 ip 地址 ip 模式, 默认获取到的是内网 ip 地址, 如果开启 proxyV2 才能获取到真实 ip, 需要后端 app 也开启支持

alb

Instance 模式 和 IP 模式 获取的都是内网 ip, 实际还是需要 xff

nacl

每个子网必须关联一个 NACL, 默认 NACL 允许所有流量进和出

NACL 和 Security Group 的主要区别:

  • SG 是实例级别的, NACL 是子网级别的
  • SG 有状态, NACL 无状态
  • SG 只支持允许规则, NACL 支持允许和拒绝

场景

  • 拒绝某个特定IP段访问某个子网

无状态: 即往返规则需要配置来回2条策略

安全组

安全组是作用于弹性网卡(ENI)级别的 有状态防火墙; 网络 ACL 是作用于子网(Subnet)级别 的无状态的

有状态: 能进就能出, 不需要配置双向策略; 无状态: 需要配置双向策略, 即 tcp 的回包 也需要策略

管理 cli

组管理cli

# show
aws --profile uat ec2 describe-security-groups --group-ids sg-0ddee21d8e13bfe11

aws ec2 create-security-group \
    --group-name "launch-xxx-1" \
    --description "launch-xxx-1 created 2025-07-15T11:48:13.869Z" \
    --vpc-id "vpc-0fdb583a4241e0934"

aws ec2 delete-security-group --group-id sg-903004f8
aws ec2 delete-security-group --group-name MySecurityGroup

策略管理cli

# 新增 - 信任指定ip全部流量
aws --profile uat ec2 authorize-security-group-ingress \
    --group-id sg-0ddee21d8e13bfe11 \
    --protocol -1 \
    --port -1 \
    --cidr 22.1.1.1/32

# 新增 - 信任指定ip 访问某端口
aws --profile uat --region ap-southeast-1 ec2 authorize-security-group-ingress \
    --group-id sg-0ddee21d8e13bfe11 \
    --protocol tcp \
    --port 22 \
    --cidr 22.0.113.0/24

# 新增 - 详细
aws --profile uat --region ap-southeast-1 ec2 authorize-security-group-ingress \
    --group-id sg-03560a978080de7ca \
    --ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges="[{CidrIp=118.175.0.230/32,Description='test rule 2'}]"


# 移除策略
aws ec2 revoke-security-group-ingress --group-name mySecurityGroup \
    --protocol tcp --port 22 --cidr 22.0.2.0/24

# 通过 ip 权限集删除
aws ec2 revoke-security-group-ingress --group-id sg-026c12253ce15eff7 \
    --ip-permissions IpProtocol=icmp,FromPort=3,ToPort=4,IpRanges=[{CidrIp=0.0.0.0/0}]

publicIp="1.1.2.3"

aws --profile uat ec2 revoke-security-group-ingress \
    --group-id sg-0a6c3d297d06c90d5 \
    --ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges="[{CidrIp=$publicIp/32,Description='b222tmp'}]" >> /dev/null

vip

注意, 这个 vip 地址不能是当前的 vpc cidr 地址段, 否则可能出现后续潜在的冲突

host 上新增一个 vip

/etc/netplan/60-failover-ip.yaml

network:
  version: 2
  ethernets: eth0
  addresses:
    - virtual.ip/32

netplan apply

在 AWS 控制台上禁用 EC2 实例的 "来源地址 / 目的地址" 的检查 通过禁用该检查, 可以允许 EC2 实例使用 VIP 发送 / 接收流量, 而不是其原始的 IP

# 查看 ecs  "来源地址 / 目的地址" 检查属性的当前状态
aws ec2 describe-instance-attribute --instance-id $AWS_INSTANCE_ID --attribute sourceDestCheck

# 禁用 "来源地址 / 目的地址" 检查
aws ec2 modify-instance-attribute --instance-id $AWS_INSTANCE_ID --no-source-dest-check
# 控制台或 cli 创建路由, 指向路由表中主节点的网络接口
aws ec2 create-route \
    --route-table-id $route_table_id \
    --destination-cidr-block virtual.ip/32 \
    --network-interface-id $network_interface_id

# 更新路由表, 再发生 vip 切换时, 主动更新路由表
aws ec2 replace-route \
    --route-table-id $route_table_id \
    --destination-cidr-block virtual.ip/32 \
    --network-interface-id $network_interface_id_primary

169.254.169.254

这个地址原本是 Microsoft Windows 的 APIPA 预留的(169.254.0.0/16)网段地址, 即 dhcp 失败后自动获取的一个随机地址范围

169.254.169.254 这个地址通常用于 ec2 实例上获取元数据 这个地址是 Amazon AWS 通过 DHCP 协议配置给每个 EC2 实例的; 通过访问该地址, 就可以访问到该 EC2 实例的元数据信息; 元数据包括实例 ID, 公网 IP 地址, 安全组, IAM 角色等信息;

openstack 也延续了这个用途, 同样华为云基于 openstack 也是同样的运用

即访问这个 ip 地址可以获取到与这个 ec2 实例相关的一些元数据

http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/user-data

INSTANCEID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region)

实例元数据服务版本:

AWS 提供两种版本的实例元数据服务(IMDS): IMDSv1 和 IMDSv2; 默认情况下, 两种版本都可用

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id
最后更新于