本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 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_1
task-out.
TASK_ID
.container_1task-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 角色。
-
建立名為「ecsInstanceRole」的 Amazon ECS 容器執行個體角色。如需詳細資訊,請參閱 Amazon ECS 容器執行個體 IAM 角色。
-
為命名為
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": "*" } ] }
-
將政策連接到角色。
-
將上述內容儲存在名為
fluent-bit-policy.json
的檔案中。 -
執行下列命令,將內嵌政策附加到
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 執行個體
-
使用
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 -Cluster
cluster-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.* 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 執行個體安全群組中開啟,防止從外部存取。
註冊任務定義
-
使用下列內容建立名為
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-json
file://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 \ --region
region
-
-
執行下列命令以列出您的任務。
取代下列變數:
-
將
region
替代為服務任務執行所在的區域
aws ecs list-tasks --cluster
--regionFluentBit-cluster
region
-
步驟 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-json
file://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 --region
region
-
-
執行下列命令以列出您的任務。
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.
– 此日誌串流包含 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-ids
instance-id
-
執行下列命令以刪除 IAM 角色。
aws iam delete-role --role-name ecsInstanceRole aws iam delete-role --role-name fluentTaskRole
-
執行下列命令以刪除 Amazon ECS 叢集。
aws ecs delete-cluster --cluster
FluentBit-cluster