通过CloudFormation部署CloudWatch告警遇默认VPC缺失及配置问题求助
嘿,我来帮你搞定这两个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

