配置Travis NAT IP为AWS VPC安全组IP列表的脚本报错排查
修复AWS托管前缀列表创建脚本的参数解析错误
问题根源
你碰到的错误是因为--entries参数的格式不符合AWS CLI要求。AWS CLI规定,前缀列表的每个条目必须是独立的Cidr=xxx/32,Description=xxx单元,多个单元之间用空格分隔;但你的脚本把所有Cidr和Description键值对直接拼接成了一串,导致CLI识别到重复的Description键,无法正确解析参数。
修正后的脚本
改用数组存储每个条目,最后用空格拼接成符合要求的格式,避免参数解析错误:
#!/bin/bash # 获取Travis NAT IP列表 TRAVIS_NAT_IPS=$(wget -qO- https://dnsjson.com/nat.travisci.net/A.json | jq -r '.results.records[]') readarray -t IP_ADDRESSES <<< "$TRAVIS_NAT_IPS" # 初始化条目数组,每个元素对应一个前缀列表条目 ENTRIES=() for IP in "${IP_ADDRESSES[@]}" do ENTRIES+=("Cidr=$IP/32,Description=Travis") done # 创建托管前缀列表,数组元素自动用空格分隔 aws ec2 create-managed-prefix-list \ --address-family IPv4 \ --max-entries 100 \ --entries "${ENTRIES[@]}" \ --prefix-list-name travis-nat-ips
更简洁的替代方案
用jq直接生成符合CLI要求的条目格式,省去循环拼接的步骤:
#!/bin/bash # 用jq一次性生成空格分隔的条目字符串 ENTRIES=$(wget -qO- https://dnsjson.com/nat.travisci.net/A.json | jq -r '.results.records[] | "Cidr=\(.)/32,Description=Travis"' | tr '\n' ' ') aws ec2 create-managed-prefix-list \ --address-family IPv4 \ --max-entries 100 \ --entries "$ENTRIES" \ --prefix-list-name travis-nat-ips
后续安全配置
创建好托管前缀列表后,在AWS安全组的入站规则中添加SSH(22端口)规则,将源设置为这个前缀列表即可。这样既能允许所有Travis NAT IP的SSH部署连接,又不会把22端口开放到公网。
内容的提问来源于stack exchange,提问作者Aron Novak
相关产品推荐
相关产品推荐

