首页 > 解决方案 > 如何在不使用 AWS CLI 删除当前附加的安全组的情况下将新的安全组分配给 EC2 实例?

问题描述

将安全组附加到正在运行的 EC2 实例的 AWS CLI 命令如下。

aws ec2 modify-instance-attribute --instance-id i-12345 --groups sg-12345 sg-67890

但上述命令将删除当前附加的安全组并附加新的安全组。

我有一个用例,其中有 100 多台服务器,我必须一个新的安全组附加到所有这些服务器,而不分离当前的安全组。

如何使用 AWS CLI 实现这一目标?

标签: amazon-web-servicesamazon-ec2aws-cliaws-security-group

解决方案


根据传递的参数--groups进行完全替换,并且无法绕过此行为,因此您需要实现获取现有安全组 (SG) 的逻辑,将新的 SG 添加到然后将其作为输入传递给--groups.

aws ec2 modify-instance-attribute 文件确认:

--groups(列表)

[EC2-VPC]将实例的安全组替换为指定的安全组。您必须至少指定一个安全组,即使它只是 VPC 的默认安全组。您必须指定安全组 ID,而不是安全组名称。

(细绳)


此命令应将具有 ID 的实例的所有安全组存储i-12345$securitygroups

securitygroups=$(aws ec2 describe-instances --instance-ids i-12345 --query "Reservations[].Instances[].SecurityGroups[].GroupId[]" --output text)

的输出echo $securitygroups将类似于以下内容:

sg-074bb9206bd7edaf2 sg-07cd92995b937cbd2 sg-05414d9cef32901be

假设您的新安全组 ID 为sg-67890,请执行以下命令将新 SG ID 附加到我们要设置的安全组列表中(该空间很重要且需要):

securitygroups+=" sg-67890"

的输出echo $securitygroups现在应该附加新的 SG ID:

sg-074bb9206bd7edaf2 sg-07cd92995b937cbd2 sg-05414d9cef32901be sg-67890

最后,传递$securitygroups给 的--groups选项aws ec2 modify-instance-attribute

此变量将包含现有分配的 SG ID 以及要分配的新 SG ID,因此它将是分配新 SG 而不会取消分配任何当前 SG:

aws ec2 modify-instance-attribute --instance-id i-067a3aae02b8239e6 --groups $securitygroups

不管你有多少实例,把它放在一个循环中,问题就解决了。


推荐阅读