You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过CloudFormation部署CloudWatch告警遇默认VPC缺失及配置问题求助

解决CloudFormation部署CloudWatch告警及EC2实例的两个问题

嘿,我来帮你搞定这两个CloudFormation部署时遇到的坑!下面分问题给你详细的解决方案:

问题一:「WebServerHost No default VPC for this user」报错

这个报错的原因很直接:你的AWS账户里没有默认VPC了(可能之前被手动删除),而CloudFormation里的EC2实例如果没指定具体的VPC和子网,会默认尝试使用默认VPC,找不到就会抛这个错。

有两种解决方式,推荐第二种更规范的:

方式1:重建默认VPC

如果你确实需要默认VPC,可以去AWS控制台的VPC服务里,找到「Actions」→「Create Default VPC」,等待创建完成后重新部署模板就行。不过这种方式适合测试环境,生产环境更推荐手动指定VPC资源。

方式2:在模板中明确指定VPC和子网

修改你的WebServerHost资源,加上Properties字段,指定你已有的子网ID和安全组ID。同时,你可以在模板里直接定义安全组(允许HTTP等必要访问),示例代码如下:

# 先定义一个安全组,允许HTTP访问和SSH(如果需要)
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Allow HTTP access and SSH for web server
    VpcId: !Ref YourExistingVpcId  # 替换成你的VPC ID
    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  # 生产环境建议替换成你的IP段

# 修改后的WebServerHost资源
WebServerHost:
  Type: AWS::EC2::Instance
  Properties:
    InstanceType: t2.micro  # 根据你的需求选择实例类型
    ImageId: ami-0c55b159cbfafe1f0  # 示例:Amazon Linux 2的AMI,替换成你区域的正确AMI ID
    SubnetId: !Ref YourExistingSubnetId  # 替换成你的子网ID
    SecurityGroupIds:
      - !Ref WebServerSecurityGroup
    IamInstanceProfile: !Ref WebServerHostInstanceProfile  # 后面会用到这个,用于CloudWatch日志权限
  Metadata:
    Comment: Install a simple PHP application
    AWS::CloudFormation::Init:
      config:
        # 下面是你原来的配置内容

问题二:WebServerHost资源的CloudWatch Logs配置困难

从你贴的代码来看,主要是CloudWatch Logs代理(awslogs)的配置没补全,我帮你把完整的配置补上,一步步来:

1. 安装必要的软件包

首先要确保安装awslogs(CloudWatch Logs代理),在packages.yum里加上它:

packages:
  yum:
    httpd: []
    php: []
    awslogs: []  # 新增:安装CloudWatch日志代理

2. 补全Apache访问日志的CloudWatch配置文件

把你截断的/tmp/cwlogs/apacheaccess.conf补全,指定日志文件路径、日志组名等:

files:
  "/tmp/cwlogs/apacheaccess.conf":
    content: !Sub |
      [general]
      state_file = /var/awslogs/agent-state
      
      # 配置Apache访问日志
      [/var/log/httpd/access_log]
      file = /var/log/httpd/access_log
      log_group_name = ${AWS::StackName}-apache-access
      log_stream_name = {instance_id}
      datetime_format = %d/%b/%Y:%H:%M:%S %z
      
      # 如果需要监控错误日志,可以再加一个配置块
      [/var/log/httpd/error_log]
      file = /var/log/httpd/error_log
      log_group_name = ${AWS::StackName}-apache-error
      log_stream_name = {instance_id}

3. 配置awslogs主配置文件

创建或修改/etc/awslogs/awslogs.conf,指定AWS区域并包含刚才的自定义配置:

files:
  "/etc/awslogs/awslogs.conf":
    content: !Sub |
      [plugins]
      cwlogs = cwlogs
      
      [default]
      region = ${AWS::Region}
      
      # 包含自定义的日志配置文件
      include /tmp/cwlogs/*.conf

4. 启动并设置服务自启

确保httpd和awslogs服务启动,并且开机自动运行:

services:
  sysvinit:
    httpd:
      enabled: true
      ensureRunning: true
    awslogs:
      enabled: true
      ensureRunning: true

5. 给EC2实例赋予CloudWatch日志权限

EC2实例需要IAM权限才能把日志发送到CloudWatch,所以要创建一个IAM角色和实例配置文件:

# 创建IAM角色,允许EC2实例访问CloudWatch Logs
WebServerHostRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Principal:
            Service: ec2.amazonaws.com
          Action: sts:AssumeRole
    ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforCloudWatchLogs

# 创建实例配置文件,关联上面的角色
WebServerHostInstanceProfile:
  Type: AWS::IAM::InstanceProfile
  Properties:
    Roles:
      - !Ref WebServerHostRole

最后,把这个实例配置文件关联到你的WebServerHost实例(就是前面问题一解决方案里的IamInstanceProfile字段)。

这样调整后,你的模板应该就能正常部署EC2实例并配置CloudWatch日志了!

内容的提问来源于stack exchange,提问作者RedXIII

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:33:12