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

修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:36:19