AWS CLI安全组入站规则脚本重复添加报错求助
AWS安全组规则批量修改/添加脚本报错修复
问题原因
原脚本核心逻辑错误:对安全组内每一条现有入站规则单独判断,只要当前规则描述不匹配目标值,就执行一次添加新规则操作。当目标规则不存在时,遍历多少条现有规则就会触发多少次添加请求,第一次添加后规则已存在,后续请求自然触发「入站规则(IP地址)已存在」报错。
修复思路
- 针对每个安全组,先一次性拉取所有入站规则的描述与对应规则ID,统一检查是否存在目标描述的规则
- 若存在匹配规则,找到对应规则ID执行修改操作
- 若不存在匹配规则,仅执行一次添加操作,避免重复请求
修改后脚本
tagkey=$1 # 安全组关联标签键 descname=$2 # 目标入站规则描述 ipaddress=$3 # 新的IP地址 echo "脚本开始执行" # 遍历带有指定标签的所有安全组,提取安全组ID for sgroup in $(aws resourcegroupstaggingapi get-resources --region us-east-1 \ --tag-filters Key=$tagkey,Values= \ --tags-per-page 100 | awk -F'/' '{print $2}' | tr -d "\,"); do echo "处理安全组:$sgroup" # 一次性获取当前安全组所有入站规则的规则ID和描述,格式为"规则ID:描述" rules_list=$(aws ec2 describe-security-group-rules \ --filter Name="group-id",Values=$sgroup \ --query "SecurityGroupRules[*].{Rule:SecurityGroupRuleId, Desc:Description}" \ --output text | awk '{print $1 ":" $2}') rule_found=false # 遍历所有规则,检查是否存在目标描述的规则 for rule in $rules_list; do rule_id=$(echo $rule | cut -d':' -f1) rule_desc=$(echo $rule | cut -d':' -f2) if [[ "$rule_desc" == "$descname" ]]; then rule_found=true echo "找到匹配规则:$rule_id,开始修改IP地址" # 修改现有规则的IP地址 aws ec2 modify-security-group-rules --region us-east-1 \ --group-id $sgroup \ --security-group-rules "SecurityGroupRuleId=$rule_id,SecurityGroupRule={Description=$descname,CidrIpv4=$ipaddress,IpProtocol=tcp,FromPort=0,ToPort=65535}" fi done # 如果没有找到匹配规则,执行一次添加操作 if [[ $rule_found == false ]]; then echo "未找到目标规则,开始添加新规则" aws ec2 authorize-security-group-ingress \ --group-id $sgroup \ --ip-permissions IpProtocol=tcp,FromPort=0,ToPort=65535,IpRanges="[{CidrIp=$ipaddress, Description=$descname}]" fi done
关键改动说明
- 批量获取规则:用单次
aws ec2 describe-security-group-rules调用获取当前安全组所有规则信息,减少API调用次数,便于统一检查 - 全局标记匹配状态:用
rule_found变量标记当前安全组是否存在目标规则,避免重复判断 - 添加操作后置:仅在遍历完所有规则、确认目标规则不存在后,执行一次添加操作,彻底解决重复添加问题
- 变量命名优化:将原脚本模糊变量名改为清晰名称,提升可读性
内容的提问来源于stack exchange,提问作者h.pylori
相关产品推荐
相关产品推荐

