簡體   English   中英

AWS VPC 識別私有和公共 su.net

[英]AWS VPC identify private and public subnet

我在 AWS 賬戶中有一個 VPC,並且有 5 個 su.net 與該 VPC 關聯。 Su.nets 有兩種類型——公共的和私有的。 如何識別哪個 su.net 是公共的,哪個是私有的? 每個 su.net 都有 CIDR 10.249.?.? 范圍。

基本上,當我在那個 su.net 中使用 ec2Su.netIds 列表啟動 EMR 時,它說 ***The su.net configuration was invalid: Provided su.net list contains both public and private su.net。 只允許一種類型的 su.net。


如何糾正這個錯誤。

問題是如何識別公共子網與私有子網,答案在於 AWS 中 VPC 的子網是“公共”還是“私有”的含義。

公共子網有一個到Internet 網關的默認路由; 私有子網沒有。

因此,要確定給定子網是公共子網還是私有子網,您需要描述與該子網關聯的路由表。 這將告訴您路由,您可以測試網關 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 )。 這確認您正在查看公共子網。

最好的解決方案是只指定一個子網,這樣您就不會產生跨可用區數據費用。

在不查看路由表的情況下,沒有明確的方法來識別公共和私有子網:公共子網將路由到 Internet 網關,而私有子網則不會。 如果您通過某個程序創建集群,那么也許這是一個合理的檢查,但我不會去那里。

最好的替代方法是在創建子網時為其命名:類似於可用區 B 中私有子網的“私有 B”(us-east-1b、us-west-1b 等)。 如果您通過控制台啟動集群,該名稱應顯示在可用子網列表中(我多年沒有手動啟動 EMR 集群,所以不確定)。

或者,您可以為您的子網提供任意標簽。 如果您以編程方式訪問它們,這可能最有用。

我正在閱讀這個用戶指南VPC with a single su.net並發現這一行很有幫助。

“與具有到 inte.net 網關的路由的路由表相關聯的 su.net 稱為公共 su.net”

我發現這相當具有挑戰性。 我希望其他人覺得這很有用。 這種方法使用 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 的 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) ]'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM