将Cloudwatch日志流式传输到Amazon ES

时间:2020-04-11 15:08:53

标签: amazon-web-services amazon-cloudwatch elk

我正在使用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函数吗?

最后,还有可能进一步降低成本吗?

2 个答案:

答案 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函数。

演示中的图片(请参见触发器)

enter image description here

  • 还有可能进一步降低成本吗?

降低成本的唯一方法(使用此实现时)是编写自己的lambda函数,该函数每隔X秒\分钟触发一次,并插入并登录到ES。 据我所知,成本差距将毫无意义。

更多信息:

Lambda code

How this is working behind the scenes