在 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 網站。

AWS for Fluent Bit 映像在大多數區域的 Amazon ECR Public Gallery 和 Amazon ECR 儲存庫的 Amazon ECR 上可用以提供高可用性。如需詳細資訊,請參閱 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 logging driver (Fluentd 日誌記錄驅動程式)。

    • Docker 連線到主機命名空間內 localhost 上的 TCP 通訊端 24224。

    • Amazon ECS 代理程式會將標籤新增至容器,其中包括叢集名稱、任務定義系列名稱、任務定義修訂版編號、任務 ARN 和容器名稱。使用 Fluentd Docker 日誌記錄驅動程式的標籤選項將相同的資訊新增到日誌記錄中。如需詳細資訊,請參閱 Docker 文件網站上的 labels、labels-regex、env 和 env-regex

    • 由於 Fluentd 日誌記錄驅動程式的 async 選項設定為 true,當 Fluent Bit 容器重新啟動時,Docker 會緩衝日誌,直到 Fluent Bit 容器重新啟動為止。您可以透過設定 fluentd-buffer-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_2,而 ask_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

注意

您可以使用雙堆疊服務端點,透過 IPv4 和 IPv6 AWS CLI從 、 SDKs 和 Amazon ECS API 與 Amazon ECS 互動。如需詳細資訊,請參閱使用 Amazon ECS 雙堆疊端點

先決條件

本教學課程假設已完成下列先決條件:

  • AWS CLI 已安裝並設定最新版本的 。如需詳細資訊,請參閱安裝或更新至最新版本的 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. 建立名為「ecsInstanceRole」的 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. 前往 https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

    2. 從導覽列中選取要使用的「區域」。

    3. EC2 儀表板中,選擇 Launch instance (啟動執行個體)。

    4. Name (名稱) 輸入唯一的名稱。

    5. Application and OS Images (Amazon Machine Image) (應用程式和作業系統映像 (Amazon Machine Image)) 欄位中,選擇您在步驟 1 中擷取的 AMI。

    6. 對於 Instance type (執行個體類型),選擇 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. 準備就緒後,請選取 acknowledgment (確認) 欄位,再選擇 Launch Instances (啟動執行個體)。

    13. 會有確認頁面讓您知道您的執行個體正在啟動。選擇 View Instances (檢視執行個體) 關閉確認頁面並返回主控台。

步驟 3:設定 Fluent Bit

您可以使用 提供的下列預設組態 AWS 來快速開始使用:

或者,您可以使用 提供的其他預設組態 AWS。如需詳細資訊,請參閱 Github 網站上有關 aws-for-fluent-bitOverriding the entrypoint for the Windows image (覆寫 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 內部管道會路由日誌項目,以使用符合規則運算式修改篩選條件。此篩選條件將日誌記錄 JSON 中的金鑰替換為 Fluent Bit 可以使用的格式。

  • 然後,rewrite_tag 篩選條件會使用修改後的日誌項目。此篩選條件會將日誌記錄的標籤變更為格式輸出 TASK_ID.CONTAINER_NAME

  • 新標籤將路由至輸出 cloudwatch_logs 外掛程式,該外掛程式會使用 CloudWatch 輸出外掛程式的 log_group_templatelog_stream_prefix 選項來建立前文所述的日誌群組和串流。如需其他資訊,請參閱《Fluent Bit 官方手冊》中的組態參數

步驟 4:註冊會將日誌路由到 CloudWatch 的 Windows Fluent Bit 任務定義

註冊會將日誌路由到 CloudWatch 的 Windows Fluent Bit 任務定義。

注意

此任務定義會將 Fluent Bit 容器連接埠 24224 公開至主機連接埠 24224。確認此連接埠未在 EC2 執行個體安全群組中開啟,防止從外部存取。

註冊任務定義
  1. 使用下列內容建立名為 fluent-bit.json 的檔案。

    取代下列變數:

    • task-iam-role 替代為任務 IAM 角色的 Amazon Resource Name (ARN)

    • 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:使用常駐程式排程策略以 Amazon ECS 服務形式執行 ecs-windows-fluent-bit 任務定義

註冊帳戶的任務定義後,您就可以在叢集中執行任務。在本教學課程中,您會在 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 寫入一個遞增數字。

任務定義會使用連線到 Fluent Bit 外掛程式接聽連接埠 24224 的 Fluentd 日誌記錄驅動程式。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 – 此日誌串流包含 sample-container 任務容器中由任務的第一個執行個體產生的所有日誌。

    task-out.SECOND_TASK_ID.sample-container – 此日誌串流包含 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