【问题标题】:Streaming Cloudwatch Logs to Amazon ES将 Cloudwatch 日志流式传输到 Amazon ES
【发布时间】:2020-07-24 07:19:15
【问题描述】:

我正在使用 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) 云观察?

b) 日志驱动程序?

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

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

【问题讨论】:

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


    【解决方案1】:

    就我个人而言,我会在你的应用程序旁边的另一个容器中运行 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。更多信息,请参考Custom Log Routing

    请注意,在 Fargate 的情况下需要 log_router 容器,但在 ECS 的情况下不需要。

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

    【讨论】:

    【解决方案2】:

    与所有资源一样,AWS 会收取使用费和维护费。因此,费用将用于执行 lambda 函数并将数据存储在 CloudWatch 中。他们提到的原因是:Streaming large amounts of CloudWatch Logs data to other destinations might result in high usage charges. 是因为 lambda 函数处理日志并将其插入 ES 需要时间,当您尝试流式传输大量日志时,lambda 函数将执行更长的时间。

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

      是的,当启用从 CloudWatch 到 ES 的流式传输时,插入到 CloudWatch 的每个日志都会触发 lambda 函数。

    演示图片(见触发器):

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

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

    更多信息:

    Lambda code .

    How this is working behind the scenes .

    【讨论】:

    • 使用github.com/aws-samples/amazon-ecs-firelens-examples/blob/master/… 怎么样??与涉及 cloudwatch、lambdas 和 kinesis 的流数据相比,它会不会更便宜?非常感谢您的想法!
    • 我没有尝试过,但如果它有效,成本会非常小。你能分享更多关于你的架构的信息吗?
    • 我已经发布了答案。请看一看。它不涉及 Cloudwatch、Kinesis/Lambdas。
    • @PythonEnthusiast 很好,在我遇到这个问题的时候,这是唯一的解决方案。感谢您与我们分享这个。
    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 2018-03-13
    • 2017-09-30
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多