博客/工程

Loki教程:如何从亚马逊的ECS发送日志到Loki

2020年8月6日6分钟

弹性货柜服务(ECS)是Amazon提供的完全托管容器编排服务。结合FargateAmazon为容器提供的无服务器计算引擎,您可以运行容器工作负载,而无需配置自己的计算资源。

但是如何整合和查询这些工作负载的所有日志和元数据呢?洛基,Grafana实验室的日志聚合系统已经证明bob电竞频道提高性能而且降低成本

在本教程中,您将学习如何利用Firelens,一个AWS日志路由器,将您的日志和工作负载元数据转发到一个洛基实例。

因此,你将能够在一个地方查询所有日志使用Grafana

对于使用Promtail代理,查看我以前的教程如何设置Promtail在一个AWS EC2实例或onAWS的

这篇博文将涵盖:

需求

在我们开始之前,你需要:

  • AWS CLI配置(运行aws配置).
  • 已经配置了Loki数据源的Grafana实例。
  • VPC中与internet路由可达的子网。(遵循这些指令如果你需要创建一个。)
  • 一个安全组为您的容器选择。(遵循这些指令如果你需要创建一个。)

为了简单起见,我们将使用Grafana Cloud Loki和Grafana实例(您可以获得30天的免费试用)格拉夫纳云洛基),但是如果你在运行自己的开源版本的Loki和Grafana实例,所有的步骤都是一样的。

设置ECS集群

要使用ECS运行容器,您需要一个ECS集群.我们将使用Fargate集群,但如果您更喜欢使用EC2集群,所有给定的步骤仍然适用。

让我们用awscli创建集群:

Aws ecs create-cluster——cluster-name ecs-firelens-cluster

我们还需要一个IAM运行容器的角色因此,让我们创建一个新的并授权ECS认可这个角色。

你可能已经有了这个ecsTaskExecutionRole您的AWS帐户中的角色。如果是这种情况,您可以跳过这一步。

Curl https://raw.githubusercontent.com/grafana/loki/master/docs/aws/ecs/ecs-role.json > ecs-role。//ecs-role. json aws iam create-role——role-name ecs- executionrole——假设-role-policy-document文件json {"Role": {"Path": "/", "RoleName": " ecaskexecutionrole ", "RoleId": "AROA5FW5RZWLXFPU656SQ", "Arn": "Arn:aws:iam::0000000000: Role / ecaskexecutionrole ", "CreateDate": "2020-07-09T14:51:49+00:00", " becomerolepolicydocument ": {"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Principal": {"Service": ["ecs-tasks.amazonaws.com"]}, "Action": "sts: autherole "}]}}}}

注意在攻击关于这个新角色;我们稍后将使用它来创建一个ECS任务。

最后我们会给出ECS任务执行策略AmazonECSTaskExecutionRolePolicy)到已创建的角色。这将允许我们使用Firelens

“arn:aws:iam::aws:policy/service-role/ amazonecaskexecutionrolepolicy”

创建任务定义

亚马逊Firelens日志路由器(通常fluentdfluentbit)在应用程序容器旁边运行相同的任务定义,将它们的日志路由到Loki。

在本例中,我们将使用fluentbit(洛基插件安装),但如果你喜欢fluentd一定要检查文档

我们建议您使用fluentbit因为它使用的资源比fluentd

我们的任务定义将由两个容器组成Firelens日志路由器发送日志到Loki (log_router)和一个示例应用程序来生成日志(样本应用).

让我们下载任务定义,然后浏览最重要的部分。

Curl https://raw.githubusercontent.com/grafana/loki/master/docs/aws/ecs/ecs-task.json > ecs-task.json
{"essential": true, "image": "grafana/ fluentbit -plugin-loki:1.5.0-amd64", "name": "log_router", "firelensConfiguration": {"type": "fluentbit", "options": {"enable-ecs-log-metadata": "true"}}, "logConfiguration": {"logDriver": " awlogs ", "options": {"awslogs-group": "firelens-container", "awslogs-region": "us-east-2", "awslogs-create-group": "true", "awslogs-stream-prefix": "firelens"}}, "memoryReservation": 50},

log_router容器图像是Loki docker图像其中包含预安装的Loki插件。如你所见,firelensConfiguration类型设置为fluentbit我们还添加了选项启用ECS日志元数据。这将是有用的查询您的日志与洛基LogQL标签匹配器。

logConfiguration主要用于调试fluentbit容器,但在完成测试和配置后,可以随意删除该部分。

{"command": ["/bin/sh -c \"while true;echo hello_world;done\""], "entryPoint": ["sh","-c"], "essential": true, "image": "alpine:3.12", "logConfiguration": {"logDriver": "awsfirelens", "options": {"Name": " grafancloud apikey>@logs-prod-us-central1.grafana.net/loki/api/v1/push", "Labels": "{job=\"firelens\"}", "RemoveKeys": "container_id,ecs_task_arn", "LabelKeys": "container_name,ecs_task_definition,source,ecs_cluster", "LineFormat": "key_value"}}, "Name": " example -app"}

第二个容器是样本应用,一个简单的高山打印到标准输出欢迎消息的容器。为了将这些日志发送给Loki,我们将配置此容器以使用日志驱动程序awsfirelens

继续并替换Url你的财产GrafanaCloud凭证。你可以在你的账户在Loki实例页面。如果你正在运行你自己的Loki实例,完全替换URL(例如http://my-loki.com:3100/loki/api/v1/push).

所有选项logConfiguration会自动翻译成fluentbit输出.例如,上述选项将产生此流畅位输出配置部分:

[OUTPUT] Name loki Match awsfirelens* Url https://:@logs-prod-us-central1.grafana.net/loki/api/v1/push Labels {job="firelens"} RemoveKeys container_id,ecs_task_arn LabelKeys container_name,ecs_task_definition,source,ecs_cluster LineFormat key_value

输出Config将日志转发到GrafanaCloud洛基。要了解有关这些选项的更多信息,请务必阅读洛基输出的文档.我们保留了一些有趣而有用的标签,比如container_nameecs_task_definition而且ecs_cluster,但您可以静态地通过标签选择。

如果要在任务中运行多个容器,所有容器都需要一个logConfiguration部分。这使您有机会根据容器添加不同的标签。

{"containerDefinitions":[…], "cpu": "256", "executionRoleArn": "arn:aws:iam::00000000:role/ lecaskexecutionrole ", "family": "loki-fargate-task-definition", "memory": "512", "networkMode": "awsvpc", " requirescompatiments ": ["FARGATE"]}

最后,您需要替换executionRoleArn在攻击我们创造的角色第一部分

一旦你完成了任务定义的编辑,我们可以运行下面的命令来创建任务:

Aws ecs register-task-definition——region us-east-2——cli-input-json文件://ecs-task.json

现在让我们创建并启动一个服务。

运行您的服务

要运行服务,您需要提供任务定义名称loki-fargate-task-definition: 1哪个是任务族加任务修正的组合:1.您还需要自己的子网和安全组。你可以分别替换子网- 306 ca97d而且sg-02c489bbdeffdca1d在下面的命令中启动你的服务:

aws ecs create-service——cluster ecs-firelens-cluster \——service-name firelens-loki-fargate \——task-definition loki-fargate-task-definition:1 \——want -count 1——region us-east-2——launch-type "FARGATE" \——network-configuration "awsvpcConfiguration={subnets=[subnet-306ca97d],securityGroups=[sg-02c489bbdeffdca1d],assignPublicIp=ENABLED}"

确保公众(assignPublicIp)启用,否则ECS将无法连接到Internet,您将无法提取外部docker映像。

现在可以访问ECS控制台,应该可以看到任务正在运行。现在让我们打开Grafana并使用Loki数据源来探索我们的任务日志。输入查询{工作= " firelens "}你应该看看我们的样本应用日志显示如下所示:

洛基教程:从ECS发送日志到洛基
洛基教程:从ECS发送日志到洛基

使用日志标签下拉菜单,您应该能够通过ECS元数据发现您的工作负载,如果展开日志行,也可以看到它。

就是这样!一定要看看LogQL了解更多关于强大的Loki查询语言。