以下是一个参数化的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

关键功能说明

  1. 参数化配置:

    • 环境名称(EnvironmentName)
    • EC2实例类型(EC2InstanceType)
    • RDS数据库引擎(RDSEngine)
    • 数据库凭证(DBUser/DBPassword)
    • 网络配置(VPCID/Subnets)
  2. 安全架构:

    • EC2安全组仅开放HTTP(80)和SSH(22)端口
    • RDS安全组仅允许EC2实例访问数据库端口
    • 数据库密码通过NoEcho参数隐藏
  3. 部署流程:

graph LR
    A[启动模板] --> B[创建安全组]
    B --> C[部署EC2实例]
    B --> D[创建RDS子网组]
    D --> E[部署RDS数据库]
    C --> F[创建ELB负载均衡器]
    E --> F
    F --> G[输出访问端点]

部署步骤

  1. 保存为infra-template.yml
  2. 通过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'

  1. 部署完成后,在Outputs中获取:
    • 应用访问地址(LoadBalancerDNS)
    • 数据库连接端点(DatabaseEndpoint)

最佳实践建议:

  1. 生产环境建议启用RDS多AZ部署
  2. 添加Auto Scaling组实现EC2水平扩展
  3. 使用SSM参数存储管理数据库凭证
  4. 为ELB配置HTTPS监听器和ACM证书

更多推荐