发布于 2026-01-06 7 阅读
0

使用 Terraform 和 Jenkins CI/CD 配置 AWS 基础设施

使用 Terraform 和 Jenkins CI/CD 配置 AWS 基础设施

介绍

在这个项目中,我使用 Terraform 在 AWS 云上搭建了基础设施。该基础设施包括 4 台 Web 服务器和 2 个数据库实例。具体完成的任务包括:

任务:

  1. 编写 Terraform 脚本,在高度可用的环境中配置服务器和数据库。
  2. 为每个实例指定唯一名称,并在这些实例上安装 Apache。
  3. 将 Terraform 脚本推送到 GitHub 进行版本控制。
  4. 创建一个 Jenkins 作业,自动检测 GitHub 上 Terraform 脚本的更改并部署这些更改。

项目执行

基础设施架构设计:

第一步是确定满足设计需求所需的 AWS 资源,然后设计系统的基础设施架构。这一步包括确定任务所需的 AWS 服务、定义基础设施组件及其相互关系。

以下是满足要求的 AWS 云所需资源的架构图:

架构图

此图中所示资源定义如下:

1. 虚拟私有云:

借助 Amazon Virtual Private Cloud (Amazon VPC),您可以在自己定义的逻辑隔离的虚拟网络中启动 AWS 资源。该虚拟网络与您在自有数据中心运行的传统网络非常相似,同时又能享受到 AWS 可扩展基础设施带来的优势。
点击此处了解更多信息。

我使用 Terraform 为初创公司定义了 VPC 资源,并为该 VPC 分配了 10.0.0.0/16 的 CIDR 块。这意味着该范围内的 IP 地址可以分配给此 VPC 中使用的资源。

VPC CIDR 块

2. 地区:

AWS 具有“区域”的概念,它指的是我们在全球范围内聚集数据中心的物理位置。我们将每组逻辑数据中心称为“可用区”。每个 AWS 区域至少包含三个位于同一地理区域内、彼此隔离且物理上分离的可用区。
点击此处了解更多信息

该初创公司云架构部署选定的区域为 eu-west-2(伦敦),如下所示:

AWS 区域

3. 可用区:

可用区 (AZ) 是指 AWS 区域中一个或多个具有冗余电源、网络和连接的独立数据中心。
点击此处了解更多信息。

我将其定义如下:

可用区

4. 公共子网:
公共子网是指具有通往互联网网关的路由的子网。它允许子网内的资源通过互联网网关与互联网通信。

为了确保高可用性,我们选择了 2 个子网来部署 Web 服务器,并将这些子网放置在上面定义的已创建的 VPC 中。

公共子网

5. 私有子网:
私有子网是指无法从互联网访问的子网,因为它没有通过互联网网关连接到互联网的路径。私有子网用于存放数据库和其他不应被公众访问的资源和服务。

本项目中使用的私有子网用于存放创建的数据库实例,因为除非另有说明,否则不应允许通过互联网访问数据库。

私有子网

6. EC2 实例(Web 服务器):
EC2 实例是可以在 VPC 内启动的虚拟服务器。它们可以配置各种操作系统,并提供不同的规格和配置以满足不同的工作负载需求。本项目选择的实例类型为 t2.micro,并安装了 Ubuntu AMI。

EC2实例

创建的实例用作本项目的 Web 服务器。每个可用区创建了 2 个实例,以确保高可用性。Apache 安装数据也包含在用户数据资源中,这样实例创建时,Apache 就会立即安装到实例中。这些实例位于公共子网中,以便可以通过互联网访问。

网络服务器

用户数据

7. RDS 数据库:

Amazon Relational Database Service (RDS) 是一种完全托管的数据库服务,可为 MySQL、PostgreSQL、Oracle 等关系型数据库提供易于扩展、高可用性和安全性。点击此处了解更多信息。

为了确保高可用性,我们在 2 个可用区中配置了 t2.micro 实例类的 MySQL 引擎,并分配了 5 GB 的存储空间。

MySQL引擎

关系数据库

8. 路线表:

路由表包含用于引导流量进出 VPC 内资源的路由。它可以关联一个或多个子网。路由表用于引导流量从公共 Web 服务器流向互联网,从数据库实例流向 Web 服务器,以及在 VPC 内的 Web 服务器之间进行流量路由。

此路由表将 VPC 中的 Web 服务器的 IP 地址路由到互联网网关。

路线表

这是数据库实例的路由表。

数据库实例的路由表

路由表现在与它们所指向的子网中的 IP 地址相关联。

相关RTB

9. 安全组:
安全组充当虚拟防火墙,控制 VPC 内 EC2 实例和其他资源的入站和出站流量。它们与一个或多个实例关联,并且可以配置为允许或拒绝特定类型的流量。

该安全组允许通过 HTTP 从互联网访问托管 apache 服务器的 EC2 实例,并允许从该实例向互联网发出任何协议类型的请求。

安全组

这里,其中一个网络服务器是通过互联网使用 HTTP 协议访问的。

网络服务器

11. 互联网网关:
互联网网关负责允许 VPC 中的流量访问公共互联网。

互联网网关

12. 应用负载均衡器:
负载均衡器是一种负责将传入流量分配到 VPC 内指定目标的服务。

这样可以确保负载均匀分布在 Web 服务器资源上。

13. 用户浏览器:
用户浏览器是用户访问和操作运行在 EC2 实例或其他 VPC 资源上的 Web 应用程序的应用程序。它向应用程序发送 HTTP 请求并接收 HTTP 响应。

用户浏览器

设置 AWS 账户:

基础设施设计完成后,下一步是设置 AWS 账户、创建虚拟私有云 (VPC) 并启动必要的资源,例如子网、路由表、互联网网关和安全组。务必遵循最佳实践,并确保资源分布在多个可用区 (AZ) 中,以实现高可用性。

这是通过 AWS CLI 命令使用 AWS 配置完成的。

AWS 配置

配置 Terraform:

初始化 Terraform:Terraform 脚本编写完成后,需要使用“terraform init”命令进行初始化。此命令会下载必要的插件和模块。

terraform init

规划变更: `terraform plan` 命令用于创建执行计划。它会显示 Terraform 将创建、更新或删除的资源。

地形改造计划

应用更改:最后,使用“terraform apply”命令将更改应用到 AWS 基础设施。此命令会创建实例、安装 Apache 并根据 Terraform 脚本对其进行配置。

Terraform 应用

销毁基础设施:基础设施达到使用寿命终点后,使用“terraform destroy”命令将其销毁。

地形改造摧毁

推送至 GitHub: Terraform 脚本经过测试和验证后,需要将其推送至 GitHub 仓库进行版本控制。这样可以确保对脚本所做的任何更改都能被跟踪,并在需要时可以回滚。使用的代码包括“git pull origin main”、“git add .”、“git commit -m '你的提交信息'”和“git push -u main”。

GitHub

包含 Terraform 文件的 GitHub 仓库链接在此

“terraform apply”完成后,创建的VPC、子网、路由表及其关联以及数据库实例如下图所示:

创建资源

创建资源 2

创建资源 3

Jenkins Pipeline:

我创建了一个名为“startup-terraform-cicd-pipeline”的流水线,勾选了Github项目框,然后粘贴了所用存储库的链接。

管道

然后我选择了构建触发器,这将实现基础设施集成和部署的自动化。Jenkins 会监控 GitHub 代码库的变更,并将提交到新构建中的所有更改应用到新构建中,并且这个过程会持续进行。

构建触发器

该流水线脚本包含 3 个阶段,构建过程在应用基础架构变更之前需要经历这 3 个阶段。这 3 个阶段分别是“git checkout”、“Terraform init”和“Terraform apply”。

管道脚本

应用并保存这些设置后,我运行了构建,下面显示了构建过程中各个阶段的屏幕截图:

完成

完成

资源已成功部署到 AWS 账户和选定的区域中,正如 Terraform 脚本中所配置的那样。

成功

资源

资源

结论:

总之,本项目包括使用 Terraform 创建高可用环境,为每个实例指定唯一名称,并在实例上安装 Apache。Terraform 脚本已上传至 GitHub 进行版本控制,并创建了一个 Jenkins 作业来自动检测 Terraform 脚本的更改并进行部署。

通过完成本项目,我展现了使用 Terraform 配置基础设施、在 GitHub 中进行版本控制以及使用 Jenkins 创建 CI/CD 流水线的技能。本项目提供了一个实际案例,展示了如何将这些工具结合使用,以简化部署流程,并确保初创公司基础设施的高可用性和可靠性。

文章来源:https://dev.to/aws-builders/provisioning-aws-infrastruct-using-terraform-and-jenkins-cicd-pgj