我在 AWS Elastic Beanstalk 中部署了一个 PHP Laravel Worker,并希望将
/var/app/current/storage/logs/*.log
流式传输到 CloudWatch。然而,我遇到的解决方案要么适用于 Forge 部署,要么适用于普通 EC2 实例。
非常感谢在此事上的任何帮助。
您需要按照此处所述配置 CloudWatch 代理:
我认为logs.config应该看起来像这样
option_settings:
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: StreamLogs
value: true
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: DeleteOnTerminate
value: false
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: RetentionInDays
value: 7
packages:
yum:
awslogs: []
files:
"/etc/awslogs/awscli.conf" :
mode: "000600"
owner: root
group: root
content: |
[plugins]
cwlogs = cwlogs
[default]
region = `{"Ref":"AWS::Region"}`
"/etc/awslogs/awslogs.conf" :
mode: "000600"
owner: root
group: root
content: |
[general]
state_file = /var/lib/awslogs/agent-state
"/etc/awslogs/config/logs.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/app/current/storage/logs]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/app/current/storage/logs"]]}`
log_stream_name = {instance_id}
file = /var/app/current/storage/logs/*.log
commands:
"01":
command: chkconfig awslogs on
"02":
command: service awslogs restart
请参阅您的 ec2 实例上的 /var/log/awslogs.log 进行故障排除。
我使用 Amazon Linux 2023 Elastic Beanstalk 平台以不同的方式实现了这一目标,因为他们的文档建议使用平台挂钩而不是 .ebextensions
您需要在 CloudWatch 中创建一个 LogGroup,并首先授予您的 ElasticBeanstalk EC2 服务角色对其进行写入的权限。提供的默认角色仅具有写入前缀为
/aws/elasticbeanstalk
的 LogGroup 的权限。因此,您要创建的示例 LogGroup 名称可以是 /aws/elasticbeanstalk/app
。
.platform/files/app_log.json
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/app/current/storage/logs/*.log",
"log_group_name": "/aws/elasticbeanstalk/app",
"log_stream_name": "{instance_id}_current"
},
{
"file_path": "/var/app/staging/storage/logs/*.log",
"log_group_name": "/aws/elasticbeanstalk/app",
"log_stream_name": "{instance_id}_staging"
}
]
}
}
}
}
.platform/hooks/predeploy/configure-cloudwatch.sh
#!/bin/sh
cp .platform/files/app_log.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/laravel.json
systemctl restart amazon-cloudwatch-agent.service