View a markdown version of this page

在 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 支援常見的合作夥伴解決方案,例如 Datadog、Splunk 和自訂 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_1 和 container_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 已安裝並設定最新版本的 。如需詳細資訊,請參閱 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. 建立名為「ecsInstanceRole」的 Amazon ECS 容器執行個體角色。如需詳細資訊,請參閱 Amazon ECS 容器執行個體 IAM 角色。

  2. 為命名為 fluentTaskRole 的 Fluent Bit 任務建立 IAM 角色。如需詳細資訊,請參閱Amazon ECS 任務 IAM 角色。

    在此 IAM 角色中授予的 IAM 許可是由任務容器承繼。為了允許 Fluent Bit 傳送日誌到 CloudWatch,您需要將下列許可附加到任務 IAM 角色。

    JSON
    { "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-bit 的 Overriding 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_template 和 log_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-task 或 start-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-task 或 start-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