【问题标题】:AWS VPC identify private and public subnetAWS VPC 识别私有和公有子网
【发布时间】:2021-10-05 00:32:56
【问题描述】:

我在 AWS 账户中有一个 VPC,并且有 5 个子网与该 VPC 关联。子网有 2 种类型 - 公共和私有。如何识别哪个子网是公有的,哪个是私有的?每个子网都有 CIDR 10.249.?.?范围。

基本上,当我在具有 ec2SubnetIds 列表的子网中启动 EMR 时,它会说 ***子网配置无效:提供的子网列表包含公共子网和私有子网。只允许使用一种类型的子网。


如何纠正这个错误。

【问题讨论】:

  • 您可以检查 NAT 和 IGW 的子网。 IGW 建议使用公共子网,而 NAT 建议使用私有子网。
  • @VarunChandak 我认为您的意思是“检查子网的默认路由”,而不是“检查子网”。
  • @jarmod 为错过语义道歉

标签: amazon-web-services amazon-emr amazon-vpc subnet


【解决方案1】:

问题是如何区分公有子网和私有子网,答案在于在 AWS 中 VPC 的子网是“公有”还是“私有”意味着什么。

公共子网有一个默认路由到Internet Gateway;私有子网没有。

因此,要确定给定子网是公共子网还是私有子网,您需要描述与该子网关联的路由表。这将告诉您路由,您可以测试网关 ID 为igw-xxxxxxxxxxxxxxxxx(而不是local)的0.0.0.0/0 路由。

您可以通过查看子网的路由表来判断子网是否在 AWS VPC 控制台中公开,例如:

您也可以使用 awscli 对给定的子网 ID 执行以下操作:

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 的目标路由,其目标是 Internet 网关(其 GatewayId 为 igw-xxxxxxxxxxxxxxxxx)。这确认您正在查看公共子网。

【讨论】:

  • 您实际上是如何执行此“测试网关 ID 为 igw-xxxxxxxx(而不是“本地”)的“0.0.0.0/0”路由的。”部分?
  • @themiDdlest 添加了一个使用 awscli 的示例。
【解决方案2】:

最好的解决方案是只指定一个子网,这样就不会产生跨可用区的数据费用。

不查看路由表就无法确定公有子网和私有子网:公有子网会路由到 Internet 网关,而私有子网不会。如果您通过某个程序创建集群,那么也许这是一个合理的检查,但我不会去那里。

最好的替代方法是在您创建子网时为其命名:类似于“私有 B”,用于可用区 B 中的私有子网(us-east-1b、us-west-1b 等)。如果您通过控制台启动集群,则该名称应显示在可用子网列表中(我已经好几年没有手动启动 EMR 集群了,所以不确定)。

或者,您可以为子网指定任意标签。如果您以编程方式访问它们,这可能最有用。

【讨论】:

  • 在识别私有子网后,由于 EMR 不允许混合私有子网和公有子网,我从列表中删除了公有子网并只保留私有子网,然后它显示警告 No Amazon S3 endpoint found in subnet- ***。建议 EMR 使用 S3 端点来访问 S3 中的数据。这是什么分辨率。 NatGateway 与子网相关联。
【解决方案3】:

我发现这很有挑战性。我希望其他人觉得这很有用。这种方法使用 aws cli 和 jq。截至 2021 年中期,我正在使用两者的当前版本。需要注意的是,这仅适用于 IPv4 和只有 1 个互联网网关的 VPC。

从 bash shell 开始,首先确定您正在考虑子网的 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) ]'

【讨论】:

    【解决方案4】:

    我正在阅读此用户指南 VPC with a single subnet 并发现此行很有帮助。

    “与具有到 Internet 网关的路由的路由表关联的子网称为公共子网”

    【讨论】:

      猜你喜欢
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多