前言
内容全部都为个人理解,不一定正确,如果你发现了文章中有存疑的地方或者你对某个地方有疑问,欢迎在评论区留言,大家一起学习。
题目
- 构建一个包含两个公有子网、两个私有子网的VPC,私有子网配置NAT,如图1所示。
- 构建一个简单的B/S架构的系统,Web Server部署在公有子网的实例上,数据库部署在私有子网的RDS上,如图1所示。(扩展要求)数据库具有高可用性。
准备工作
基础补习
先简单理解几个在AWS中比较重要的专有名词
- 区域 (Region) :
区域是AWS基础设施的物理位置,每个区域由一个或多个数据中心组成。AWS的全球基础设施分布在不同的区域,例如美国东部(弗吉尼亚)、亚太(东京)等。每个区域都是相对独立的,拥有自己的网络、电力供应等。 - 可用区 (Availability Zone) :
可用区是指在同一区域内的物理数据中心。AWS的每个区域由多个可用区组成,这些可用区之间通过低延迟网络连接。使用多个可用区可以提高应用程序的可靠性和容错性。 - VPC (Virtual Private Cloud) :
VPC是AWS提供的一种虚拟网络环境,允许您在AWS云中启动资源(如EC2实例)并控制这些资源之间的网络流量。您可以在VPC中定义子网、路由表、网络访问控制列表等。 - 子网 (Subnet) :
子网是VPC内的一个IP地址范围,用于将VPC划分为更小的部分。每个子网都关联一个可用区,并且您可以在子网级别配置路由表、安全组等。 - 互联网网关 (Internet Gateway) :
互联网网关是一种用于在VPC和Internet之间进行通信的AWS托管网关。它允许VPC中的资源与Internet之间进行通信,使您的实例能够访问Internet上的资源或者被Internet访问。 - NAT网关 (Network Address Translation Gateway) :
NAT网关允许私有子网中的实例访问Internet,同时阻止Internet访问这些实例。它充当了私有子网和Internet之间的中间人,为私有子网中的实例提供出站Internet访问。 - 安全组 (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
按照题目创建一个IPv4 CIDR:10.0.0.0/16的VPC
创建子网
先选择刚刚创建的VPC
添加4个子网,需要注意的是每个子网的可用区与 IPv4 VPC CIDR 块 ,按照题目,4个子网应该分配到2个可用区,我这里选择的是us-east-1a与us-east-1b。然后按照题目填好IPv4 VPC CIDR 块即可。
创建互联网网关
这个简单,填个标签即可。
创建NAT网关
我们按题目要求,分配到公网子网1中。并且分配一个弹性ip(这是一个扣费坑,上面我们说了NAT在角色扮演中充当的是守卫,是要收钱的。而且不止NAT会扣费,弹性ip也会扣,很坑吧,具体可以看后面的介绍)。
创建路由表
创建两个路由表,分别为公有子网的路由表、私有子网的路由表
配置路由表
先分别给公有路由表与私有路由表关联对应的子网
给公有路由表配置一条路由 打通子网与互联网网关的流量。让公有子网真正成为公有子网,
给私有路由表配置一条与NAT网关的路由,然后保存即可。
然后打开VPC页,可以查看到配置的VPC资源地图。这就是我们需要的VPC网络。
注意事项
NAT网关的扣费问题
因为NAT网关服务是会扣费的,并且NAT网关服务还需要扣一个弹性IP的费用,所以在不使用RDS服务的时候不建议开启。
我们可以在VPC控制面板中找到NAT网关与弹性IP服务,结束对应的服务。 然后在需要使用NAT网关的时候再重新开启一个,当然,到时候记得去改私有路由表的路由信息,把我们删掉的NAT网关改成新建的NAT网关 ,
创建与配置EC2
创建EC2
这里没有特别需求,使用默认的AWS发行的Amazon Linux就行
因为我需要在EC2上运行MySql与Spring Boot,为了避免后续内存不够的尴尬,实例类型我选择了2H2G的t3.small实例。实际上如果只是跑题目要求的简易项目,1h2g的t2.small实例即可,主要是MySql会吃IO,跑一点内存。
网络设置需要仔细编辑,VPC选择我们前面创建的,子网按照题目选择公有子网2,分配公有ip,创建一个安全组。
我这里设置开放3个端口,分别是22(ssh连接EC2实例需要使用)、3306(我本地连接EC2中搭建的数据库测试需要)、8989(我Spring项目的项目端口)。各位按照自己需求来,按需开放对应端口即可。
存储与高级详情信息默认即可,我们的题目基本不涉及。然后启动实例即可完成EC2的创建。
连接EC2
这里我使用的本地SSH连接,当然你也可以使用AWS提供的AWS Cloud9 Bash 终端连接EC2,我习惯用SSH而已。SSH使用的。
先打开我们的Learner Lab页面,下载账号对应的密钥PEM。
回到EC2页面,复制EC2的公有ip
打开FinalShell,新建一个SSH连接。
名称与备注随便填,主机填写EC2的公有IP,端口使用SSH默认的22端口(注意,前面新建EC2实例的时新建安全组的时候要开放了这个22端口)。方法选择公钥,因为Amazon Linux出于安全问题,禁止了直接使用root登录,所以我们这里的用户名填写ec2-user。密钥导入前面Learner Lab页面下载的密钥PEM。
双击我们创建的这个连接,即可连接上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的访问权限(非必须)
由于我需要在本地调试EC2的MySQL,所以我需要root用户能远程访问,就需要更改root的远程访问权限
设置mysql root账户远程访问权限_mysq中lroot远程访问没有权限-CSDN博客
安装JDK
在AWS EC2 上安装JDK_aws ec2 安装jdk-CSDN博客
我们完成这些命令即可,因为我使用的spring boot2项目,使用JDK8即可
ok,我们的EC2实例这就完成了创建与配置了。
创建AMI映像(非必须)
前面配置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的插件来直接打包,这里具体还得看自己的项目,选择对应的打包方式。
这里还有一个需要注意的点,由于我部署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控制台创建对应的子网组。需要注意的是子网选择私有子网,自己看CIDR 数据块判断即可
创建RDS数据库
新建RDS数据库,选择MySQL
引擎版本选择8.0以上的就行
可用性与持久性 按照题目要求选择 多可用区数据库实例
数据库设置,为了方便,我直接按我EC2上的MySQL来设置了。
实例类型,我那小项目基本不不需要m类最小的实例的2h8g这么高的配置,所以我选的t类
存储同理,最低的配置就行
连接配置,不需要ipv6,所以网络类型选IPv4,vpc选择我们创建的。子网组就选前面我们创建的,为了安全(题目要求),我们不公开数据库服务。
安全组前面没配,所以我们这里选择新建一个,后面再去配。RDS代理的话没必要,证书用默认的就行
记得关闭增强监控,文档要求关闭的。然后确定创建即可完成数据库的创建
修改RDS的安全组
进入我们创建的RDS服务,找到安全组规则,点击绑定的安全组
在入站规则那你会发现,源默认给设置了我们本地ip,这就会导致我们的EC2实例无法访问。
所以我们要新增一个入站规则,这里我们需要EC2访问RDS,所以我们把源设置为EC2绑定的安全组。
测试RDS与EC2的连接
打开我们的RDS服务,复制终端节点
SSH登录EC2,使用mysql -h 终端节点 -u root -p
登录,上面就是登录成功了
如果你登录是以上情况,那么就是前面安全组出问题了,EC2连接RDS超时了,建议看看前面的教程。
给RDS导入数据
这一步我就省略了,无非就运行sql语句。
创建RDS快照
上一步我们已经完成了RDS里面数据的导入,为了避免扣费我们一般都是使用的EC2
Web应用连接RDS
注意:前面我已经在EC2上连接了连接上数据库了,并且完成了数据的导入。那么就该给我们的Web项目完成相关的数据库源配置了。因为我使用的Spring boot2打包的项目,可以直接使用外置的配置文件来部署项目。所以我这里比较简单,只需要复制项目的yml文件,改相关配置即可。
复制终端节点
修改yml文件
上传到EC2
使用,java -jar fileName.jar --spring.config.location=ymlPath
运行即可
奇技淫巧
1.结束jar包运行,运行了jar包后,在项目内没结束进程,端口号就会一直被占用,你就没法再重新运行,只有结束了这个jar进程,端口才会释放出来。
netstat -lnp|grep 项目端口号
kill -9 jar进程号
2.新增一个Web应用的安全组端口,这样做的好处是可以区分我们项目的数据源。
比如我这里,平时实验,使用EC2里面的MySQL,那就用8989端口启动。需要答辩,要改用RDS,就使用9090端口启动。
18 条评论
vpc创建哪里用vpc等创建好像方便很多
vpc等是指?
如果是想方便,可以看一下附加分篇使用CloudFormation模板创建VPC
在创建vpc那,有创建vpc与创建vpc等两个选项
看了一下,的确会方便更多,感谢分享
牛!
666
潮永远滴神
拜师
66
不错哦
还得是你
还得是你😘
能说什么呢
拜师
大佬666
好用
看看,瞧一瞧