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 с одной подсетью и нашел эту строку полезной.

«Подсеть, связанная с таблицей маршрутов, у которой есть маршрут к интернет-шлюзу, называется общедоступной подсетью»

Другие вопросы по тегам