我在AWS账户中有一个VPC,与该VPC相关联的有5个子网。子网分为两种类型:公网子网和私网子网。如何确定哪个子网是公网子网,哪个是私网子网?每个子网都有CIDR 10.249.?.?范围。
基本上,当我在具有ec2SubnetIds列表的子网中启动EMR时,它会说:“子网配置无效:提供的子网列表包含公网子网和私网子网。只允许使用一种子网类型。”
如何纠正此错误。
我在AWS账户中有一个VPC,与该VPC相关联的有5个子网。子网分为两种类型:公网子网和私网子网。如何确定哪个子网是公网子网,哪个是私网子网?每个子网都有CIDR 10.249.?.?范围。
基本上,当我在具有ec2SubnetIds列表的子网中启动EMR时,它会说:“子网配置无效:提供的子网列表包含公网子网和私网子网。只允许使用一种子网类型。”
如何纠正此错误。
igw-xxxxxxxxxxxxxxxxx
(而不是local
)的0.0.0.0/0
路由。aws ec2 describe-route-tables \
--filter Name=association.subnet-id,Values=subnet-0a123fc414ad5b999 \
--query "RouteTables[].Routes[]"
输出结果将会是这样的:
[
{
"DestinationCidrBlock": "10.0.0.0/16",
"GatewayId": "local",
"Origin": "CreateRouteTable",
"State": "active"
},
{
"DestinationCidrBlock": "0.0.0.0/0",
"GatewayId": "igw-0fca21fadaa22a1b2",
"Origin": "CreateRoute",
"State": "active"
}
]
这里,您可以看到一个目的地路由 0.0.0.0/0
,其目标是互联网网关(其GatewayId为igw-xxxxxxxxxxxxxxxxx
)。这证实您正在查看公共子网。
我发现这很具有挑战性。希望其他人也会觉得这有用。这种方法使用aws cli和jq。截至2021年中期,我正在使用两者的当前版本。需要注意的是,这仅适用于IPv4,并且仅适用于具有1个Internet网关的VPC。
从bash shell开始,首先要确定您正在考虑子网的VPC。在我的用例中,我想要托管EKS集群的VPC。
VPC_ID=`aws eks describe-cluster \
--name ${CLUSTER_NAME} \
--query "cluster.resourcesVpcConfig.vpcId" \
--output text`
查找该VPC的Internet网关
IGW_ID=`aws ec2 describe-internet-gateways \
--filters Name=attachment.vpc-id,Values=${VPC_ID} \
--query "InternetGateways[].InternetGatewayId" \
| jq -r '.[0]'`
识别公共子网
PUBLIC_SUBNETS=`aws ec2 describe-route-tables \
--query 'RouteTables[*].Associations[].SubnetId' \
--filters "Name=vpc-id,Values=${VPC_ID}" \
"Name=route.gateway-id,Values=${IGW_ID}" \
| jq . -c`
echo $PUBLIC_SUBNETS
aws ec2 describe-subnets \
--filter Name=vpc-id,Values=${VPC_ID} \
--query 'Subnets[].SubnetId' \
| jq -c '[ .[] | select( . as $i | '${PUBLIC_SUBNETS}' | index($i) | not) ]'