首页 > 解决方案 > 将 Cloudwatch 日志流式传输到 Amazon ES

问题描述

我正在使用 Fargate 部署我的应用程序。为了记录容器日志,我将awslogs其用作日志驱动程序。现在我想将我的日志发送到 Amazon ES 服务。在浏览运输文档时,我遇到了一个提到

Streaming large amounts of CloudWatch Logs data to other
destinations might result in high usage charges. 

我想了解在将日志运送到 ELK 时我需要支付哪些费用?他们如何定义large amounts

我会被收费吗

a) 云观察?

b) 日志驱动程序?

c) Lambda 函数?每个日志行都会触发一个 lambda 函数吗?

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

标签: amazon-web-servicesamazon-cloudwatchelk

解决方案


就我个人而言,我会在你的应用程序旁边的另一个容器中运行 fluent 或 fluentbit https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch

您可以将日志直接发送到 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 。有关详细信息,请参阅自定义日志路由

请注意,log_routerFargate 需要容器,而 ECS 不需要。

这是我所知道的最便宜的解决方案,它不涉及 Cloudwatch、Lamdas、Kinesis。


推荐阅读