[英]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.