本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 CLI AWS 開始使用 Amazon VPC
本教學課程將引導您使用 AWS 命令列界面 () 建立虛擬私有雲端 (VPC AWS CLI)。您將了解如何設定具備公有與私有子網路的 VPC、設定網際網路連線,以及部署 EC2 執行個體,來示範常見的 Web 應用程式架構。
先決條件
在開始本教學課程之前,請確認已滿足以下條件:
-
AWS CLI。若需安裝,請根據 AWS CLI 安裝指南進行操作。
-
AWS CLI 使用適當的登入資料設定您的 。若尚未設定憑證,請執行
aws configure。 -
掌握聯網概念的基本知識。
-
Amazon VPC 的身分和存取管理 在 AWS 帳戶中建立和管理 VPC 資源。
成本考量
本教學課程會建立可能會在您的帳戶中產生成本 AWS 的資源。主要費用源自 NAT 閘道 (每小時 0.045 USD 外加資料處理費用) 與 EC2 執行個體 (t2.micro,每個執行個體每小時約 0.0116 USD)。若在一小時內完成本教學課程,隨後及時清理所有資源,總成本約為 0.07 USD。為最佳化開發環境的成本,建議使用 NAT 執行個體而非 NAT 閘道,因為這能大幅降低費用。
讓我們先確認您的 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。後續命令會用到該 ID。在本教學課程中,我們會將 "vpc-0123456789abcdef0" 用作範例 VPC ID。在所有命令中,將該 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" 用作第一個公有子網路的範例 ID。
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" 用作第二個公有子網路的範例 ID。
建立私有子網路
私有子網路用於不應直接透過網際網路存取的資源,例如資料庫。
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" 用作第一個私有子網路的範例 ID。
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" 用作第二個私有子網路的範例 ID。
此時已建立四個子網路:兩個公有子網路與兩個私有子網路,分佈在兩個可用區域中。
提示:規劃 CIDR 區塊時,確認這些區塊不會與現有的網路重疊。用於生產環境時,需配置足夠的 IP 位址因應未來擴展需求,同時保持子網路規模適中,兼顧安全與管理效率。
設定網際網路連線
若要允許 VPC 中的資源與網際網路通訊,需建立並連接網際網路閘道。在本節中,您需為 VPC 設定網際網路連線。
建立網際網路閘道
網際網路閘道可實現 VPC 與網際網路通訊。
aws ec2 create-internet-gateway \ --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=MyIGW}]'
記錄輸出中的網際網路閘道 ID。在本教學課程中,我們會將 "igw-0123456789abcdef0" 用作範例 ID。
將網際網路閘道連接至 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" 用作公有路由表的範例 ID。
在公有路由表中新增通往網際網路閘道的路由。
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" 用作私有路由表的範例 ID。
將私有子網路與私有路由表建立關聯。
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 閘道允許私有子網路中的執行個體啟動前往網際網路的傳出流量,同時阻止來自網際網路的傳入流量。此機制對於需要下載更新或存取外部服務的執行個體至關重要。
配置彈性 IP
首先,為 NAT 閘道配置彈性 IP 位址。
aws ec2 allocate-address --domain vpc
記錄輸出中的配置 ID。在本教學課程中,我們會將 "eipalloc-0123456789abcdef0" 用作範例 ID。
建立 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 閘道 ID。在本教學課程中,我們會將 "nat-0123456789abcdef0" 用作範例 ID。
等待 NAT 閘道變得可用,然後再繼續。
aws ec2 wait nat-gateway-available --nat-gateway-ids nat-0123456789abcdef0
新增通往 NAT 閘道的路由
在私有路由表中新增通往 NAT 閘道的路由,允許私有子網路中的執行個體存取網際網路。
aws ec2 create-route --route-table-id rtb-0123456789abcdef1 --destination-cidr-block 0.0.0.0/0 --nat-gateway-id nat-0123456789abcdef0
注意:若用於生產環境,建議在具備私有子網路的每個可用區域中建立 NAT 閘道,用以消除單點故障。
設定子網路
設定公有子網路,使之自動為於其中啟動的執行個體指派公有 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 伺服器安全群組的範例 ID。
允許 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" 用作資料庫伺服器安全群組的範例 ID。
僅允許來自 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" 用作範例 ID。
在公有子網路中啟動 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 伺服器執行個體的範例 ID。
在私有子網路中啟動資料庫伺服器
接著,在私有子網路中啟動 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" 用作資料庫伺服器執行個體的範例 ID。
存取 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" 用作範例 ID。
您現在可於 Web 瀏覽器中開啟此 URL: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" 用作範例 ID。
# 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 區塊未與帳戶中現有的 VPC 或子網路重疊。
許可錯誤
如遇許可錯誤,確認 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
刪除路由表
首先,查詢路由表關聯 ID:
aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef0 aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef1
接著,取消路由表與子網路的關聯 (將關聯 ID 取代為輸出中的關聯 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
生產環境部署須知
本教學課程旨在協助您了解如何透過 AWS CLI建立 VPC。若用於生產環境,建議遵循下列安全與架構最佳實務:
-
安全群組規則:將傳入流量限制於特定 IP 範圍,而不是允許來自 0.0.0.0/0 的流量。
-
高可用性:在具備私有子網路的每個可用區域中部署 NAT 閘道,用以消除單點故障。
-
網路 ACL:實作網路 ACL,作為安全群組之外的額外安全層。
-
VPC 流量日誌:啟用 VPC 流量日誌功能,用以監控與分析網路流量模式。
-
資源標記:實作完善的標記策略,提升資源管理效率。
如需有關建置生產就緒架構的詳細資訊,請參閱《AWS Well-Architected Framework》與《AWS 安全最佳實務
後續步驟
此時已建立具備公有與私有子網路的 VPC,接下來可以執行以下操作:
-
在公有或私有子網路中啟動 EC2 執行個體。
-
部署負載平衡器,將流量分散至多個執行個體。
-
設定 Auto Scaling 群組,實現高可用性與可擴展性。
-
在私有子網路中設定 RDS 資料庫。
-
實作 VPC 對等互連,實現與其他 VPC 的連線。
-
設定 VPN 連線,將 VPC 連線至內部部署網路。