AWS CloudFormation 模板开发:编写 EC2+RDS+ELB 的一键部署模板(参数化配置)
·
以下是一个参数化的AWS CloudFormation模板,用于一键部署EC2实例、RDS数据库和ELB负载均衡器。模板采用YAML格式,包含完整的参数化配置和安全组设置:
AWSTemplateFormatVersion: '2010-09-09'
Description: 一键部署EC2+RDS+ELB架构
Parameters:
EnvironmentName:
Type: String
Description: 部署环境名称(如prod/dev)
Default: dev
EC2InstanceType:
Type: String
Description: EC2实例类型
Default: t3.micro
AllowedValues: [t2.micro, t3.micro, t3.small]
RDSEngine:
Type: String
Description: RDS数据库引擎
Default: mysql
AllowedValues: [mysql, postgres]
DBInstanceClass:
Type: String
Description: RDS实例类型
Default: db.t3.micro
DBName:
Type: String
Description: 初始数据库名称
Default: appdb
DBUser:
Type: String
Description: 数据库管理员用户名
NoEcho: true
DBPassword:
Type: String
Description: 数据库管理员密码
NoEcho: true
VPCID:
Type: AWS::EC2::VPC::Id
Description: 目标VPC ID
Subnets:
Type: List<AWS::EC2::Subnet::Id>
Description: 子网ID列表(至少2个)
Resources:
# 安全组配置
WebServerSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: EC2实例安全组
VpcId: !Ref VPCID
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
DBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: RDS数据库安全组
VpcId: !Ref VPCID
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
SourceSecurityGroupId: !GetAtt WebServerSG.GroupId
# EC2实例配置
WebServerInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref EC2InstanceType
ImageId: ami-0c55b159cbfafe1f0 # Amazon Linux 2 AMI
SecurityGroupIds:
- !Ref WebServerSG
SubnetId: !Select [0, !Ref Subnets]
UserData:
Fn::Base64: |
#!/bin/bash
yum update -y
yum install -y httpd mysql
systemctl start httpd
systemctl enable httpd
# RDS数据库配置
AppDatabase:
Type: AWS::RDS::DBInstance
Properties:
Engine: !Ref RDSEngine
DBInstanceClass: !Ref DBInstanceClass
DBName: !Ref DBName
MasterUsername: !Ref DBUser
MasterUserPassword: !Ref DBPassword
AllocatedStorage: 20
VPCSecurityGroups:
- !GetAtt DBSecurityGroup.GroupId
DBSubnetGroupName: !Ref DBSubnetGroup
DBSubnetGroup:
Type: AWS::RDS::DBSubnetGroup
Properties:
DBSubnetGroupDescription: 应用数据库子网组
SubnetIds: !Ref Subnets
# ELB负载均衡器配置
AppLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: !Sub ${EnvironmentName}-app-lb
Subnets: !Ref Subnets
SecurityGroups:
- !Ref WebServerSG
Scheme: internet-facing
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: !Sub ${EnvironmentName}-tg
Port: 80
Protocol: HTTP
VpcId: !Ref VPCID
Targets:
- Id: !Ref WebServerInstance
Port: 80
Listener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref TargetGroup
LoadBalancerArn: !Ref AppLoadBalancer
Port: 80
Protocol: HTTP
Outputs:
LoadBalancerDNS:
Description: 应用访问地址
Value: !GetAtt AppLoadBalancer.DNSName
DatabaseEndpoint:
Description: 数据库连接端点
Value: !GetAtt AppDatabase.Endpoint.Address
关键功能说明
-
参数化配置:
- 环境名称(
EnvironmentName) - EC2实例类型(
EC2InstanceType) - RDS数据库引擎(
RDSEngine) - 数据库凭证(
DBUser/DBPassword) - 网络配置(
VPCID/Subnets)
- 环境名称(
-
安全架构:
- EC2安全组仅开放HTTP(80)和SSH(22)端口
- RDS安全组仅允许EC2实例访问数据库端口
- 数据库密码通过
NoEcho参数隐藏
-
部署流程:
graph LR
A[启动模板] --> B[创建安全组]
B --> C[部署EC2实例]
B --> D[创建RDS子网组]
D --> E[部署RDS数据库]
C --> F[创建ELB负载均衡器]
E --> F
F --> G[输出访问端点]
部署步骤
- 保存为
infra-template.yml - 通过AWS控制台或CLI创建堆栈:
aws cloudformation create-stack \
--stack-name my-app-infra \
--template-body file://infra-template.yml \
--parameters \
ParameterKey=EnvironmentName,ParameterValue=prod \
ParameterKey=DBUser,ParameterValue=admin \
ParameterKey=DBPassword,ParameterValue='YourSecurePassword' \
ParameterKey=VPCID,ParameterValue=vpc-123456 \
ParameterKey=Subnets,ParameterValue='subnet-abc123\,subnet-xyz789'
- 部署完成后,在Outputs中获取:
- 应用访问地址(LoadBalancerDNS)
- 数据库连接端点(DatabaseEndpoint)
最佳实践建议:
- 生产环境建议启用RDS多AZ部署
- 添加Auto Scaling组实现EC2水平扩展
- 使用SSM参数存储管理数据库凭证
- 为ELB配置HTTPS监听器和ACM证书
更多推荐

所有评论(0)