在 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 及其关联资源,从而更轻松地管理和维护您的云基础架构。

相关文章