修复AWS CLI+jq查询符合安全组规则的EC2实例返回空结果的脚本问题
脚本故障原因
原脚本执行成功但无返回结果,核心存在3个问题:
- 多安全组ID传参格式错误:当匹配到多个符合条件的安全组时,
jq输出的多个安全组ID为换行分隔格式,但AWS CLI的--filters参数中Values字段要求多个值用英文逗号分隔,换行符会直接导致过滤条件失效,匹配不到任何实例。 - 安全组规则匹配逻辑不严谨:原
jq判断没有校验「22端口」和「0.0.0.0/0源网段」属于同一条入站规则,会出现跨规则误匹配;同时没有覆盖全端口开放(FromPort/ToPort为-1)、端口范围包含22的场景,会漏判符合要求的安全组。 - 未处理边界场景:当没有符合条件的安全组时,变量为空会触发CLI参数格式错误。
修正后脚本
#!/bin/bash # 提取符合要求的安全组ID,转为逗号分隔格式 SECURITY_GROUP_IDS=$(aws ec2 describe-security-groups | jq -r ' .SecurityGroups[] | select( .IpPermissions[] | ( # 覆盖单端口22、端口范围包含22、全端口开放三种场景 (.FromPort <= 22 and .ToPort >= 22) or (.FromPort == -1 and .ToPort == -1) ) and any(.IpRanges[]; .CidrIp == "0.0.0.0/0") ) | .GroupId' | tr '\n' ',' | sed 's/,$//') # 无匹配安全组直接退出 if [ -z "$SECURITY_GROUP_IDS" ]; then echo "未找到绑定符合规则安全组的EC2实例" exit 0 fi # 查询绑定对应安全组的EC2实例ID aws ec2 describe-instances \ --filters "Name=network-interface.group-id,Values=${SECURITY_GROUP_IDS}" \ | jq -r '.Reservations[].Instances[].InstanceId'
修正点说明
- 调整
jq匹配逻辑,强制端口条件和源网段条件属于同一条入站规则,避免跨规则误判 - 增加
tr转换逻辑,将换行分隔的安全组ID转为CLI要求的逗号分隔格式,解决过滤失效问题 - 补充全端口开放、端口范围覆盖22的场景匹配,避免漏判符合要求的资源
- 新增空值判断逻辑,无匹配资源时直接给出提示,避免CLI参数报错
内容的提问来源于stack exchange,提问作者Vanaan
相关产品推荐
相关产品推荐

