25-6-19-云计算复习13
本文最后由方少年更新于2025 年 11 月 10 日,已超过20天没有更新。如果文章内容或图片资源失效,请留言反馈,将会及时处理,谢谢!
## ✅ CloudFormation 模拟题(二)
------
### 📘 场景设定:
你正在审阅以下 CloudFormation 模板片段,用于部署一个典型的三层架构网络环境,其中包含用于公网访问的 BastionHost 和部署在私有子网中的应用服务器。
```yaml
Parameters:
KeyName:
Type: AWS::EC2::KeyPair::KeyName
Default: mykey
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.20.0.0/16
IGW:
Type: AWS::EC2::InternetGateway
VPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref IGW
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.20.1.0/24
MapPublicIpOnLaunch: true
PrivateSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.20.2.0/24
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
PublicRoute:
Type: AWS::EC2::Route
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref IGW
PublicSubnetAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicRouteTable
EIP:
Type: AWS::EC2::EIP
NATGateway:
Type: AWS::EC2::NatGateway
Properties:
SubnetId: !Ref PublicSubnet
AllocationId: !GetAtt EIP.AllocationId
PrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
PrivateRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PrivateRouteTable
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NATGateway
PrivateSubnetAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet
RouteTableId: !Ref PrivateRouteTable
BastionSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow SSH from anywhere
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
AppSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow SSH from Bastion
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
SourceSecurityGroupId: !Ref BastionSG
BastionHost:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
SubnetId: !Ref PublicSubnet
KeyName: !Ref KeyName
SecurityGroupIds:
- !Ref BastionSG
ImageId: ami-0c101f26f147fa7fd
AppServer:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
SubnetId: !Ref PrivateSubnet
KeyName: !Ref KeyName
SecurityGroupIds:
- !Ref AppSG
ImageId: ami-0c101f26f147fa7fd
```
------
## 💬 问题(满分 15 分)
------
### **1. [2 分]**
这段模板创建了几个 EC2 实例?分别部署在哪个子网中?是否可以从公网直接访问它们?
2个实例,BastionHost在PublicSubnet中,AppServer在PrivateSubnet中。
BastionHost:可以,因为其子网是PublicSubnet,在这个子网中有MapPublicIpOnLaunch: true,表示分配ip。并且这个实例在vpc下,vpc连接了aws的IGW,因此公网可以通过PublicSubnet的分配ip进行访问。
AppServer:不可以,因为其子网PrivateSubnet没有分配ip地址。
------
### **2. [3 分]**
解释为什么 NAT 网关必须部署在 PublicSubnet 中?该 NAT 网关是否具备公网 IP?
因为NAT网关需要对外连接,根据设计,PublicSubnet 是对外连接并分配了一个ip地址的,而PrivateSubnet没有ip地址。
具备公网ip,因为其设置中有AllocationId: !GetAtt EIP.AllocationId,分配了ip。
------
### **3. [3 分]**
AppServer 是否可以访问互联网(如执行 yum/apt 命令)?请说明理由,并指出实现机制。
可以访问互联网。因为它绑定了PrivateSubnet子网,子网的PrivateRoute连接了NATGateway并且它们都在一个vpc中。因此,AppServer可以在PrivateSubnet中通过NATGateway再通过IGW进行出站访问,可以访问外网,但是外网无法访问AppServer。
------
### **4. [2 分]**
是否可以从 BastionHost SSH 登录到 AppServer?为什么?
可以,因为BastionHost和AppServer在同一个vpc下,并且AppServer的安全组是AppSG,允许BastionSG的实例入站,而BastionHost SS在BastionSG中,因此可以通过vpc进行访问。
------
### **5. [3 分]**
> 假设现在需要让公网用户通过 HTTP(端口 80)访问 AppServer,你需要修改哪些配置?简要说明。
>
> 首先需要用户的ip地址,然后在AppServer的安全组AppSG中添加80http和用户对应ip地址的入站规则,然后给PrivateSubnet分配ip地址。这样用户可以通过PrivateSubnet的ip对应访问。
你的思路是**通过直接给 PrivateSubnet 分配 IP 并开放端口**,这在 AWS 实践中不可行:
- ❌ **私有子网无法自动分配公网 IP**,即使你“手动配置”,也不是推荐做法
- ❌ AWS 不支持一个实例绑定多个子网
- ✅ 正确做法应是:使用负载均衡(ALB)部署在 PublicSubnet,转发到 AppServer
❗️**扣 2 分,给 1 分鼓励表达思路**
✅ **得分:1 / 3**
------
### **6. [2 分]**
指出模板中存在的一个潜在安全风险,并提出改进建议。
安全组BastionSG的入站规则是所有ip(0.0.0.0/0),这很不安全,易受攻击并且容易产生高昂计费。
文章标题:25-6-19-云计算复习13
文章链接:https://www.fangshaonian.cn/archives/101/
最后编辑:2025 年 11 月 10 日 18:31 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)