在 Amazon ECS Windows 容器上部署 Fluent Bit - Amazon Elastic Container Service

在 Amazon ECS Windows 容器上部署 Fluent Bit

Fluent Bit 是一种快速灵活的日志处理器和路由器,受各种操作系统支持。它可以用来将日志路由到不同的 AWS 目的地,例如 Amazon CloudWatch Logs、Firehose Amazon S3 和 Amazon OpenSearch Service。Fluent Bit 支持常见的合作伙伴解决方案,例如 DatadogSplunk 和自定义 HTTP 服务器。有关 Fluent Bit 的更多信息,请参阅 Fluent Bit 网站。

为了获得高可用性,大多数区域的 Amazon ECR 公共图库和 Amazon ECR 存储库上的 Amazon ECR 都提供了 AWS for Fluent Bit 映像。有关更多信息,请参阅 GitHub 网站上的 aws-for-fluent-bit

本教程介绍如何在 Amazon ECS 中运行的 Windows 实例上部署 Fluent Bit 容器,以便将 Windows 任务生成的日志流式传输到 Amazon CloudWatch 进行集中记录。

本教程使用以下方法:

  • Fluent Bit 使用进程守护程序计划策略作为服务运行。此策略可确保 Fluent Bit 的单个实例始终在集群中的容器实例上运行。

    • 使用正向输入插件侦听端口 24224。

    • 向主机公开端口 24224,这样 Docker 运行时就可以使用这个公开的端口向 Fluent Bit 发送日志。

    • 具有允许 Fluent Bit 将日志记录发送到指定目标的配置。

  • 使用 fluentd 日志记录驱动程序启动所有其他 Amazon ECS 任务容器。有关更多信息,请参阅 Docker 文档网站上的 Fluentd 日志记录驱动程序

    • Docker 连接到主机命名空间内本地主机上的 TCP 套接字 24224。

    • Amazon ECS 代理向容器添加标签,其中包括集群名称、任务定义系列名称、任务定义修订版号、任务 ARN 和容器名称。使用 fluentd Docker 日志记录驱动程序的标签选项将相同的信息添加到日志记录中。有关更多信息,请参阅 Docker 文档网站上的标签、labels-regex、env 和 env-regex

    • 由于 fluentd 日志记录驱动程序的 async 选项设置为 true,因此当重新启动 Fluent Bit 容器时,Docker 会缓冲日志,直到 Fluent Bit 容器重新启动。您可以通过设置 fluentd-bufffer-limit 选项来增加缓冲区限制。有关更多信息,请参阅 Docker 文档网站上的 fluentd-buffer-limit

工作流程如下:

  • Fluent Bit 容器启动并侦听向主机公开的端口 24224。

  • Fluent Bit 使用其任务定义中指定的任务 IAM 角色凭证。

  • 在同一实例上启动的其他任务使用 fluentd Docker 日志记录驱动程序连接到端口 24224 上的 Fluent Bit 容器。

  • 当应用程序容器生成日志时,Docker 运行时会标记这些记录,添加标签中指定的其他元数据,然后将它们转发到主机命名空间中的端口 24224。

  • Fluent Bit 在端口 24224 上接收日志记录,因为它向主机命名空间公开。

  • Fluent Bit 执行其内部处理并按照指定路由日志。

本教程使用默认 CloudWatch Fluent Bit 配置,该配置执行以下操作:

  • 为每个集群和任务定义系列创建新的日志组。

  • 每当启动新任务时,都会为上面生成的日志组中的每个任务容器创建新的日志流。每个流都将标有容器所属的任务 ID。

  • 在每个日志条目中添加其他元数据,包括集群名称、任务 ARN、任务容器名称、任务定义系列和任务定义修订版号。

    例如,如果 task_1 包含 container_1container_2ask_2 包含 container_3,则以下是 CloudWatch 日志流:

    • /aws/ecs/windows.ecs_task_1

      task-out.TASK_ID.container_1

      task-out.TASK_ID.container_2

    • /aws/ecs/windows.ecs_task_2

      task-out.TASK_ID.container_3

先决条件

本教程假设以下先决条件已完成:

  • 安装并配置了最新版本的 AWS CLI。有关更多信息,请参阅 Installing or updating to the latest version of the AWS CLI

  • aws-for-fluent-bit 容器映像可用于以下 Windows 操作系统:

    • Windows Server 2019 Core

    • Windows Server 2019 Full

    • Windows Server 2022 Core

    • Windows Server 2022 Full

  • 设置以使用 Amazon ECS 中的步骤已完成。

  • 您有一个集群。在本教程中,集群名称为 FluentBit-cluster

  • 您有一个带有公有子网的 VPC,将在该子网中启动 EC2 实例。您可以使用您的原定设置 VPC。您也可以使用允许 Amazon CloudWatch 端点到达子网的私有子网。有关 Amazon CloudWatch 端点的更多信息,请参阅 AWS 一般参考 中的 Amazon CloudWatch 端点和配额。有关如何使用 Amazon VPC 向导创建 VPC 的信息,请参阅 创建 Virtual Private Cloud

步骤 1:创建 IAM 访问角色

创建 Amazon ECS IAM 角色。

  1. 创建名为“ecsInstanceRol”的 Amazon ECS 容器实例角色。有关更多信息,请参阅 Amazon ECS 容器实例 IAM 角色

  2. 为名为 fluentTaskRole 的 Fluent Bit 任务创建一个 IAM 角色。有关更多信息,请参阅 Amazon ECS 任务 IAM 角色

    在此 IAM 角色中被授予的 IAM 权限由任务容器承担。为了允许 Fluent Bit 向 CloudWatch 发送日志,您需要为任务 IAM 角色附加以下权限。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource": "*" } ] }
  3. 将 策略附加到该角色。

    1. 将上述内容保存在名为 fluent-bit-policy.json 的文件中。

    2. 运行以下命令将内联策略附加到 fluentTaskRole IAM 角色。

      aws iam put-role-policy --role-name fluentTaskRole --policy-name fluentTaskPolicy --policy-document file://fluent-bit-policy.json

步骤 2:创建 Amazon ECS Windows 容器实例

创建 Amazon ECS Windows 容器实例。

创建 Amazon ECS 实例
  1. 使用 aws ssm get-parameters 命令检索托管您 VPC 的区域的 AMI ID。有关更多信息,请参阅检索经 Amazon ECS 优化的 AMI 元数据

  2. 用来创建启动实例的 Amazon EC2 控制台。

    1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

    2. 从导航栏中,选择要使用的区域。

    3. EC2 控制面板中,选择 Launch Instance(启动实例)。

    4. 对于 Name (名称),输入唯一的名称。

    5. 对于 Application and OS Images (Amazon Machine Image)(应用程序和操作系统映像 [Amazon 系统映像]),选择您在第一步中检索的 AMI。

    6. 对于实例类型,选择 t3.xlarge

    7. 对于 Key pair (login)(密钥对 [登录]),选择一个密钥对。

    8. Network settings(网络设置)下,对于 Security group(安全组),可以选择现有安全组或创建新安全组。

    9. Network settings(网络设置)下,对于 Auto-assign Public IP(自动分配公有 IP),选择 Enable(启用)。

    10. Advanced details(高级详细信息)下,对于 IAM instance profile(IAM 实例配置文件),选择 ecsInstanceRole

    11. 使用以下用户数据配置您的 Amazon ECS 容器实例。在 Advanced Details(高级详细信息)下,将以下脚本粘贴到 User data(用户数据)字段中,将 cluster_name 替换为您的集群的名称。

      <powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster cluster-name -EnableTaskENI -EnableTaskIAMRole -LoggingDrivers '["awslogs","fluentd"]' </powershell>
    12. 准备好后,选中确认字段,然后选择 Launch Instances

    13. 确认页面会让您知道自己的实例已启动。选择 View Instances 以关闭确认页面并返回控制台。

步骤 3:配置 Fluent Bit

您可以使用 AWS 提供的以下默认配置快速入门:

或者,您可以使用 AWS 提供的其他默认配置。有关更多信息,请参阅 Github 网站上关于 aws-for-fluent-bit覆盖 Windows 映像的入口点

Amazon CloudWatch Fluent Bit 的默认配置如下所示。

替换以下变量:

  • region,用您要将 Amazon CloudWatch Logs 发送到的区域替换。

[SERVICE] Flush 5 Log_Level info Daemon off [INPUT] Name forward Listen 0.0.0.0 Port 24224 Buffer_Chunk_Size 1M Buffer_Max_Size 6M Tag_Prefix ecs. # Amazon ECS agent adds the following log keys as labels to the docker container. # We would use fluentd logging driver to add these to log record while sending it to Fluent Bit. [FILTER] Name modify Match ecs.* Rename com.amazonaws.ecs.cluster ecs_cluster Rename com.amazonaws.ecs.container-name ecs_container_name Rename com.amazonaws.ecs.task-arn ecs_task_arn Rename com.amazonaws.ecs.task-definition-family ecs_task_definition_family Rename com.amazonaws.ecs.task-definition-version ecs_task_definition_version [FILTER] Name rewrite_tag Match ecs.* Rule $ecs_task_arn ^([a-z-:0-9]+)/([a-zA-Z0-9-_]+)/([a-z0-9]+)$ out.$3.$ecs_container_name false Emitter_Name re_emitted [OUTPUT] Name cloudwatch_logs Match out.* region region log_group_name fallback-group log_group_template /aws/ecs/$ecs_cluster.$ecs_task_definition_family log_stream_prefix task- auto_create_group On

进入 Fluent Bit 的每个日志都有您指定的标签,或者在您不提供标签时自动生成。标签可用于将不同的日志路由到不同的目标。有关更多信息,请参阅《Fluent Bit 官方手册》中的标签

上面描述的 Fluent Bit 配置具有以下属性:

  • 正向输入插件侦听 TCP 端口 24224 上的传入流量。

  • 在该端口上收到的每个日志条目都有一个标签,正向输入插件会修改该标签,以将 ecs. 字符串作为记录的前缀。

  • Fluent Bit 内部管道使用 Match 正则表达式路由日志条目以修改筛选条件。此筛选条件将日志记录 JSON 中的密钥替换为 Fluent Bit 可以使用的格式。

  • 然后,rewrite_tag 筛选条件会使用修改后的日志条目。此筛选条件将日志记录的标签更改为格式 out.TASK_ID.CONTAINER_NAME

  • 新标签将路由到输出 cloudwatch_logs 插件,该插件使用 CloudWatch 输出插件的 log_group_templatelog_stream_prefix 选项创建如前所述的日志组和流。有关更多信息,请参阅《Fluent Bit 官方手册》中的配置参数

步骤 4:注册 Windows Fluent Bit 任务定义,该定义将日志路由到 CloudWatch

注册 Windows Fluent Bit 任务定义,该定义将日志路由到 CloudWatch。

注意

此任务定义将 Fluent Bit 容器端口 24224 向主机端口 24224 公开。确认此端口未在您的 EC2 实例安全组中打开,以防止外部访问。

注册任务定义
  1. 使用以下内容创建名为 fluent-bit.json 的文件。

    替换以下变量:

    • 用您的任务 IAM 角色的 Amazon 资源名称(ARN)替换 task-iam-role

    • 用您的任务运行所在的区域替换 region

    { "family": "ecs-windows-fluent-bit", "taskRoleArn": "task-iam-role", "containerDefinitions": [ { "name": "fluent-bit", "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:windowsservercore-latest", "cpu": 512, "portMappings": [ { "hostPort": 24224, "containerPort": 24224, "protocol": "tcp" } ], "entryPoint": [ "Powershell", "-Command" ], "command": [ "C:\\entrypoint.ps1 -ConfigFile C:\\ecs_windows_forward_daemon\\cloudwatch.conf" ], "environment": [ { "name": "AWS_REGION", "value": "region" } ], "memory": 512, "essential": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/fluent-bit-logs", "awslogs-region": "region", "awslogs-stream-prefix": "flb", "awslogs-create-group": "true" } } } ], "memory": "512", "cpu": "512" }
  2. 运行以下命令注册任务定义。

    aws ecs register-task-definition --cli-input-json file://fluent-bit.json --region region

    您可以通过运行 list-task-definitions 命令列出您的账户的任务定义。输出显示了可以与 run-taskstart-task 一起使用的系列和修订版本值。

步骤 5:使用进程守护程序计划策略将 ecs-windows-fluent-bit 任务定义作为 Amazon ECS 服务运行

为您的账户注册任务定义后,您可以在集群中运行任务。在本教程中,您将在 FluentBit-cluster 集群中运行 ecs-windows-fluent-bit:1 任务定义的一个实例。在使用进程守护程序计划策略的服务中运行任务,该策略可确保 Fluent Bit 的单个实例始终在每个容器实例上运行。

运行任务
  1. 运行以下命令将 ecs-windows-fluent-bit:1 任务定义(在上一步中注册)作为服务启动。

    注意

    此任务定义使用 awslogs 日志记录驱动程序,您的容器实例需要具有必要的权限。

    替换以下变量:

    • 用您的服务运行所在的区域替换 region

    aws ecs create-service \ --cluster FluentBit-cluster \ --service-name FluentBitForwardDaemonService \ --task-definition ecs-windows-fluent-bit:1 \ --launch-type EC2 \ --scheduling-strategy DAEMON \ --region region
  2. 运行以下命令列出您的任务。

    替换以下变量:

    • 用您的服务任务运行所在的区域替换 region

    aws ecs list-tasks --cluster FluentBit-cluster --region region

步骤 6:注册生成日志的 Windows 任务定义

注册生成日志的任务定义。此任务定义部署 Windows 容器映像,该映像将每秒向 stdout 写入一个增量数字。

任务定义使用 fluentd 日志记录驱动程序,该驱动程序连接到 Fluent Bit 插件侦听的端口 24224。Amazon ECS 代理使用标签标记每个 Amazon ECS 容器,包括集群名称、任务 ARN、任务定义系列名称、任务定义修订版号和任务容器名称。这些键值标签将传递给 Fluent Bit。

注意

此任务使用 default 网络模式。但是,您还可以使用 awsvpc 网络模式运行任务。

注册任务定义
  1. 使用以下内容创建名为 windows-app-task.json 的文件。

    { "family": "windows-app-task", "containerDefinitions": [ { "name": "sample-container", "image": "mcr.microsoft.com/windows/servercore:ltsc2019", "cpu": 512, "memory": 512, "essential": true, "entryPoint": [ "Powershell", "-Command" ], "command": [ "$count=1;while(1) { Write-Host $count; sleep 1; $count=$count+1;}" ], "logConfiguration": { "logDriver": "fluentd", "options": { "fluentd-address": "localhost:24224", "tag": "{{ index .ContainerLabels \"com.amazonaws.ecs.task-definition-family\" }}", "fluentd-async": "true", "labels": "com.amazonaws.ecs.cluster,com.amazonaws.ecs.container-name,com.amazonaws.ecs.task-arn,com.amazonaws.ecs.task-definition-family,com.amazonaws.ecs.task-definition-version" } } } ], "memory": "512", "cpu": "512" }
  2. 运行以下命令注册任务定义。

    替换以下变量:

    • 用您的任务运行所在的区域替换 region

    aws ecs register-task-definition --cli-input-json file://windows-app-task.json --region region

    您可以通过运行 list-task-definitions 命令列出您的账户的任务定义。输出显示了可以与 run-taskstart-task 一起使用的系列和修订版本值。

步骤 7:运行 windows-app-task 任务定义

注册 windows-app-task 任务定义后,在 FluentBit-cluster 集群中运行。

运行任务
  1. 运行您在上一步中注册的 windows-app-task:1 任务定义。

    替换以下变量:

    • 用您的任务运行所在的区域替换 region

    aws ecs run-task --cluster FluentBit-cluster --task-definition windows-app-task:1 --count 2 --region region
  2. 运行以下命令列出您的任务。

    aws ecs list-tasks --cluster FluentBit-cluster

步骤 8:验证 CloudWatch 上的日志

要验证您的 Fluent Bit 设置,请在 CloudWatch 控制台中检查以下日志组:

  • /ecs/fluent-bit-logs — 这是与在容器实例上运行的 Fluent Bit 进程守护程序容器相对应的日志组。

  • /aws/ecs/FluentBit-cluster.windows-app-task — 这是与 FluentBit-cluster 集群中为 windows-app-task 任务定义系列启动的所有任务相对应的日志组。

    task-out.FIRST_TASK_ID.sample-container — 此日志流包含示例容器任务容器中任务的第一个实例生成的所有日志。

    task-out.SECOND_TASK_ID.sample-container — 此日志流包含示例容器任务容器中任务的第二个实例生成的所有日志。

task-out.TASK_ID.sample-container 日志流具有类似于以下内容的字段:

{ "source": "stdout", "ecs_task_arn": "arn:aws:ecs:region:0123456789012:task/FluentBit-cluster/13EXAMPLE", "container_name": "/ecs-windows-app-task-1-sample-container-cEXAMPLE", "ecs_cluster": "FluentBit-cluster", "ecs_container_name": "sample-container", "ecs_task_definition_version": "1", "container_id": "61f5e6EXAMPLE", "log": "10", "ecs_task_definition_family": "windows-app-task" }
验证 Fluent Bit 设置
  1. 通过 https://console.aws.amazon.com/cloudwatch/ 打开 CloudWatch 控制台。

  2. 在导航窗格中,选择 Log groups(日志组)。确保您位于将 Fluent Bit 部署到您的容器的区域中。

    在 AWS 区域 的日志组列表中,您将会看到以下内容:

    • /ecs/fluent-bit-logs

    • /aws/ecs/FluentBit-cluster.windows-app-task

    如果看到这些日志组,则代表 Fluent Bit 设置已验证。

步骤 9:清除

完成本教程后,请清除与本教程关联的资源,以避免对您未使用的资源产生费用。

清除教程资源
  1. 停止 windows-simple-task 任务和 ecs-fluent-bit 任务。有关更多信息,请参阅 停止 Amazon ECS 任务

  2. 运行以下命令删除 /ecs/fluent-bit-logs 日志组。有关删除日志组的更多信息,请参阅《AWS Command Line Interface 参考》中的 delete-log-group

    aws logs delete-log-group --log-group-name /ecs/fluent-bit-logs aws logs delete-log-group --log-group-name /aws/ecs/FluentBit-cluster.windows-app-task
  3. 运行以下命令终止实例。

    aws ec2 terminate-instances --instance-ids instance-id
  4. 运行以下命令删除 IAM 角色。

    aws iam delete-role --role-name ecsInstanceRole aws iam delete-role --role-name fluentTaskRole
  5. 运行以下命令删除 Amazon ECS 集群。

    aws ecs delete-cluster --cluster FluentBit-cluster