AWS VPC идентифицирует частную и общедоступную подсети
У меня есть аккаунт VPC в AWS, и с этим VPC связано 5 подсетей. Подсети бывают двух типов - публичные и частные. Как определить, какая подсеть является общедоступной, а какая частной? Каждая подсеть имеет CIDR 10.249.?.? спектр.
В основном, когда я запускаю EMR в этой подсети со списками ec2SubnetIds, он говорит, что *** Конфигурация подсети была недействительной: предоставленный список подсетей содержит как общедоступную, так и частную подсеть. Разрешен только один тип подсети.
Как исправить эту ошибку.
4 ответа
Вопрос состоит в том, как определить общедоступные подсети по сравнению с частными подсетями, и ответ заключается в том, что в AWS означает, что подсеть VPC должна быть "общедоступной" и "частной".
Общедоступные подсети имеют маршрут по умолчанию к интернет-шлюзу; частных подсетей нет.
Таким образом, чтобы определить, является ли данная подсеть общедоступной или частной, вам необходимо описать таблицу маршрутов, связанную с этой подсетью. Это сообщит вам маршруты, и вы сможете проверить маршрут "0.0.0.0/0" с идентификатором шлюза igw-xxxxxxxx (в отличие от "local").
Лучшее решение состоит в том, чтобы указать только одну подсеть, чтобы не платить за передачу данных по нескольким AZ.
Не существует определенного способа идентификации общедоступных и частных подсетей, не просматривая их таблицы маршрутизации: общедоступная подсеть будет маршрутизировать к интернет-шлюзу, а частная подсеть - нет. Если вы создаете свои кластеры с помощью какой-то программы, то, возможно, это разумная проверка, но я бы туда не пошел.
Лучшая альтернатива - дать подсети имя при ее создании: что-то вроде "Private B" для частной подсети в зоне доступности B (us-east-1b, us-west-1b, что угодно). Если вы запускаете кластер через консоль, это имя должно отображаться в списке доступных подсетей (я не запускал кластер EMR вручную, так что не знаю наверняка).
Кроме того, вы можете дать своим подсетям произвольные теги. Это, вероятно, наиболее полезно, если вы обращаетесь к ним программно.
Я обнаружил, что это довольно сложно. Я надеюсь, что другие сочтут это полезным. В этом подходе используются aws cli и jq. По состоянию на середину 2021 года я использую текущие версии обоих. Предупреждаем, что это относится только к IPv4 и VPC только с 1 интернет-шлюзом.
Из оболочки bash начните с определения VPC, в котором вы рассматриваете подсети. В моем случае использования я хотел, чтобы VPC размещал кластер EKS.
VPC_ID=`aws eks describe-cluster \
--name ${CLUSTER_NAME} \
--query "cluster.resourcesVpcConfig.vpcId" \
--output text`
Найдите интернет-шлюз для этого VPC
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) ]'
Я читал это руководство пользователя VPC с одной подсетью и нашел эту строку полезной.
«Подсеть, связанная с таблицей маршрутов, у которой есть маршрут к интернет-шлюзу, называется общедоступной подсетью»