我正在使用Fargate部署我的应用程序。要记录容器日志,我使用awslogs
作为日志驱动程序。现在,我想将日志发送到Amazon ES服务。在通过docs进行运输时,我遇到了一条注释,上面提到
Streaming large amounts of CloudWatch Logs data to other
destinations might result in high usage charges.
我想了解将日志运送到ELK时需要支付的全部费用吗?他们如何定义large amounts
?
我会被收取
a)Cloudwatch?
b)日志驱动程序?
c)Lambda函数?每个日志行都会触发lambda函数吗?
最后,还有可能进一步降低成本吗?
答案 0 :(得分:3)
我个人看起来会在应用程序https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch旁边的另一个容器中运行fluent或fluentbit。
您可以直接将日志发送到ES,而无需任何CloudWatch费用。
编辑
这是最终的解决方案,以防万一有人在寻找更便宜的解决方案。
在应用程序旁边的另一个容器中运行Fluentd / Fuentbit
使用Github Config,我可以使用以下配置将日志转发到ES。
{
"family": "workflow",
"cpu": "256",
"memory": "512",
"containerDefinitions": [
{
"name": "log_router",
"image": "docker.io/amazon/aws-for-fluent-bit:latest",
"essential": true,
"firelensConfiguration": {
"type": "fluentbit",
"options":{
"enable-ecs-log-metadata":"true"
}
},
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-create-group": "true",
"awslogs-group": "your_log_group",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
},
"memoryReservation": 50
},
{
"name": "ContainerName",
"image": "YourImage",
"cpu": 0,
"memoryReservation": 128,
"portMappings": [
{
"containerPort": 5005,
"protocol": "tcp"
}
],
"essential": true,
"command": [
"YOUR COMMAND"
],
"environment": [],
"logConfiguration": {
"logDriver": "awsfirelens",
"secretOptions": [],
"options": {
"Name": "es",
"Host": "YOUR_ES_DOMAIN_URL",
"Port": "443",
"tls": "On",
"Index": "INDEX_NAME",
"Type": "TYPE"
}
},
"resourceRequirements": []
}
]
}
log_router
容器收集日志并将其发送到ES。有关更多信息,请参见Custom Log Routing
请注意,对于Fargate,log_router
容器是必需的,但对于ECS则不是。
这是我所知道的最便宜的解决方案,它不涉及Cloudwatch,Lamdas,Kinesis。
答案 1 :(得分:0)
与每种资源一样,AWS收取使用和维护费用。因此,这些费用将用于执行lambda函数以及将数据存储在CloudWatch中。他们提到的原因是:1
是因为lambda函数需要一些时间来处理日志并将其插入ES,当您尝试流式传输大量日志时,lambda函数将执行更长的时间
Lambda函数?每个日志行都会触发lambda函数吗?
是的,当启用从CloudWatch到ES的流传输时,插入到CloudWatch的每个日志都会触发lambda函数。
演示中的图片(请参见触发器)
降低成本的唯一方法(使用此实现时)是编写自己的lambda函数,该函数每隔X秒\分钟触发一次,并插入并登录到ES。 据我所知,成本差距将毫无意义。
更多信息: