iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Cloud Native

AWS AI交易室實戰系列 第 5

Day 5 - 建立 VPC

  • 分享至 

  • xImage
  •  

~ 有好的隔離環境 才能生產好的作品 ~

vpc network

Amazon Virtual Private Cloud(Amazon VPC)可以讓我們在AWS Cloud中設置一個邏輯上隔離的區域,在此區域中,可以在您自己定義的虛擬網路中啟動AWS資源。這使我們能夠在私有網路環境中運行AWS資源,實現更高的安全性和控制。通過 Amazon VPC,可以配置自己的IP地址範圍、子網、路由表和網路閘道,這個虛擬網路環境完全由我們自己控制管理。這有助於創建可靠且高度可用的網路架構,並提供了一個選擇,使您可以在 AWS 中構建符合您業務需求的網路配置。

AWS VPC 有一些預設好的資源:
default 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?

無類別域間路由 (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 越大越好嗎?

  1. 大小匹配: 分配比必要的更大CIDR塊可能會導致IP地址浪費,而使用更小的塊可能會導致地址耗盡。
  2. 路由效率: 更小的CIDR塊對於路由來說可能更有效,因為它們允許更具體的路由。較大的塊可能會創建更大的路由表,潛在地影響網絡效能。
  3. 子網劃分: 預計需要具有不同需求的多個子網,那麼更大的塊可能更靈活。
  4. 提供商政策: 網際網路服務提供商(ISP)或雲端服務提供商對分配給您的CIDR塊的大小有特定的政策或限制。

總之,沒有一個通用的答案可以確定更大的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>
  • 如圖所示,建立四個子網,注意在這裡這四子網的設定只有 CIDR Block 不同
$ 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
  • 如果VPC需要連上網際網路,我們需要建立 internet gateway
$ 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>
  • 為每個子網建立路由表(Route Table)
  • #雖然每個子網都必須分配一個路由表,但路由表是可以多個子網一起用的
# 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>
  • 為路由表(Route Table)加入路由紀錄
# 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>
  • 然後把 Route Table 與 Subnet 相關聯
$ 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>
  • 最後我們建立安全群組(Security Group),在 VPC 建立的時候,同時也會建立一個預設的安全群組
$ 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


上一篇
Day 4 - 基礎設施虛擬化 - CloudFormation
下一篇
Day 6 - EC2 & EC2 Instance Connect Endpoint
系列文
AWS AI交易室實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言