25-6-19-云计算复习13

## ✅ 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),这很不安全,易受攻击并且容易产生高昂计费。

~  ~  The   End  ~  ~


 赏 
感谢您的支持,我会继续努力哒!
支付宝收款码
tips
文章二维码 分类标签:归档TypechoAutoUpload
文章标题:25-6-19-云计算复习13
文章链接:https://www.fangshaonian.cn/archives/101/
最后编辑:2025 年 11 月 10 日 18:31 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
(*) 4 + 6 =
快来做第一个评论的人吧~