~ 有好的隔離環境 才能生產好的作品 ~
Amazon Virtual Private Cloud(Amazon VPC)可以讓我們在AWS Cloud中設置一個邏輯上隔離的區域,在此區域中,可以在您自己定義的虛擬網路中啟動AWS資源。這使我們能夠在私有網路環境中運行AWS資源,實現更高的安全性和控制。通過 Amazon VPC,可以配置自己的IP地址範圍、子網、路由表和網路閘道,這個虛擬網路環境完全由我們自己控制管理。這有助於創建可靠且高度可用的網路架構,並提供了一個選擇,使您可以在 AWS 中構建符合您業務需求的網路配置。
AWS VPC 有一些預設好的資源:
我們從實際建立一個 VPC 開始吧
在解釋 CIDR 之前,我們要先知道私有 IP 位址範圍是有規定的,IPv4 所規劃的私有 IP 範圍主要有以下三類可以選擇:
Class A:10.0.0.0 ~ 10.255.255.255 (可用 16,777,216 IP 位址)
Class B:172.16.0.0 ~ 172.31.255.255 (可用 1,048,576 IP 位址)
Class C:192.168.0.0 ~ 192.168.255.255 (可用 65,536 IP 位址)
無類別域間路由 (CIDR) 是一種 IP 地址分配方法,可提高網際網路上的資料路由效率。連線至網際網路的每台機器、伺服器和最終使用者裝置都有一個與之關聯的不重複編號,稱為 IP 地址。裝置透過使用這些 IP 地址找到彼此,並進行通訊。組織使用 CIDR 在其網路中靈活高效地分配 IP 地址。~ by AWS ~
這段話我看了幾百次都不懂,查了維基百科上面說,在之前的分類網路中,IP位址的分配把IP位址的32位元按每8位元為一段分開。這使得字首必須為8,16或者24位元。因此,可分配的最小的位址塊有256(24位元字首,8位元主機位址,28=256)個位址,大一點的位址塊包含65536(16位元字首,16位元主機,216=65536)個位址,而這對大公司來說都太多了。
AWS 會限制 CIDR block 最大是 /16 (最多可分配 65536 ip位置),最小是 /28 (最多可分配16 IP位置),那就有個問題,可分配 IP 數量不是越大越好嗎? 這個問題翻了翻 Google 並沒有合理的答案,於是我問了 ChatGPT 我認為說得很有道理:
Ask:CIDR block 越大越好嗎?
總之,沒有一個通用的答案可以確定更大的CIDR塊是否更好。這取決於因素,如您當前和未來的尋址需求、路由效率、子網劃分計劃和提供商政策。重要的是仔細規劃您的IP地址分配和子網劃分,以確保您的網絡滿足其需求,同時避免不必要的IP地址浪費或路由複雜性。
結論是:上面 Class A、B、C 照網路規模大小來排列由大中小來選擇。一班會選擇 65536 可分配 IP 位址 (/16),然後看習慣選擇 Class A/B/C 皆可。這次 CIDR block 我們選擇 10.0.0.0/16 (10.0.0.0 ~ 10.0.255.255)
$ aws ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--tag-specification 'ResourceType=vpc,Tags=[{Key=Name,Value=marathon-vpc}]'
$ aws ec2 describe-vpcs --filters Name=tag:Name,Values=marathon-vpc
# execute it later
$ aws ec2 delete-vpc --vpc-id <vpc-id>
$ aws ec2 create-subnet \
--cidr-block 10.0.0.0/20 \
--vpc-id <vpc-id> \
--availability-zone ap-northeast-1a \
--tag-specification 'ResourceType=subnet,Tags=[{Key=Name,Value=marathon-subnet-public01}]'
$ aws ec2 describe-subnets --filters Name=tag:Name,Values=marathon-subnet-public01
# execution later
$ aws ec2 delete-subnet --subnet-id <subnet-id>
Tag Name | --cidr-block | --availability-zone |
---|---|---|
marathon-subnet-public01 | 10.0.0.0/20 | ap-northeast-1a |
marathon-subnet-public02 | 10.0.16.0/20 | ap-northeast-1c |
marathon-subnet-private01 | 10.0.64.0/20 | ap-northeast-1a |
marathon-subnet-private02 | 10.0.80.0/20 | ap-northeast-1c |
$ aws ec2 create-internet-gateway \
--tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=marathon-igw}]'
$ aws ec2 attach-internet-gateway \
--vpc-id <vpc-id> \
--internet-gateway-id <igw-id> \
$ aws ec2 describe-internet-gateways --filters Name=tag:Name,Values=marathon-igw
# execution later
$ aws ec2 detach-internet-gateway --internet-gateway-id <igw-id> --vpc-id <vpc-id>
$ aws ec2 delete-internet-gateway --internet-gateway-id <igw-id>
如果私有子網要連上網際網路,必須透過 NAT Gateway,注意這個項目是要收費的唷
這裡我們分別在marathon-subnet-public01 & marathon-subnet-public02建立兩個 NAT Gateway
另外,建立 NAT Gateway 需要 彈性IP (Elastic IP,EIP),這個也是要付錢錢的
# 建立彈性IP
$ aws ec2 allocate-address
{
"PublicIp": "13.113.104.140",
"AllocationId": "eipalloc-0527d8d5f357be176",
"PublicIpv4Pool": "amazon",
"NetworkBorderGroup": "ap-northeast-1",
"Domain": "vpc"
}
$ aws ec2 create-nat-gateway \
--subnet-id <subnet-id> \
--allocation-id <allocation-id>
$ aws ec2 create-tags --resources <ngw-id> --tags Key=Name,Value=marathon-ngw-01
# execution later
# get elastic ip allocationId
$ aws ec2 release-address --allocation-id <allocation-id>
# for marathon-subnet-public-01, marathon-subnet-public-01
$ aws ec2 create-route-table \
--vpc-id <vpc-id> \
--tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=marathon-rt-public}]'
# for marathon-subnet-private-01, marathon-subnet-private-02
# because they're using 2 NAT gateways respectively to internet
$ aws ec2 create-route-table \
--vpc-id <vpc-id> \
--tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=marathon-rt-private01}]'
$ aws ec2 create-route-table \
--vpc-id <vpc-id> \
--tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=marathon-rt-private02}]'
# execution later
$ aws ec2 delete-route-table --route-table-id <rtb-id>
# for public subnet
$ aws ec2 create-route \
--route-table-id <public-route-table-id> \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id <internet-gateway-id>
{
"Return": true
}
# query route table info
$ aws ec2 describe-route-tables --filters Name=tag:Name,Values=marathon-rt-public
# for private subnet
$ aws ec2 create-route \
--route-table-id <public-route-table-id> \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id <NAT-gateway-id>
$ aws ec2 associate-route-table
--route-table-id <public-route-table-id>
--subnet-id <public-subnet-id>
$ aws ec2 associate-route-table
--route-table-id <private-route-table-id>
--subnet-id <private-subnet-id>
$ aws ec2 create-security-group --group-name <security-group-name> --description "<description>" --vpc-id <vpc-id>
# allows inbound SSH(port 22) access to resources from IPv4 IP addresses in your network.
$ aws ec2 authorize-security-group-ingress \
--group-id <security-group-id> \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0
# can be deleted by group name
$ aws ec2 delete-security-group --group-name MySecurityGroup
最後別忘了清除資源:
# Delete your security group by using the delete-security-group command
$ aws ec2 delete-security-group --group-id <security group id>
# Delete each subnet by using the delete-subnet command.
$ aws ec2 delete-subnet --subnet-id <subnet-id>
# Delete each custom route table by using the delete-route-table command.
$ aws ec2 delete-route-table --route-table-id <rtb-id>
# Detach your internet gateway from your VPC by using the detach-internet-gateway command.
$ aws ec2 detach-internet-gateway --internet-gateway-id <igw-id> --vpc-id <vpc-id>
# Delete your internet gateway by using the delete-internet-gateway command.
$ aws ec2 delete-internet-gateway --internet-gateway-id <igw-id>
# Delete your VPC by using the delete-vpc command.
$ aws ec2 delete-vpc --vpc-id <vpc-id>
總結來說,對於軟體開發者小弟我來說,第一次接觸到 VPC 這玩意兒覺得很難掌握著什麼東西,主要是對於網路概念的想法並不是跟網路工程師一樣很多東西都是認為理所當然,在網路的世界裡面有很多的內規,需要去熟悉的,知道了之後才恍然大悟,喔~,原來是這樣來的,對於服務來說,結果應該只有連得到 & 連不到兩種結果,要在 AWS 上去 trouble shooting 這一段的東西似乎需要 AWS VPC Reachability Analyzer 服務,不論如何,不熟悉 VPC 基本元件的話,可能要使用 Reachability Analyzer 查找問題也會有相當的難度。
AWS 職場實戰手冊 - 施威銘研究室
https://beginaws.awsstudygroup.com/2-vpc-setup/
http://dns-learning.twnic.net.tw/internet/intro7.html
https://chat.openai.com/
https://docs.aws.amazon.com/zh_tw/vpc/latest/userguide/delete-vpc.html#delete-vpc-cli