将 Cloudwatch 日志流式传输到 Amazon ES

Streaming Cloudwatch Logs to Amazon ES

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

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

就我个人而言,我会在您的应用程序旁边的另一个容器中查看 运行 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。

与所有资源一样,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 seconds\minutes 触发一次并插入到日志中到 ES。 据我所知,成本差距将毫无意义。

更多信息:

Lambda code .

.