前言

由于实验是布置下来的个人实验,请勿直接抄袭,我这里写实操只是为了记录我的学习历程,与分享我的实验经验。

内容全部都为个人理解,不一定正确,如果你发现了文章中有存疑的地方或者你对某个地方有疑问,欢迎在评论区留言,大家一起学习。

部分常见问题可以访问下面这个文章

题目

  1. 构建一个包含两个公有子网、两个私有子网的VPC,私有子网配置NAT,如图1所示。
  2. 构建一个简单的B/S架构的系统,Web Server部署在公有子网的实例上,数据库部署在私有子网的RDS上,如图1所示。(扩展要求)数据库具有高可用性。
    题目一框架要求

准备工作

基础补习

先简单理解几个在AWS中比较重要的专有名词

  1. 区域 (Region) :
    区域是AWS基础设施的物理位置,每个区域由一个或多个数据中心组成。AWS的全球基础设施分布在不同的区域,例如美国东部(弗吉尼亚)、亚太(东京)等。每个区域都是相对独立的,拥有自己的网络、电力供应等。
  2. 可用区 (Availability Zone) :
    可用区是指在同一区域内的物理数据中心。AWS的每个区域由多个可用区组成,这些可用区之间通过低延迟网络连接。使用多个可用区可以提高应用程序的可靠性和容错性。
  3. VPC (Virtual Private Cloud) :
    VPC是AWS提供的一种虚拟网络环境,允许您在AWS云中启动资源(如EC2实例)并控制这些资源之间的网络流量。您可以在VPC中定义子网、路由表、网络访问控制列表等。
  4. 子网 (Subnet) :
    子网是VPC内的一个IP地址范围,用于将VPC划分为更小的部分。每个子网都关联一个可用区,并且您可以在子网级别配置路由表、安全组等。
  5. 互联网网关 (Internet Gateway) :
    互联网网关是一种用于在VPC和Internet之间进行通信的AWS托管网关。它允许VPC中的资源与Internet之间进行通信,使您的实例能够访问Internet上的资源或者被Internet访问。
  6. NAT网关 (Network Address Translation Gateway) :
    NAT网关允许私有子网中的实例访问Internet,同时阻止Internet访问这些实例。它充当了私有子网和Internet之间的中间人,为私有子网中的实例提供出站Internet访问。
  7. 安全组 (Security Group) :
    安全组是一种虚拟防火墙,用于控制实例的入站和出站流量。您可以配置安全组以允许或拒绝特定类型的流量,并将安全组应用于一个或多个实例。安全组是在实例级别工作的。

仔细阅读以上GPT给出的解释,相信能给你留下点基础的认识。

题目解析

这个题目的意思就是:定义一个VPC包含两个可用区,两个可用区中分别定义公有、私有子网,公有子网部署Web服务器,私有子网部署数据库。(没错,这是废话,看图一眼就能看出来。但你为什么还是觉得似懂非懂的不会操作呢?不妨看看下面几个问题)
1.什么是公有子网,什么是私有子网?
2.为什么web服务器放公有子网上,而RDS数据库放私有子网呢?
3.题目中不是说私有子网配置NAT吗?为什么NAT网关要放在公有子网1上?
关于问题1、2,继续引用GPT的回答:
公有子网是与互联网网关直接关联的子网。实例在公有子网中可以直接与Internet通信,可以拥有公共IP地址,也可以通过路由表配置访问Internet的权限。通常用于托管公共面向Internet的应用程序或服务。
私有子网是没有直接与Internet通信能力的子网。实例在私有子网中无法直接访问Internet,需要通过NAT网关或跳板主机等中间设备才能访问Internet或被Internet访问。私有子网通常用于托管内部应用程序或服务,需要保持相对隔离和安全性
这里也说一下我的理解:在整个VPC中,能被互联网访问的区域(子网)属于公有子网,而不直接对外开放访问的就是私有子网。而子网怎么才能对外开放访问,成为这个VPC的公有子网呢?那就是连接绑定了这个VPC的互联网网关,那么不连接互联网网关的就是私有子网了。
问题3就有意思了,是题目错了吗?
不是的,题目讲的是给私有子网配置NAT,而不是在私有子网上部署NAT,那为什么NAT网关要放在公有子网1上呢?这就与这里NAT网关的作用有关了,上面提到,私有子网之所以是私有子网,是因为私有子网没有连接互联网网关,那如果我私有子网里的实例需要访问互联网呢?
那么就需要一个中间件的存在,让私有子网的实例能访问互联网,所以作为这个中间件的NAT,其就得放在公有子网。
所以有思路把上面的这个网络配置出来了吗?是不是还是云里雾里?
那是因为我们都忽略了一个东西——路由表。我们上面说的都是子网会与网关相连,公有子网连接互联网网关,私有子网连接NAT网关,那这之间是用什么来连接呢?答案就是路由表,它定义着我们子网、网关之间的流量流向,从而实现流量的定向流动。
搞懂了上面这些问题,我们可以用角色扮演来更方便理解题目,在一个城堡(VPC)里面,有皇宫(私有子网),有可供活动的城区(公有子网),城堡通过大门(互联网网关)与外面相连,大门有路(路由表)连接城区,城区上会游走着保卫(NAT网关),只有通过保卫懂得怎么走(路由表)到皇宫。所以NAT是需要收费的(/滑稽)。

实操

由于实验是布置下来的个人实验,请勿直接抄袭,我这里写实操只是为了记录我的学习历程,与分享我的实验经验。

实现思路

在一个城堡(VPC)里面,有皇宫(私有子网),有可供活动的城区(公有子网),城堡通过大门(互联网网关)与外面相连,大门有路(路由表)连接城区,城区上会游走着保卫(NAT网关),只有通过保卫懂得怎么走(路由表)到皇宫

根据这个角色扮演,我们可以知道题目要我们干什么了。那么怎么做呢?

我的思路是:创建并配置VPC->创建并配置EC2->部署Web应用->连接RDS数据库

创建并配置VPC

创建VPC

VPC设置

按照题目创建一个IPv4 CIDR:10.0.0.0/16的VPC

创建子网

创建子网-VPC选择

先选择刚刚创建的VPC

创建子网-子网1

创建子网-子网2

创建子网-子网3

创建子网-子网4

添加4个子网,需要注意的是每个子网的可用区IPv4 VPC CIDR 块 ,按照题目,4个子网应该分配到2个可用区,我这里选择的是us-east-1a与us-east-1b。然后按照题目填好IPv4 VPC CIDR 块即可。

创建互联网网关

创建互联网网关

这个简单,填个标签即可。

创建NAT网关

创建NAT网关

我们按题目要求,分配到公网子网1中。并且分配一个弹性ip(这是一个扣费坑,上面我们说了NAT在角色扮演中充当的是守卫,是要收钱的。而且不止NAT会扣费,弹性ip也会扣,很坑吧,具体可以看后面的介绍)。

创建路由表

创建公有路由表

创建私有路由表

创建两个路由表,分别为公有子网的路由表、私有子网的路由表

配置路由表

公有路由表关联公有子网

私有路由表关联私有子网

先分别给公有路由表与私有路由表关联对应的子网

公有路由表设置互联网网关路由

给公有路由表配置一条路由 打通子网与互联网网关的流量。让公有子网真正成为公有子网,

私有路由表设置NAT网关路由

给私有路由表配置一条与NAT网关的路由,然后保存即可。

私有子网资源地图

公有子网资源地图

然后打开VPC页,可以查看到配置的VPC资源地图。这就是我们需要的VPC网络。

注意事项

NAT网关的扣费问题

AWS关于NAT网关的定价

AWS关于公有IP的定价

因为NAT网关服务是会扣费的,并且NAT网关服务还需要扣一个弹性IP的费用,所以在不使用RDS服务的时候不建议开启。

删除NAT网关

释放弹性IP

我们可以在VPC控制面板中找到NAT网关与弹性IP服务,结束对应的服务。 然后在需要使用NAT网关的时候再重新开启一个,当然,到时候记得去改私有路由表的路由信息,把我们删掉的NAT网关改成新建的NAT网关

创建与配置EC2

创建EC2

创建EC2-映像选择

这里没有特别需求,使用默认的AWS发行的Amazon Linux就行

创建EC2-实例选择

因为我需要在EC2上运行MySql与Spring Boot,为了避免后续内存不够的尴尬,实例类型我选择了2H2G的t3.small实例。实际上如果只是跑题目要求的简易项目,1h2g的t2.small实例即可,主要是MySql会吃IO,跑一点内存。

创建EC2-网络设置

网络设置需要仔细编辑,VPC选择我们前面创建的,子网按照题目选择公有子网2,分配公有ip,创建一个安全组。

创建EC2-定义安全组

我这里设置开放3个端口,分别是22(ssh连接EC2实例需要使用)、3306(我本地连接EC2中搭建的数据库测试需要)、8989(我Spring项目的项目端口)。各位按照自己需求来,按需开放对应端口即可。

创建EC2-配置存储

存储与高级详情信息默认即可,我们的题目基本不涉及。然后启动实例即可完成EC2的创建。

连接EC2

这里我使用的本地SSH连接,当然你也可以使用AWS提供的AWS Cloud9 Bash 终端连接EC2,我习惯用SSH而已。SSH使用的。

Learner Lab页面

先打开我们的Learner Lab页面,下载账号对应的密钥PEM。

EC2页面

回到EC2页面,复制EC2的公有ip

FinalShell新建SSH连接

打开FinalShell,新建一个SSH连接。

SSH设置

名称与备注随便填,主机填写EC2的公有IP,端口使用SSH默认的22端口(注意,前面新建EC2实例的时新建安全组的时候要开放了这个22端口)。方法选择公钥,因为Amazon Linux出于安全问题,禁止了直接使用root登录,所以我们这里的用户名填写ec2-user。密钥导入前面Learner Lab页面下载的密钥PEM。

FinalShell连接管理器

SSH成功登录EC2

双击我们创建的这个连接,即可连接上EC2.

配置EC2环境

因为AWS的RDS服务是需要扣费,在日常实验中我们可以选择在EC2中搭建一个MySQL项目供我们的项目使用,而我使用的B/S架构项目是由Spring Boot项目,所以还需要安装对应的JDK,如果你使用的SSM项目,那么你还需要在EC2上安装Tomcat。但我使用的是Spring Boot项目,仅用到MySQL与JDK,所以下面的步骤仅包含这两者的安装。

安装MySQL

这里直接贴对应的教程

在 Amazon Linux 2023 上安装 MySQL 8 服务器和客户端 - 知乎 (zhihu.com)

要注意的地方是

步骤2:下载MySQL Yum仓库,不要使用wget来下载MySQL的YUM仓库,我们使用以下命令

sudo yum install https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm

步骤5:保护MySQL安装,我的选择如下图,你可以自己翻译自行选择

MySQL安装选择

更改MySQL的访问权限(非必须)

由于我需要在本地调试EC2的MySQL,所以我需要root用户能远程访问,就需要更改root的远程访问权限

设置mysql root账户远程访问权限_mysq中lroot远程访问没有权限-CSDN博客

安装JDK

在AWS EC2 上安装JDK_aws ec2 安装jdk-CSDN博客

安装JDK的命令

我们完成这些命令即可,因为我使用的spring boot2项目,使用JDK8即可

EC2中JDK版本

ok,我们的EC2实例这就完成了创建与配置了。

创建AMI映像(非必须)

前面配置EC2的环境是不是挺复制和麻烦?为了避免环境丢失、奔溃或者失效,我建议应该创建一个映像来保存我们好不容易配置好的EC2环境。

创建EC2实例映像

创建EC2实例映像

选择我们的EC2实例,创建映像即可,这样就保存了一份纯净的MySQL+JDK环境的AMI了,后面就不用害怕后续EC2误删或者EC2中的环境出问题。

部署Web应用

由于我使用Spring boot2打包的工程,所以这里我的部署就比较简单了。只需要把项目打包成jar上传到EC2中,java -jar filename.jar运行即可。下面的步骤不一定适合全部人,具体按照自己的项目来确定打包方式,我仅演示我的项目如何打包。

配置文件

先打开项目的配置文件,检查mybatis的相关配置对不对,比如url上的host是否为localhost、连接的数据库EC2上是否存在(我测试项目的时候已经给EC2里面的MySQL加上了我的数据库awsdemo)、配置中的密码对否与EC2上MySQL的密码一致。

打包项目

打开项目的pom.xml文件看看依赖是否已经完成导入,然后打开右侧导航栏打开Meven页,先点一下依赖刷新,然后运行clean,运行完点package打包项目为jar包。这里要注意,我的项目为Spring Boot2的项目,所以可以直接使用Spring Boot的插件来直接打包,这里具体还得看自己的项目,选择对应的打包方式。

过期的EC2 SSH配置

重启后EC2的公有IP发生变化

右键相应连接修改EC2信息

修改EC2主机host

这里还有一个需要注意的点,由于我部署Web应用之前曾经停止过EC2实例,重启后EC2的公有IP是有可能变化的,所以在SSH连接EC2之前最好去看看EC2的公有IP是否有变化。

上传项目包

上传项目的jar包

成功运行项目包

使用java -jar filename.jar运行jar项目

浏览器访问项目地址

所以ip:prot访问项目,成功渲染数据,即完成web应用的部署。

连接RDS数据库

上面我们部署的项目使用的数据源是EC2中的MySQL,按照题目,我们需要把数据源改成AWS的RDS服务。

创建RDS子网组

RDS子网组页面

创建RDS子网组-子网组设置

创建RDS子网组-添加子网

按照题目,我们的RDS需要部署在两个不同可用区的私有子网上,所以我们先在RDS控制台创建对应的子网组。需要注意的是子网选择私有子网,自己看CIDR 数据块判断即可

创建RDS数据库

创建RDS数据库-引擎选择

新建RDS数据库,选择MySQL

创建RDS数据库-版本选择

引擎版本选择8.0以上的就行

创建RDS数据库-部署选择

可用性与持久性 按照题目要求选择 多可用区数据库实例

创建RDS数据库-数据库设置

数据库设置,为了方便,我直接按我EC2上的MySQL来设置了。

创建RDS数据库-实例选择

实例类型,我那小项目基本不不需要m类最小的实例的2h8g这么高的配置,所以我选的t类

创建RDS数据库-存储设置

存储同理,最低的配置就行

创建RDS数据库-网络配置

连接配置,不需要ipv6,所以网络类型选IPv4,vpc选择我们创建的。子网组就选前面我们创建的,为了安全(题目要求),我们不公开数据库服务。

创建RDS数据库-新增安全组

安全组前面没配,所以我们这里选择新建一个,后面再去配。RDS代理的话没必要,证书用默认的就行

创建RDS数据库-增强监控

记得关闭增强监控,文档要求关闭的。然后确定创建即可完成数据库的创建

修改RDS的安全组

选择RDS实例

选择安全组

进入我们创建的RDS服务,找到安全组规则,点击绑定的安全组

安全组入站规则

在入站规则那你会发现,源默认给设置了我们本地ip,这就会导致我们的EC2实例无法访问。

新增安全组规则

所以我们要新增一个入站规则,这里我们需要EC2访问RDS,所以我们把源设置为EC2绑定的安全组。

测试RDS与EC2的连接

RDS实例详情

打开我们的RDS服务,复制终端节点

成功登录RDS的MySQL

SSH登录EC2,使用mysql -h 终端节点 -u root -p登录,上面就是登录成功了

MySQL登录失败

如果你登录是以上情况,那么就是前面安全组出问题了,EC2连接RDS超时了,建议看看前面的教程。

给RDS导入数据

这一步我就省略了,无非就运行sql语句。

创建RDS快照

上一步我们已经完成了RDS里面数据的导入,为了避免扣费我们一般都是使用的EC2

Web应用连接RDS

注意:前面我已经在EC2上连接了连接上数据库了,并且完成了数据的导入。那么就该给我们的Web项目完成相关的数据库源配置了。因为我使用的Spring boot2打包的项目,可以直接使用外置的配置文件来部署项目。所以我这里比较简单,只需要复制项目的yml文件,改相关配置即可。

RDS实例详情

复制终端节点

修改配置文件

修改yml文件

EC2文件页面

上传到EC2

项目成功运行

使用,java -jar fileName.jar --spring.config.location=ymlPath运行即可

奇技淫巧

1.结束jar包运行,运行了jar包后,在项目内没结束进程,端口号就会一直被占用,你就没法再重新运行,只有结束了这个jar进程,端口才会释放出来。

根据端口查询jar运行的进程号并且结束相关进程

netstat -lnp|grep 项目端口号
kill -9 jar进程号

2.新增一个Web应用的安全组端口,这样做的好处是可以区分我们项目的数据源。

EC2实例相关的安全组

比如我这里,平时实验,使用EC2里面的MySQL,那就用8989端口启动。需要答辩,要改用RDS,就使用9090端口启动。

最后修改:2024 年 05 月 09 日
如果觉得我的文章对你有用,请随意赞赏