本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon ECS Windows 容器上部署 Fluent Bit
Fluent Bit 是一種快速靈活的日誌處理器和路由器,支援各種作業系統。它可用來將日誌路由到各種 AWS 目的地,例如 Amazon CloudWatch Logs、Firehose Amazon S3 和 Amazon OpenSearch Service。Fluent Bit 支援常見的合作夥伴解決方案,例如 Datadog
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_1task-out.TASK_ID.container_1task-out.TASK_ID.container_2
- 
                    /aws/ecs/windows.ecs_task_2task-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 角色。
- 
                建立名為「ecsInstanceRole」的 Amazon ECS 容器執行個體角色。如需詳細資訊,請參閱 Amazon ECS 容器執行個體 IAM 角色。 
- 
                為命名為 fluentTaskRole的 Fluent Bit 任務建立 IAM 角色。如需詳細資訊,請參閱Amazon ECS 任務 IAM 角色。在此 IAM 角色中授予的 IAM 許可是由任務容器承繼。為了允許 Fluent Bit 傳送日誌到 CloudWatch,您需要將下列許可附加到任務 IAM 角色。 
- 
                將政策連接到角色。 - 
                        將上述內容儲存在名為 fluent-bit-policy.json的檔案中。
- 
                        執行下列命令,將內嵌政策附加到 fluentTaskRoleIAM 角色。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 執行個體
- 
                使用 aws ssm get-parameters命令擷取託管 VPC 的區域 AMI ID。如需詳細資訊,請參閱擷取 Amazon ECS 最佳化 AMI 中繼資料。
- 
                使用 Amazon EC2 主控台來啟動執行個體。 - 前往 https://console.aws.amazon.com/ec2/ - 開啟 Amazon EC2 主控台。 
- 
                        從導覽列中選取要使用的「區域」。 
- 
                        在 EC2 儀表板中,選擇 Launch instance (啟動執行個體)。 
- 
                        在 Name (名稱) 輸入唯一的名稱。 
- 
                        在 Application and OS Images (Amazon Machine Image) (應用程式和作業系統映像 (Amazon Machine Image)) 欄位中,選擇您在步驟 1 中擷取的 AMI。 
- 
                        對於 Instance type (執行個體類型),選擇 t3.xlarge。
- 
                        在 Key pair (login) (金鑰對 (登入)) 欄位中,選擇一個金鑰對。 
- 
                        在 Network settings (網路設定) 下的 Security group (安全群組) 欄位中,選擇一個現有的安全群組,或建立一個新的安全群組。 
- 
                        在 Network settings (網路設定) 下的 Auto-assign Public IP (自動指派公有 IP) 欄位中,選取 Enable (啟用)。 
- 
                        在 Advanced details (進階詳細資料) 下的 IAM instance profile (IAM 執行個體設定檔) 欄位中,選擇 ecsInstanceRole。 
- 
                        利用下列使用者資料設定您的 Amazon ECS 容器執行個體。在 Advanced details (進階詳細資料) 下的 User data (使用者資料) 欄位中,貼入下列指令碼,以您的叢集名稱取代 cluster_name。<powershell> Import-Module ECSTools Initialize-ECSAgent -Clustercluster-name-EnableTaskENI -EnableTaskIAMRole -LoggingDrivers '["awslogs","fluentd"]' </powershell>
- 
                        準備就緒後,請選取 acknowledgment (確認) 欄位,再選擇 Launch Instances (啟動執行個體)。 
- 
                        會有確認頁面讓您知道您的執行個體正在啟動。選擇 View Instances (檢視執行個體) 關閉確認頁面並返回主控台。 
 
步驟 3:設定 Fluent Bit
您可以使用 提供的下列預設組態 AWS 來快速開始使用:
- 
                Amazon CloudWatch ,即基於《Fluent Bit 官方手冊》中 Amazon CloudWatch 的 Fluent Bit 外掛程式。 
或者,您可以使用 提供的其他預設組態 AWS。如需詳細資訊,請參閱 Github 網站上有關 aws-for-fluent-bit 的 Overriding the entrypoint for the Windows image
預設的 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.* regionregionlog_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 執行個體安全群組中開啟,防止從外部存取。
註冊任務定義
- 
                使用下列內容建立名為 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" }
- 
                        
- 
                執行下列命令來註冊任務定義。 aws ecs register-task-definition --cli-input-jsonfile://fluent-bit.json--regionregion您可以執行 list-task-definitions命令列出您帳戶的任務定義。輸出顯示可與run-task或start-task搭配使用的系列和修訂版值。
步驟 5:使用常駐程式排程策略以 Amazon ECS 服務形式執行 ecs-windows-fluent-bit 任務定義
        註冊帳戶的任務定義後,您就可以在叢集中執行任務。在本教學課程中,您會在 FluentBit-cluster 叢集中執行 ecs-windows-fluent-bit:1 任務定義的一個執行個體。在使用常駐程式排程策略的服務中執行任務,用以確保 Fluent Bit 的單一執行個體一律在每個容器執行個體上執行。
執行任務
- 
                執行下列命令,以服務形式啟動 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 \ --regionregion
- 
                        
- 
                執行下列命令以列出您的任務。 取代下列變數: - 
                        將 region替代為服務任務執行所在的區域
 aws ecs list-tasks --cluster--regionFluentBit-clusterregion
- 
                        
步驟 6:註冊會產生日誌的 Windows 任務定義
註冊會產生日誌的任務定義。此任務定義會部署 Windows 容器映像,該映像會每秒向 stdout 寫入一個遞增數字。
任務定義會使用連線到 Fluent Bit 外掛程式接聽連接埠 24224 的 Fluentd 日誌記錄驅動程式。Amazon ECS 代理程式會為每個 Amazon ECS 容器新增標籤,包括叢集名稱、任務 ARN、任務定義系列名稱、任務定義修訂版編號和任務容器名稱。這些鍵/值對標籤會傳遞至 Fluent Bit。
注意
此任務會使用 default 網路模式。不過,您也可以在任務中使用 awsvpc 網路模式。
註冊任務定義
- 
                使用下列內容建立名為 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" }
- 
                執行下列命令來註冊任務定義。 取代下列變數: - 
                        將 region替代為任務執行所在的區域
 aws ecs register-task-definition --cli-input-jsonfile://windows-app-task.json--regionregion您可以執行 list-task-definitions命令列出您帳戶的任務定義。輸出顯示可與run-task或start-task搭配使用的系列和修訂版值。
- 
                        
步驟 7:執行 windows-app-task 任務定義
        註冊 windows-app-task 任務定義之後,請在 FluentBit-cluster 叢集中執行該定義。
執行任務
- 
                執行您在上一個步驟中註冊的 windows-app-task:1任務定義。取代下列變數: - 
                        將 region替代為任務執行所在的區域
 aws ecs run-task --cluster FluentBit-cluster --task-definition windows-app-task:1 --count 2 --regionregion
- 
                        
- 
                執行下列命令以列出您的任務。 aws ecs list-tasks --clusterFluentBit-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.– 此日誌串流包含 sample-container 任務容器中由任務的第一個執行個體產生的所有日誌。FIRST_TASK_ID.sample-containertask-out.– 此日誌串流包含 sample-container 任務容器中由任務的第二個執行個體產生的所有日誌。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 設定
- 透過 https://console.aws.amazon.com/cloudwatch/ - 開啟 CloudWatch 主控台。 
- 
                在導覽窗格中,選擇 Log groups (日誌群組)。請確定您位於將 Fluent Bit 部署到容器的區域。 在 中的日誌群組清單中 AWS 區域,您應該會看到以下內容: - 
                        /ecs/fluent-bit-logs
- 
                        /aws/ecs/FluentBit-cluster.windows-app-task
 如果您看到這些日誌群組,表示 Fluent Bit 設定已通過驗證。 
- 
                        
步驟 9:清除
完成此教學課程時,清除與其相關的資源,以免未使用的資源產生費用。
清除教學課程資源
- 
                停止 windows-simple-task任務和ecs-fluent-bit任務。如需詳細資訊,請參閱停止 Amazon ECS 任務。
- 
                執行下列命令來刪除 /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
- 
                執行下列命令以終止執行個體。 aws ec2 terminate-instances --instance-idsinstance-id
- 
                執行下列命令以刪除 IAM 角色。 aws iam delete-role --role-name ecsInstanceRole aws iam delete-role --role-name fluentTaskRole
- 
                執行下列命令以刪除 Amazon ECS 叢集。 aws ecs delete-cluster --clusterFluentBit-cluster