跳至內容

我該如何將容器日誌同時傳送到 AWS Fargate 上 Amazon ECS 中的多個目的地?

2 分的閱讀內容
0

我希望在 AWS Fargate 上執行的應用程式容器能將日誌轉送到多個目的地,例如 Amazon CloudWatch、Amazon Data Firehose 或 Splunk。

簡短描述

Amazon Elastic Container Service (Amazon ECS) 任務定義可讓您為特定容器指定單一的日誌組態物件。此限制表示您只能將日誌轉送到一個目的地。若要在 Amazon ECS 的 Fargate 上將日誌轉送至多個目的地,您可以使用 FireLens。

**注意:**FireLens 可與 Fluent Bit 和 Fluentd 日誌轉送工具搭配使用。以下解決方案使用 Fluent Bit,因為 Fluent Bit 比 Fluentd 更節省資源。

解決方法

先決條件:

查看以下資訊:

  • FireLens 會使用 ECS 任務定義中 logConfiguration 物件裡指定為選項的鍵值對來產生 Fluent Bit 的輸出定義。日誌導向的目的地是在 Fluent Bit 組態檔案的 [OUTPUT] 定義區段中指定的。如需詳細資訊,請參閱 Fluent Bit 網站上的輸出結果
  • FireLens 會為您建立一個組態檔案,但您也可以指定自訂組態檔案。您可以在 Amazon Simple Storage Service (Amazon S3) 中託管此組態檔案。或者,建立一個自訂 Fluent Bit Docker 映像檔,並在其中新增自訂輸出組態檔案。
  • 如果您在 Fargate 上使用 Amazon ECS,則無法從 Amazon S3 中提取組態檔案。而是必須使用組態檔案建立自訂 Docker 映像檔。

建立 IAM 權限

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

建立 AWS Identity and Access Management (IAM) 權限,以允許您的任務角色將日誌路由到不同的目的地。例如,如果您的目的地是 Data Firehose,那麼您必須授予任務呼叫 firehose:PutRecordBatch API 的權限。

**注意:**Fluent Bit 支援多個外掛程式作為日誌目的地。CloudWatch 和 Kinesis 等目的地需要以下權限:logs:CreateLogGrouplogs:CreateLogStreamlogs:DescribeLogStreamslogs:PutLogEventskinesis:Putcords。如需詳細資訊,請參閱 GitHub 網站上的 CloudWatchKinesis 權限。

使用自訂輸出組態檔案建立 Fluent Bit Docker 映像檔

  1. 建立一個名為 logDestinations.conf 的自訂 Fluent Bit 組態檔案,並選擇 [OUTPUT] 定義。例如,下列組態檔案包括 CloudWatch、Data Firehose 和 Splunk 定義的組態:

    [OUTPUT]    Name                firehose
        Match               YourContainerName*
        region              us-west-2
        delivery_stream     nginx-stream  
    [OUTPUT]
        Name                cloudwatch
        Match               YourContainerName*
        region              us-east-1
        log_group_name      firelens-nginx-container
        log_stream_prefix   from-fluent-bit
        auto_create_group   true   
    [OUTPUT]
        Name                splunk
        Match               <ContainerName>*
        Host                127.0.0.1
        Splunk_Token        xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
        Splunk_Send_Raw     On

    **注意:**不同的目的地在 [OUTPUT] 定義中需要指定不同的欄位。有關範例,請參閱 GitHub 網站上的 amazon-ecs-firelens-examples

  2. 使用以下 Dockerfile 範例建立包含自訂 Fluent Bit 輸出組態檔案的 Docker 映像檔:

    FROM amazon/aws-for-fluent-bit:latestADD logDestinations.conf /logDestinations.conf

    **注意:**如需詳細資訊,請參閱 Docker 網站上的 Dockerfile 參考

  3. 若要使用您建立的 Dockerfile 來建立自訂 fluent-bit Docker 映像檔,請執行以下命令:

    docker build -t custom-fluent-bit:latest .

    **重要:**在與 Dockerfile 相同的位置執行 docker build 命令。

  4. 若要確認 Docker 映像檔可供 Amazon ECS 使用,請將 Docker 映像檔推送至 Amazon Elastic Container Registry (Amazon ECR)。或者,將 Docker 映像檔推送到您自己的 Docker 登錄檔。例如,若要將本機 Docker 映像檔推送到 Amazon ECR,請執行以下命令:

    docker push aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest
  5. 在您的任務定義中,更新您的 FireLens 組態選項

    {
      "containerDefinitions": [
        {
          "essential": true,
          "image": "aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest",
          "name": "log_router",
          "firelensConfiguration": {
            "type": "fluentbit",
            "options": {
              "config-file-type": "file",
              "config-file-value": "/logDestinations.conf"
            }
          }
        }
      ]
    }

    **注意:**若要指定自訂組態檔案,您必須在 FireLens 組態檔案中加入 config-file-typeconfig-file-value 選項。若要加入這些選項,請使用 AWS CLIAmazon ECS 主控台建立任務定義。

  6. 修改組態中 containerDefinition 區段的 image 屬性,使其指向有效的 Amazon ECR 映像檔位置。若要在 Amazon ECR 儲存庫中指定映像檔,請使用完整的 registry/repository:tag 命名慣例。例如:

    aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest

    若要使用其他儲存庫,請參閱任務定義的映像檔屬性

AWS 官方已更新 2 年前