我正在尝试清理我的 AWS 配置,我想知道特定子网是否实际使用/其中包含任何资源。
我知道您可以通过 AWS Web 界面按子网 ID 过滤特定资源类型(例如 EC2 实例)的列表,但我还不知道可能使用的所有不同资源类型 - 所以我担心我可能会错过一些东西。
我已尝试通过 AWS CLI 检查子网,但看不到任何明显区分正在使用的子网和未使用的子网的信息:
aws ec2 describe-subnets
这个问题涉及枚举特定子网的 CIDR 块内的所有 IP 地址,但它没有揭示如何仅显示活动 IP 地址(我大概可以用它来查找附加的 AWS 资源并确认子网确实位于其中)使用)。
这似乎是一项常见任务,但我找不到关于如何执行此操作的 AWS 文档或 SO 帖子。也许我的方法有一些缺陷。
aws ec2 describe-network-interfaces --filters Name=subnet-id,Values=subnet-id-here | grep Description
(将 subnet-id-here
替换为记住的子网 ID)
上述命令将为您提供该子网中的资源名称。
aws ec2 describe-network-interfaces
。
这将返回 弹性网络接口 (ENI) 列表并支持
subnet-id
过滤器。 EC2 实例并不是子网上唯一的东西 - RDS 实例、弹性负载均衡器、Lambda 函数、弹性文件系统挂载目标、NAT 网关和其他资源消耗子网上的 IP 地址,但在每种情况下我可以想到,他们通过分配 ENI 来做到这一点。在某些情况下,例如负载均衡器(ALB 和 Classic),地址数量会随着均衡器容量的扩大和缩小而增加和减少。就 Lambda 而言,缺少分配的 ENI 可能仅意味着由于流量不足,当前没有任何 Lambda 容器主机正在使用该子网...因此,如果您有 VPC Lambda 函数,请记住这一点。
您还可以在 EC2 控制台左侧导航窗格的“网络接口”下看到 ENI。
filter
query
开关在 --filters
开关值参数中,将
<<Subnet ID>>
替换为您的子网 ID。aws ec2 describe-network-interfaces \
--filters Name=subnet-id,Values=<<Subnet ID>> \
--query 'NetworkInterfaces[*].Description'
for subnet in $(aws ec2 describe-subnets --query 'Subnets[].SubnetId' --output text); do
echo $subnet; aws ec2 describe-network-interfaces --filters Name=subnet-id,Values=$subnet --query 'NetworkInterfaces[].[NetworkInterfaceId,Description]' --output text;
done