如何编写AWS CLI脚本将自身IP添加至AWS VPC安全组并解决语法报错
AWS CLI修改VPC安全组规则解决方案
报错原因说明
- 错误
IpProtocol:tcp, type: <class 'str'>, valid types: <class 'dict'>:原因是SecurityGroupRule参数格式不符合AWS CLI规范,你使用了JSON风格的冒号分隔键值,且没有正确声明嵌套字典结构,导致CLI将整个规则内容识别为字符串而非字典对象。 - 错误
Invalid value for portRange. Must specify both from and to ports with TCP/UDP.:原因是你将SecurityGroupRule下的每个属性单独套了一层大括号,导致CLI无法识别端口、协议属于同一条规则配置,判定你缺少必填的起止端口参数。
正确的modify-security-group-rules命令语法
修改现有安全组规则的标准写法如下,注意所有规则属性要放在同一个SecurityGroupRule字典内,键值用等号分隔,无多余嵌套大括号:
aws ec2 modify-security-group-rules --group-id 替换为你的安全组ID \ --security-group-rules SecurityGroupRuleId=替换为你的现有规则ID,\ SecurityGroupRule={IpProtocol=tcp,FromPort=443,ToPort=443,CidrIpv4=替换为你的IP/32}
注意:单IP访问的Cidr地址必须带/32掩码后缀,如果你需要开放HTTPS端口请确认端口号为443,避免笔误写错端口
推荐生产使用的替代方案
你采用的「删除旧规则+新增新规则」的方案稳定性更高,可避免修改规则时的ID匹配异常,完整可运行的脚本如下:
# 调用公网接口获取当前设备的公网IP IP=`curl -s http://whatismyip.akamai.com/` # 删除上一次运行添加的规则,首次运行前请手动创建一条规则并将ID写入ruleid_1.txt文件 aws ec2 revoke-security-group-ingress \ --group-id 替换为你的安全组ID \ --security-group-rule-ids $(cat ruleid_1.txt) # 新增当前IP的入站访问规则,提取新生成的规则ID存入文件供下次删除使用 aws ec2 authorize-security-group-ingress --group-id 替换为你的安全组ID \ --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges="[{CidrIp=$IP/32,Description=自定义规则备注}]" | jq '.SecurityGroupRules[0].SecurityGroupRuleId' -r > ruleid_1.txt
注意:运行该脚本需要提前安装jq工具,用于解析AWS返回的JSON数据提取规则ID
内容的提问来源于stack exchange,提问作者Shalev
相关产品推荐
相关产品推荐

