在 AWS 上使用 Terraform 部署 WordPress 和 MySQL

1BaK6x3aU-g76TlzyyKytnAAWS 架構圖

先決條件:

  • AWS、Terraform、Bash、Docker 的基礎知識
  • 安裝 AWS CLI:AWS CLI
  • 安裝 Terraform:Terraform

介紹

一種WS 是一個雲計算平台,提供廣泛的服務,包括計算、存儲、網路、資料庫、分析、機器學習、安全和應用程序開發。AWS 使開發人員能夠在即用即付的基礎上大規模構建、測試和部署應用程序和服務。AWS 是全球最大的在線零售商亞馬遜的產品,被從初創公司到大型企業的各種規模的企業廣泛使用。

Terraform是一種用於安全高效地構建、更改和版本控制基礎設施的工具。它是一種開源基礎設施即代碼 (IAC) 工具,允許用戶使用聲明性配置文件定義和部署他們的雲基礎設施。

使用 Terraform,用戶可以自動化創建和管理 AWS 基礎設施的過程,包括 VPC、公共和私有子網、NAT 網關和安全組。Terraform 是一種流行的基礎設施即代碼 (IaC) 工具,它允許用戶使用聲明性配置文件來定義和管理基礎設施。

Bash 腳本是在 Linux 和類 Unix 操作系統上自動執行任務的常用方法。在 AWS 和 Terraform 的上下文中,bash 腳本可用於自動化部署和管理基礎設施的過程。

Bash 腳本可以與 Terraform 結合使用,以自動化部署和管理基礎設施的過程,以及與其他工具和服務集成。例如,bash 腳本可用於自動化設置 AWS 環境的過程,包括創建和配置 AWS 資源,例如 EC2 實例和 S3 存儲桶。它還可用於啟動 Terraform 配置並傳遞必要的輸入變數。

總的來說,bash 腳本是一個強大的工具,可用於自動化使用 AWS 和 Terraform 的許多方面,從而使管理基礎設施變得更加輕鬆和高效。

Docker是一種允許用戶在輕量級容器中打包和部署應用程序的工具。它是一個開源平台,通過提供在任何環境中構建、發布和運行應用程序的標準方式來簡化應用程序的開發和部署。Docker 可與 AWS 結合使用,在 AWS 基礎設施(例如 Amazon EC2 實例、Amazon ECS 集群和 Amazon EKS 集群)上部署和運行應用程序。

要使用 Terraform 創建具有 VPC、公共和私有子網、NAT 網關和安全組的 AWS 基礎設施,用戶可以按照以下步驟操作:

要做的步驟:

  1. 在本地系統上安裝和配置 Terraform
  2. 為 Terraform 安裝 IDE — VS 代碼編輯器
  3. 創建一個新的 Terraform 配置文件並指定 AWS 提供商詳細信息,例如訪問密鑰和秘密密鑰
  4. 使用定義的變數創建 terraform.tfvars 文件
  5. 為與 EC2 實例的安全 ssh 連接創建 AWS 密鑰對
  6. 定義 VPC 資源,為其提供唯一名稱和所需的 CIDR 塊範圍。
  7. 在 VPC 中啟用自動公共 IP 分配創建公共子網
  8. 在 VPC 中創建私有子網
  9. 為公有子網中的實例創建公網網關訪問公網
  10. 為公共子網定義路由表,指定互聯網網關作為所有互聯網流量的目標
  11. 將路由表關聯到公共子網以提供互聯網網關地址
  12. 為 NAT 網關創建彈性 IP
  13. 為MySQL實例創建NAT網關訪問Internet
  14. 為必須與 MySQL 實例關聯的 NAT 網關訪問創建路由表
  15. 將上面創建的路由表與 MySQL 實例相關聯
  16. 為堡壘主機創建安全組
  17. 為 WordPress 實例創建安全組
  18. 為 MySQL 實例創建安全組
  19. 啟動堡壘主機
  20. 啟動一個在其上託管 WordPress 的 Web 伺服器實例
  21. 空資源和供應商
  22. 使用 bash 安裝腳本啟動 MySQL 實例
  23. 更新你的 variables.tf
  24. 更新你的 tfvars 文件
  25. 地形應用
  26. 測試您的部署

第 1 步:在本地系統上安裝和配置 Terraform

下載 Terraform:https ://www.terraform.io/downloads.html

# 將二進位 zip 文件複製到文件夾mkdir /Users/<YOUR-USER>/Documents/terraform-install COPY 包到「terraform-install」文件夾
# 解壓unzip <PACKAGE-NAME>解壓 terraform_0 .14 .3 _darwin_amd64。壓縮
# 將 terraform 二進位文件複製到 /usr/local/bin echo  $PATH mv terraform /usr/local/bin
# 驗證版本terraform 版本
# 卸載 Terraform(不需要)rm -rf /usr/local/bin/terraform

第 2 步:為 Terraform 安裝 IDE — VS 代碼編輯器

第 3 步:創建一個新的 Terraform 配置文件並指定 AWS 提供商詳細信息,例如訪問密鑰和秘密密鑰

AWS 提供商:是在基礎架構即代碼 (IaC) 工具(例如 Terraform)上下文中使用的術語。在此上下文中,AWS 提供程序是 Terraform 的一個插件,允許它與 Amazon Web Services (AWS) 中的資源進行交互。這包括創建、更新和刪除資源,例如 Amazon EC2 實例和 Amazon S3 存儲桶。

在 Terraform 中,變數用於定義可以作為代碼 (IaC) 模板傳遞到基礎設施中並在整個配置中使用的值。可以通過多種方式定義變數,包括在 Terraform 配置文件本身或外部變數文件中。

第 4 步:使用定義的變數創建 terraform.tfvars 文件

Terraform 變數文件使用「.tfvars」文件擴展名,通常包含鍵值格式的變數值。

Terraform 使用該.tfvars文件載入配置變數。該.tfvars文件是一種在配置文件中設置變數的方法。

如果您有多個使用相同配置代碼庫但具有不同變數值的環境,這將很有用。通過使用.tfvars文件,您可以通過指定.tfvars要使用的不同文件輕鬆地在環境之間切換。

.tfvars文件是可選的,但它可以是為您的配置設置變數的便捷方式。如果您在與配置文件.tfvars相同的目錄中有一個文件.tf,Terraform 將在您運行時自動從中載入變數terraform apply

您還可以在運行時使用標誌指定.tfvars要使用的文件。例如:-var-fileterraform apply

terraform 應用-var-file=prod.tfvars

這將使用prod.tfvars文件中指定的變數應用配置。

第 5 步:創建用於與 EC2 實例的安全 ssh 連接的 AWS 密鑰對

AWS 密鑰對:用於安全地通過 SSH 連接到 Amazon EC2 實例。當您啟動 EC2 實例時,您需要為該實例指定一個密鑰對。這用於安全地通過 SSH 連接到實例。

私鑰文件存儲在您的本地計算機上,公鑰存儲在實例中。當您通過 SSH 連接到實例時,您可以使用私鑰文件對您自己進行身份驗證。這確保只有您擁有私鑰才能訪問該實例。

密鑰對還用於安全訪問其他 AWS 資源,例如 Amazon RDS 資料庫實例或 Amazon Redshift 集群。在這些情況下,私鑰用於驗證和訪問資源。

密鑰對對於維護 AWS 資源的安全非常重要。它們允許您安全地訪問您的資源,並確保只有您(或擁有私鑰的其他人)可以訪問它們。

第 6 步:定義 VPC 資源,為其指定唯一名稱和所需的 CIDR 塊範圍

AWS VPC : 亞馬遜網路服務 (AWS) 虛​​擬私有雲 (VPC) 是 AWS 雲的邏輯隔離部分,用戶可以在其中在他們定義的虛擬網路中啟動 AWS 資源。VPC 允許用戶定義和自定義其 AWS 資源的網路設置,包括 IP 地址範圍、子網和網路網關。VPC 為部署和運行 AWS 資源提供了一個安全且可擴展的環境,並允許使用公共和私有 IP 地址。它們還支持 VPN 和 Direct Connect 連接,以便與其他網路進行安全、私密的通信。

第 7 步:創建在 VPC 中啟用自動公共 IP 分配的公共子網

AWS 公共子網: Amazon Web Services (AWS) 公共子網是 Amazon Virtual Private Cloud (Amazon VPC) 中的子網,已配置為允許入站和出站互聯網流量。這意味著公共子網中的實例可以與 Internet 通信,反之亦然。相比之下,私有子網中的實例只能與 VPC 內的其他資源通信,不能直接訪問互聯網。

在 Terraform 中,該depends_on屬性可用於指定資源之間的依賴關係。如果資源 A 依賴於資源 B,則意味著必須先創建資源 B,然後才能創建資源 A。

在此示例中,aws_subnet資源依賴於aws_vpc名稱為 的資源vpc。這意味著必須先創建 VPC,然後才能創建子網資源。

在一個資源依賴於先創建另一個資源的情況下,使用該depends_on屬性可能很有用。它確保在創建資源時遵循正確的順序。

步驟 8:在 VPC 中創建私有子網

AWS 私有子網: Amazon Web Services (AWS) 私有子網是 Amazon Virtual Private Cloud (Amazon VPC) 中的子網,已配置為僅允許出站互聯網流量。這意味著私有子網中的實例只能與 VPC 內的其他資源通信,不能直接訪問互聯網。相反,公共子網中的實例可以與 Internet 通信,反之亦然。

第九步:為公有子網中的實例創建公網網關訪問公網

AWS Internet 網關:Amazon Web Services (AWS) Internet 網關是一種在 Amazon VPC(虛擬私有雲)和 Internet 之間提供水平擴展、冗餘和高可用性連接的服務。

它使VPC中的實例可以與Internet通信,並使Internet用戶可以與VPC中的實例建立連接。這允許使用基於互聯網的服務和應用程序,例如基於網路的應用程序、內容交付網路和其他基於互聯網的服務。

第 10 步:為公共子網定義路由表,指定互聯網網關作為所有互聯網流量的目標

AWS 路由表: Amazon Web Services (AWS) 路由表用於控制 VPC(虛擬私有雲)中的網路流量。每個路由表都與一個子網相關聯,並指定可用路由和每個路由的目標。

目標可以包括本地子網、互聯網網關、虛擬專用網關和其他網路介面。路由表還包含互聯網流量的默認路由,可用於將互聯網流量路由到互聯網網關NAT(網路地址轉換)設備。路由表允許用戶自定義其 VPC 中的網路流量,以滿足其應用程序和工作負載的特定要求。

步驟 11:將路由表關聯到公共子網以提供互聯網網關地址

AWS 路由表關聯:在 Amazon Web Services (AWS) 中,路由表關聯是路由表和子網之間的連接。VPC(虛擬私有雲)中的每個子網都必須與一個路由表相關聯,該路由表指定可用路由以及每個路由的目標。

這允許在 VPC 中自定義網路流量,並支持使用基於 Internet 的服務和應用程序。

第 12 步:為 NAT 網關創建彈性 IP

AWS EIP: Amazon Web Services (AWS) 彈性 IP (EIP) 是一項允許用戶分配公共 IP 地址並將其與 AWS 資源相關聯的服務。這允許使用分配的 EIP 從 Internet 訪問資源,即使資源位於網路地址轉換 (NAT) 設備或防火牆後面。

EIP 可用於為需要從 Internet 訪問的資源(例如 Web 伺服器或資料庫)提供固定的公共 IP 地址。EIP 可與 EC2 實例、NAT 網關和網路介面等 AWS 資源一起使用。

第13步:為MySQL實例創建NAT網關訪問Internet

AWS NAT 網關:亞馬遜網路服務 (AWS) NAT 網關是一種託管網路地址轉換 (NAT) 服務,可為亞馬遜虛擬私有雲 (VPC) 提供安全且可擴展的互聯網訪問。NAT 網關使私有子網中的實例能夠連接到 Internet 或其他 AWS 服務,同時阻止 Internet 啟動與這些實例的連接。NAT 網關是一種高度可用、可擴展的服務,可自動處理增加的網路流量。它允許私有實例訪問 Internet 以獲取更新和補丁,同時維護私有子網的安全性。

Step 14: 為NAT Gateway Access創建路由表,必須關聯MySQL Instance

現在,任何流向 MySQL 實例的 CIDR 塊的流量都將通過 NAT 網關進行路由。

Step 15:將上面創建的路由表關聯到MySQL實例

第 16 步:為堡壘主機創建安全組

重複相同的步驟為堡壘主機創建一個安全組,允許外界的任何人通過 SSH 訪問堡壘主機。

要保護與私有子網中實例的 SSH 連接,您可以在公有子網中啟動堡壘主機。堡壘主機的安全組應該允許來自任何地方或來自特定 IP 地址的傳入 SSH 連接以增加安全性。

我們將安全組配置為允許來自堡壘主機的 HTTP 埠 80 和 SSH 埠 22 上的傳入流量。

第 17 步:為 WordPress 實例創建安全組

AWS 安全組: Amazon Web Services (AWS) 安全組是一種網路安全功能,充當 EC2 實例的虛擬防火牆,控制入站和出站流量。

安全組允許您根據您定義的一系列安全規則指定允許哪些流量到達您的實例。這些規則指定允許訪問您的實例的協議、埠和源 IP 範圍。安全組為您的 AWS 環境提供額外的安全層。

要為 WordPress Web 伺服器創建一個安全組,將 ping、HTTP 和 SSH 訪問的入站規則以及出站網路流量設置為全部,請執行以下步驟:

第 18 步:為 MySQL 實例創建安全組

重複相同的步驟為 MySQL 實例創建一個安全組,它只允許資料庫訪問那些在步驟 15 中創建了 WordPress 安全組的實例。

MySQL 實例的安全組應允許埠 3306 上來自 WordPress 實例的傳入連接,在入站規則中使用 WordPress 實例的安全組 ID。它還應允許在入站規則中使用堡壘主機的安全組 ID,在埠 22 上從堡壘主機傳入 SSH 連接。這將確保只有 WordPress 實例可以通過埠 3306 連接到 MySQL 實例,並且只有堡壘主機可以通過 SSH 連接到 MySQL 實例。

在入站規則中使用安全組 ID 有幾個優點。它使您可以避免在實例的公共 IP 地址發生變化時必須更新規則,並且可以更輕鬆地擴展您的實例,而無需為每個實例創建單獨的入站規則。

第 19 步:啟動堡壘主機

Bastion 主機: Amazon Web Services (AWS) Bastion 主機是一種特殊類型的 Amazon EC2 實例,可讓您通過 Internet 安全地連接到您的實例。Bastion 主機充當本地計算機與 AWS VPC(虛擬私有雲)中的實例之間的安全中間連接點。

堡壘主機是提供從外部網路(例如 Internet)訪問專用網路的伺服器。因為它暴露於潛在的攻擊,堡壘主機必須盡量減少滲透的機會。例如,您可以使用堡壘主機來保護從外部網路到在 Amazon Virtual Private Cloud (VPC) 的私有子網中啟動的 Linux 實例的 SSH 連接。

可以使用 Amazon Linux 2 AMI 和 t2.micro 實例類型啟動堡壘主機。您可以將之前創建的密鑰附加到堡壘主機,並使用 Terraform 文件供應器將密鑰從本地計算機複製到堡壘主機(我們將在第 21 步中使用空資源和供應器執行此操作)。這將允許您使用相同的密鑰從堡壘主機通過 SSH 連接到私有子網中的實例。但是,為了增加安全性,建議為每個實例使用不同的密鑰。

第 20 步:啟動一個託管 WordPress 的網路伺服器實例

要在公共子網中啟動面向公眾的 Web 應用程序,例如 WordPress,我們將使用 Amazon Linux 2 AMI。

第 21 步:空資源和供應商

Terraform 中的 Provisioner 用於在創建後執行腳本或配置資源。例如,您可以使用配置器在虛擬機上安裝軟體或部署配置管理工具。

null_resource如果您想要執行與 Terraform 中任何特定資源類型不對應的任務,或者您想要執行與基礎設施創建不直接相關的任務,則使用和 provisioner 可能很有用。例如,您可以將 anull_resource與供應商一起使用來運行設置開發環境或配置系統以進行測試的腳本。

我們將使用 provisioner 自動安裝和配置 WordPress,包括安裝 Docker、從 Docker Hub 拉取 WordPress 鏡像,以及啟動帶有鏡像的 WordPress 容器。您可以將環境變數傳遞給腳本,為 MySQL 資料庫配置 WordPress 容器,並在埠 80 上設置從 Docker 主機到 Docker 容器的埠轉發。您可以為此實例使用與堡壘相同的密鑰主持人。

第 22 步:使用 bash 安裝腳本啟動 MySQL 實例:

要在私有子網中為 MySQL 啟動 EC2 實例,您可以使用 Amazon Linux 2 AMI 並在用戶數據中傳遞腳本。

由於您不需要將任何 Terraform 屬性傳遞給此腳本,因此您可以創建一個單獨的 .sh 文件並使用該file函數將其傳遞給 EC2 用戶數據。此腳本可用於在 EC2 實例上自動安裝和配置 MySQL。之前,我們創建了 2 個安全組(步驟 16 和 18)來保護 MySQL 實例,方法是將安全組配置為僅允許來自公有子網中的 WordPress(用於訪問 MySQL 資料庫)和 Bastion(用於更新和補丁)實例的傳入連接. 這將有助於防止未經授權訪問 MySQL 資料庫。

使用此 bash 腳本將安裝並啟用 Docker,然後mysql:5.7從 Docker Hub 拉取映像。然後,我們將使用此映像啟動一個容器,並傳遞所需的環境變數來配置 MySQL 伺服器。您還可以在埠 3306 上設置從 Docker 主機到 Docker 容器的埠轉發。

第 23 步:更新您的 variables.tf

第 24 步:更新您的 tfvars 文件

第 25 步:地形應用

現在我們可以創建我們所有的基礎設施,我們只需要一個命令

地形應用

步驟 26:測試您的部署

  • 遠程訪問堡壘主機並從那裡遠程訪問 MySQL
  • WordPress的

一旦配置了所有基礎設施,您就可以通過複製其公共 IP 地址並將其粘貼到 Web 瀏覽器來訪問 WordPress 實例。由於您已經將所需的環境變數傳遞給 WordPress 容器,因此無需為 MySQL 配置 WordPress。您只需選擇一種語言並創建一個帳戶即可開始使用 WordPress。

謝謝

在本文中,您了解了如何使用 Terraform 創建具有公有子網和私有子網的 VPC,以及如何使用 Docker 部署 WordPress 和 MySQL。按照本文概述的步驟,您可以使用基礎架構即代碼創建和配置 VPC 及其關聯資源,從而更輕鬆地管理和維護您的雲基礎架構。

相關文章