You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS CLI安全组入站规则脚本重复添加报错求助

AWS安全组规则批量修改/添加脚本报错修复

问题原因

原脚本核心逻辑错误:对安全组内每一条现有入站规则单独判断,只要当前规则描述不匹配目标值,就执行一次添加新规则操作。当目标规则不存在时,遍历多少条现有规则就会触发多少次添加请求,第一次添加后规则已存在,后续请求自然触发「入站规则(IP地址)已存在」报错。

修复思路

  1. 针对每个安全组,先一次性拉取所有入站规则的描述与对应规则ID,统一检查是否存在目标描述的规则
  2. 若存在匹配规则,找到对应规则ID执行修改操作
  3. 若不存在匹配规则,仅执行一次添加操作,避免重复请求

修改后脚本

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:33:20