我们拥有相当大的 EC2 资产,并且发现自己处于数百个安全组的情况。有没有人找到以下方法:
- 列出未与实例关联的安全组
- 导出每个安全组及其关联实例和规则
谢谢,亚历克斯
答案1
您无法删除与网络接口关联的安全组,即正在运行或已停止的实例。但是,如果您从 AMI 创建实例,并且当前没有引用安全组的实例或其他资源(如负载均衡器),则可能会删除它们。
最简单的做法是尝试删除所有安全组,不会删除与正在运行或停止的实例相关联的组。
如果您有自定义要求,您可以根据您想要编写的任何逻辑编写一个 lambda 来完成您需要做的事情。
答案2
玩一玩aws 命令行界面或者使用 python 的库博托3。
对于 aws CLI,您可以使用以下命令将所有现有安全组及其规则转储到 json 中:描述安全组
aws ec2 describe-security-groups --output json
# sample output
{
"SecurityGroups": [
{
"IpPermissionsEgress": [],
"Description": "group desc",
"IpPermissions": [
{
"PrefixListIds": [],
"FromPort": 27004,
"IpRanges": [],
"ToPort": 27049,
"IpProtocol": "tcp",
"UserIdGroupPairs": [
{
"GroupName": "name",
"UserId": "0511234123441",
"GroupId": "sg-b0674836"
}
对于第二部分,你有描述实例子命令 whitch 将转储所有实例的描述,其中包括关联的安全组。您必须编写一个小程序来处理这些 json 输出,但交叉引用实例和组规则所需的所有数据都在那里。您甚至可以使用路径查询以清除 JSON 输出中不需要的数据。
aws ec2 describe-instances --query "Reservations[].Instances[].[InstanceId,SecurityGroups]" --output json
[
[
"i-0c7bbc88743583793",
[
{
"GroupName": "group1",
"GroupId": "sg-a3f77f1d4"
}
]
],
[
"i-0f4ab88f9f9853a",
[
{
"GroupName": "group2",
"GroupId": "sg-7e99434"
}
]
],
....
如果你选择 boto3 库,你会发现该库的输入和输出非常相似,都具有描述实例函数和描述安全组功能
还请小心,因为如果您使用 EC2 Classic 安全组或 VPC 安全组,代码可能会有所变化,因为它们有点不同。