使用 CLI AWS 開始使用 Amazon VPC - Amazon Virtual Private Cloud

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 CLI AWS 開始使用 Amazon VPC

本教學課程將引導您使用 AWS 命令列界面 () 建立虛擬私有雲端 (VPC AWS CLI)。您將了解如何設定具有公有和私有子網路的 VPC、設定網際網路連線,以及部署 EC2 執行個體以示範常見的 Web 應用程式架構。

先決條件

開始本教學課程之前,請確定您有下列項目:

  1. AWS CLI。如果您需要安裝,請遵循 AWS CLI 安裝指南

  2. AWS CLI 使用適當的登入資料設定您的 。aws configure 如果您尚未設定登入資料,請執行 。

  3. 對聯網概念的基本了解。

  4. 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。對於生產環境,請考慮下列安全性和架構最佳實務:

  1. 安全群組規則:將傳入流量限制在特定 IP 範圍,而不是允許來自 0.0.0.0/0 的流量。

  2. 高可用性:在您擁有私有子網路的每個可用區域中部署 NAT 閘道,以消除單點故障。

  3. 網路 ACLs:實作網路 ACLs 作為安全群組以外的額外安全層。

  4. VPC 流程日誌:啟用 VPC 流程日誌來監控和分析網路流量模式。

  5. 資源標記:實作全面的標記策略,以改善資源管理。

如需建置生產就緒架構的詳細資訊,請參閱 AWS Well-Architected FrameworkAWS 安全最佳實務

後續步驟

現在您已使用公有和私有子網路建立 VPC,您可以:

  1. 在公有或私有子網路中啟動 EC2 執行個體

  2. 部署負載平衡器,將流量分散到多個執行個體。

  3. 設定 Auto Scaling 群組以獲得高可用性和可擴展性。

  4. 在私有子網路中設定 RDS 資料庫

  5. 實作 VPC 對等互連以與其他 VPCs連線。

  6. 設定 VPN 連線,將您的 VPC 與您的內部部署網路連線。