本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 CLI AWS 開始使用 Amazon VPC
本教學課程將引導您使用 AWS 命令列界面 () 建立虛擬私有雲端 (VPC AWS CLI)。您將了解如何設定具有公有和私有子網路的 VPC、設定網際網路連線,以及部署 EC2 執行個體以示範常見的 Web 應用程式架構。
先決條件
開始本教學課程之前,請確定您有下列項目:
-
AWS CLI。如果您需要安裝,請遵循 AWS CLI 安裝指南。
-
AWS CLI 使用適當的登入資料設定您的 。
aws configure
如果您尚未設定登入資料,請執行 。 -
對聯網概念的基本了解。
-
Amazon VPC 的 Identity and Access Management 在 AWS 帳戶中建立和管理 VPC 資源。
成本考量
本教學課程會建立可能在您的帳戶中產生成本 AWS 的資源。主要成本來自 NAT Gateway (每小時 0.045 美元加上資料處理費用) 和 EC2 執行個體 (t2.micro,每個執行個體每小時約 0.0116 美元)。如果您在一小時內完成本教學課程,然後清除所有資源,總成本約為 0.07 美元。對於開發環境中的成本最佳化,請考慮使用 NAT 執行個體而非 NAT Gateway,這會大幅降低成本。
讓我們先確認您的 AWS CLI 已正確設定,再繼續。
aws configure list
您應該會看到您的 AWS 存取金鑰、私密金鑰和預設區域。此外,請確認您擁有建立 VPC 資源所需的許可。
aws sts get-caller-identity
此命令會顯示 AWS 您的帳戶 ID、使用者 ID 和 ARN,確認您的登入資料有效。
建立 VPC
Virtual Private Cloud (VPC) 是專屬於您 AWS 帳戶的虛擬網路。在本節中,您將建立 CIDR 區塊為 10.0.0.0/16 的 VPC,最多可提供 65,536 個 IP 地址。
建立 VPC
下列命令會建立新的 VPC,並為其指派名稱標籤。
aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=MyVPC}]'
請記下輸出中的 VPC ID。後續的命令將需要它。為了本教學課程的目的,我們將使用 "vpc-0123456789abcdef0" 做為範例 VPC ID。在所有命令中,將此值取代為實際的 VPC ID。
啟用 DNS 支援和主機名稱
預設會在新的 VPC 中停用 DNS 解析和 DNS 主機名稱。啟用這些功能,以允許 VPC 中的執行個體解析網域名稱。
aws ec2 modify-vpc-attribute --vpc-id vpc-0123456789abcdef0 --enable-dns-support aws ec2 modify-vpc-attribute --vpc-id vpc-0123456789abcdef0 --enable-dns-hostnames
如果成功,這些命令不會產生輸出。您的 VPC 現在已啟用 DNS 支援和主機名稱解析。
建立子網路
子網路是 VPC IP 地址範圍的區段,您可以在其中放置隔離資源群組。在本節中,您將在兩個可用區域中建立公有和私有子網路,以實現高可用性。
取得可用的可用區域
首先,擷取您區域中可用的可用區域。
aws ec2 describe-availability-zones
在本教學課程中,我們將使用前兩個可用區域。記下其來自輸出的名稱 (例如 "us-east-1a" 和 "us-east-1b")。
建立公有子網路
公有子網路用於需要從網際網路存取的資源,例如 Web 伺服器。
aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.0.0/24 \ --availability-zone us-east-1a \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Public-Subnet-AZ1}]'
請注意輸出中的子網路 ID。在本教學課程中,我們將使用「subnet-0123456789abcdef0」作為第一個公有子網路的範例。
aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.1.0/24 \ --availability-zone us-east-1b \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Public-Subnet-AZ2}]'
請注意輸出中的子網路 ID。在本教學課程中,我們將使用「subnet-0123456789abcdef1」作為第二個公有子網路的範例。
建立私有子網路
私有子網路用於不應直接從網際網路存取的資源,例如資料庫。
aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.2.0/24 \ --availability-zone us-east-1a \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Private-Subnet-AZ1}]'
請注意輸出中的子網路 ID。在本教學課程中,我們將使用「subnet-0123456789abcdef2」作為第一個私有子網路的範例。
aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.3.0/24 \ --availability-zone us-east-1b \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Private-Subnet-AZ2}]'
請注意輸出中的子網路 ID。在本教學課程中,我們將使用「subnet-0123456789abcdef3」作為第二個私有子網路的範例。
您現在有四個子網路:兩個公有子網路和兩個私有子網路,分佈在兩個可用區域。
秘訣:規劃 CIDR 區塊時,請確保它們不會與您現有的網路重疊。對於生產環境,配置足夠的 IP 地址以因應未來成長,同時保持子網路大小合理,以因應安全性和管理。
設定網際網路連線
若要允許 VPC 中的資源與網際網路通訊,您需要建立並連接網際網路閘道。在本節中,您將為您的 VPC 設定網際網路連線。
建立網際網路閘道
網路閘道可讓您的 VPC 與網際網路之間進行通訊。
aws ec2 create-internet-gateway \ --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=MyIGW}]'
請注意輸出中的網際網路閘道 ID。在本教學課程中,我們將使用「igw-0123456789abcdef0」做為範例。
將網際網路閘道連接至您的 VPC
建立網際網路閘道之後,請將其連接至您的 VPC。
aws ec2 attach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0
建立和設定路由表
路由表包含規則 (路由),可判斷網路流量導向的位置。首先,為您的公有子網路建立路由表。
aws ec2 create-route-table \ --vpc-id vpc-0123456789abcdef0 \ --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=Public-RT}]'
記下輸出的路由表 ID。在本教學課程中,我們將使用 "rtb-0123456789abcdef0" 做為公有路由表的範例。
在公有路由表中將路由新增至網際網路閘道。
aws ec2 create-route --route-table-id rtb-0123456789abcdef0 --destination-cidr-block 0.0.0.0/0 --gateway-id igw-0123456789abcdef0
將公有子網路與公有路由表建立關聯。
aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef0 --subnet-id subnet-0123456789abcdef0 aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef0 --subnet-id subnet-0123456789abcdef1
現在,為您的私有子網路建立路由表。
aws ec2 create-route-table \ --vpc-id vpc-0123456789abcdef0 \ --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=Private-RT}]'
記下輸出的路由表 ID。在本教學課程中,我們將使用 "rtb-0123456789abcdef1" 做為私有路由表的範例。
將私有子網路與私有路由表建立關聯。
aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef1 --subnet-id subnet-0123456789abcdef2 aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef1 --subnet-id subnet-0123456789abcdef3
建立 NAT 閘道
NAT Gateway 允許私有子網路中的執行個體啟動網際網路的傳出流量,同時防止來自網際網路的傳入流量。這對於需要下載更新或存取外部服務的執行個體至關重要。
配置彈性 IP
首先,為您的 NAT Gateway 配置彈性 IP 地址。
aws ec2 allocate-address --domain vpc
請注意輸出的配置 ID。在本教學課程中,我們將使用「eipalloc-0123456789abcdef0」作為範例。
建立 NAT 閘道
使用配置的彈性 IP 在其中一個公有子網路中建立 NAT 閘道。
aws ec2 create-nat-gateway \ --subnet-id subnet-0123456789abcdef0 \ --allocation-id eipalloc-0123456789abcdef0 \ --tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=MyNATGateway}]'
請注意輸出中的 NAT Gateway ID。在本教學課程中,我們將使用 "nat-0123456789abcdef0" 做為範例。
等待 NAT Gateway 變成可用,再繼續。
aws ec2 wait nat-gateway-available --nat-gateway-ids nat-0123456789abcdef0
將路由新增至 NAT 閘道
在私有路由表中將路由新增至 NAT Gateway,以允許私有子網路中的執行個體存取網際網路。
aws ec2 create-route --route-table-id rtb-0123456789abcdef1 --destination-cidr-block 0.0.0.0/0 --nat-gateway-id nat-0123456789abcdef0
注意:對於生產環境,請考慮在具有私有子網路的每個可用區域中建立 NAT Gateway,以消除單點故障。
設定子網路設定
設定您的公有子網路,以自動將公有 IP 地址指派給其中啟動的執行個體。
aws ec2 modify-subnet-attribute --subnet-id subnet-0123456789abcdef0 --map-public-ip-on-launch aws ec2 modify-subnet-attribute --subnet-id subnet-0123456789abcdef1 --map-public-ip-on-launch
這可確保在公有子網路中啟動的執行個體預設會收到公有 IP 地址,使其可從網際網路存取。
建立安全群組
安全群組可做為執行個體的虛擬防火牆,以控制傳入和傳出流量。在本節中,您將為 Web 伺服器和資料庫伺服器建立安全群組。
建立 Web 伺服器的安全群組
aws ec2 create-security-group \ --group-name WebServerSG \ --description "Security group for web servers" \ --vpc-id vpc-0123456789abcdef0
請注意來自輸出的安全群組 ID。在本教學課程中,我們將使用 "sg-0123456789abcdef0" 做為 Web 伺服器安全群組的範例。
允許 HTTP 和 HTTPS 流量到您的 Web 伺服器。
aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef0 --protocol tcp --port 80 --cidr 0.0.0.0/0 aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef0 --protocol tcp --port 443 --cidr 0.0.0.0/0
注意:對於生產環境,將傳入流量限制在特定 IP 範圍,而不是允許來自 0.0.0.0/0 (任何 IP 地址) 的流量。
建立資料庫伺服器的安全群組
aws ec2 create-security-group \ --group-name DBServerSG \ --description "Security group for database servers" \ --vpc-id vpc-0123456789abcdef0
請注意來自輸出的安全群組 ID。在本教學課程中,我們將使用 "sg-0123456789abcdef1" 做為資料庫伺服器安全群組的範例。
僅允許來自 Web 伺服器的 MySQL/Aurora 流量。
aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef1 --protocol tcp --port 3306 --source-group sg-0123456789abcdef0
此組態可確保只有 Web 伺服器安全群組中的執行個體可以遵循最低權限原則,連線到連接埠 3306 上的資料庫伺服器。
驗證 VPC 組態
建立所有必要的元件之後,請驗證您的 VPC 組態,以確保一切設定正確。
檢查您的 VPC
aws ec2 describe-vpcs --vpc-id vpc-0123456789abcdef0
檢查您的子網路
aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"
檢查您的路由表
aws ec2 describe-route-tables --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"
檢查您的網際網路閘道
aws ec2 describe-internet-gateways --filters "Name=attachment.vpc-id,Values=vpc-0123456789abcdef0"
檢查您的 NAT 閘道
aws ec2 describe-nat-gateways --filter "Name=vpc-id,Values=vpc-0123456789abcdef0"
檢查您的安全群組
aws ec2 describe-security-groups --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"
這些命令提供有關 VPC 每個元件的詳細資訊,可讓您驗證一切設定是否正確。
部署 EC2 執行個體
現在您已建立 VPC 基礎設施,您可以部署 EC2 執行個體來示範架構的運作方式。您將在公有子網路中啟動 Web 伺服器,並在私有子網路中啟動資料庫伺服器。
建立 SSH 存取的金鑰對
首先,建立金鑰對以安全地連線至您的執行個體:
aws ec2 create-key-pair --key-name vpc-tutorial-key --query 'KeyMaterial' --output text > vpc-tutorial-key.pem chmod 400 vpc-tutorial-key.pem
此命令會建立新的金鑰對,並將私有金鑰儲存至具有受限許可的檔案。
尋找最新的 Amazon Linux 2 AMI
尋找要用於執行個體的最新 Amazon Linux 2 AMI:
aws ec2 describe-images --owners amazon \ --filters "Name=name,Values=amzn2-ami-hvm-*-x86_64-gp2" "Name=state,Values=available" \ --query "sort_by(Images, &CreationDate)[-1].ImageId" --output text
請注意輸出的 AMI ID。在本教學課程中,我們將使用「ami-0123456789abcdef0」做為範例。
在公有子網路中啟動 Web 伺服器
現在,在公有子網路中啟動 EC2 執行個體以做為 Web 伺服器:
aws ec2 run-instances \ --image-id ami-0123456789abcdef0 \ --count 1 \ --instance-type t2.micro \ --key-name vpc-tutorial-key \ --security-group-ids sg-0123456789abcdef0 \ --subnet-id subnet-0123456789abcdef0 \ --associate-public-ip-address \ --user-data '#!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo "<h1>Hello from $(hostname -f)</h1>" > /var/www/html/index.html' \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WebServer}]'
請注意輸出中的執行個體 ID。在本教學課程中,我們將使用 "i-0123456789abcdef0" 做為 Web 伺服器執行個體的範例。
在私有子網路中啟動資料庫伺服器
接著,在私有子網路中啟動 EC2 執行個體以做為資料庫伺服器:
aws ec2 run-instances \ --image-id ami-0123456789abcdef0 \ --count 1 \ --instance-type t2.micro \ --key-name vpc-tutorial-key \ --security-group-ids sg-0123456789abcdef1 \ --subnet-id subnet-0123456789abcdef2 \ --user-data '#!/bin/bash yum update -y yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb' \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=DBServer}]'
請注意輸出中的執行個體 ID。在本教學課程中,我們將使用 "i-0123456789abcdef1" 做為資料庫伺服器執行個體的範例。
存取您的 Web 伺服器
執行 Web 伺服器執行個體後,您可以使用其公有 IP 地址來存取它:
aws ec2 describe-instances \ --instance-ids i-0123456789abcdef0 \ --query 'Reservations[0].Instances[0].PublicIpAddress' \ --output text
此命令將輸出 Web 伺服器的公有 IP 地址。在本教學課程中,我們將使用「203.0.113.10」做為範例。
您現在可以在 Web 瀏覽器中開啟此 URL:https://http://203.0.113.10
透過 SSH 連線至您的執行個體
若要連線至您的 Web 伺服器:
ssh -i vpc-tutorial-key.pem ec2-user@203.0.113.10
若要連線至資料庫伺服器,您需要先將 SSH 連線至 Web 伺服器,然後連線至資料庫伺服器:
# Get the private IP of the database server aws ec2 describe-instances \ --instance-ids i-0123456789abcdef1 \ --query 'Reservations[0].Instances[0].PrivateIpAddress' \ --output text
此命令將輸出資料庫伺服器的私有 IP 地址。在本教學課程中,我們將使用「10.0.2.10」做為範例。
# First SSH to web server, then to database server ssh -i vpc-tutorial-key.pem -A ec2-user@203.0.113.10 ssh ec2-user@10.0.2.10
這會示範您已建立的網路架構:Web 伺服器可公開存取,而資料庫伺服器只能從 VPC 內存取。
故障診斷
以下是您在建立 VPC 時可能遇到的一些常見問題,以及如何解決這些問題:
CIDR 區塊重疊
如果您收到有關 CIDR 區塊重疊的錯誤,請確保 VPC 和子網路的 CIDR 區塊不會與您帳戶中現有的 VPCs 或子網路重疊。
許可錯誤
如果您遇到許可錯誤,請確認您的 IAM 使用者或角色具有建立和管理 VPC 資源所需的許可。您可能需要連接AmazonVPCFullAccess
政策或建立具有所需許可的自訂政策。
資源限制
AWS 帳戶預設限制您可以建立VPCs、子網路和其他資源數量。如果您達到這些限制,您可以透過 AWS 支援中心請求提高。
清除期間相依性失敗
清除資源時,如果您嘗試以錯誤的順序刪除資源,可能會遇到相依性錯誤。從最相依的資源開始,一律以建立的相反順序刪除資源。
清除資源
完成 VPC 後,您可以清除資源以避免產生費用。以建立的相反順序刪除資源,以正確處理相依性。
終止 EC2 執行個體
aws ec2 terminate-instances --instance-ids i-0123456789abcdef0 i-0123456789abcdef1 aws ec2 wait instance-terminated --instance-ids i-0123456789abcdef0 i-0123456789abcdef1
刪除金鑰對
aws ec2 delete-key-pair --key-name vpc-tutorial-key rm vpc-tutorial-key.pem
刪除 NAT 閘道
aws ec2 delete-nat-gateway --nat-gateway-id nat-0123456789abcdef0 aws ec2 wait nat-gateway-deleted --nat-gateway-ids nat-0123456789abcdef0
釋放彈性 IP
aws ec2 release-address --allocation-id eipalloc-0123456789abcdef0
刪除安全群組
aws ec2 delete-security-group --group-id sg-0123456789abcdef1 aws ec2 delete-security-group --group-id sg-0123456789abcdef0
刪除路由表
首先,尋找路由表關聯 IDs:
aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef0 aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef1
然後取消路由表與子網路的關聯 (將關聯 IDs 取代為輸出的關聯 ID):
aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef0 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef1 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef2 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef3
然後刪除路由表:
aws ec2 delete-route-table --route-table-id rtb-0123456789abcdef1 aws ec2 delete-route-table --route-table-id rtb-0123456789abcdef0
分離和刪除網際網路閘道
aws ec2 detach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0 aws ec2 delete-internet-gateway --internet-gateway-id igw-0123456789abcdef0
刪除子網路
aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef0 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef1 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef2 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef3
刪除 VPC
aws ec2 delete-vpc --vpc-id vpc-0123456789abcdef0
進入生產環境
本教學課程旨在協助您了解如何使用 建立 VPC AWS CLI。對於生產環境,請考慮下列安全性和架構最佳實務:
-
安全群組規則:將傳入流量限制在特定 IP 範圍,而不是允許來自 0.0.0.0/0 的流量。
-
高可用性:在您擁有私有子網路的每個可用區域中部署 NAT 閘道,以消除單點故障。
-
網路 ACLs:實作網路 ACLs 作為安全群組以外的額外安全層。
-
VPC 流程日誌:啟用 VPC 流程日誌來監控和分析網路流量模式。
-
資源標記:實作全面的標記策略,以改善資源管理。
如需建置生產就緒架構的詳細資訊,請參閱 AWS Well-Architected Framework 和AWS 安全最佳實務
後續步驟
現在您已使用公有和私有子網路建立 VPC,您可以:
-
在公有或私有子網路中啟動 EC2 執行個體。
-
部署負載平衡器,將流量分散到多個執行個體。
-
設定 Auto Scaling 群組以獲得高可用性和可擴展性。
-
在私有子網路中設定 RDS 資料庫。
-
實作 VPC 對等互連以與其他 VPCs連線。
-
設定 VPN 連線,將您的 VPC 與您的內部部署網路連線。