Apacheコンテナの複数ログを複数ロググループに出力するfirelens

Amazon ECS (Elastic Container Service) の Fargate で Firelens を使用して、Apache コンテナの複数ログを CloudWatch の複数ロググループに出力する手順を以下に示します。

前提条件:

  • AWS CLI がインストールされ、適切な権限が設定されていること
  • Docker がインストールされていること
  • Apache コンテナが作成され、複数のログファイルが生成されるように設定されていること

手順:

  1. Firelens の設定ファイルを作成する まず、Firelens が Fluent Bit を使用して、Apache コンテナのログを CloudWatch に送信できるように設定するために、設定ファイルを作成します。以下は fluent-bit.conf という名前のファイルに保存する内容の例です。

 

[SERVICE]
Flush 1
Log_Level info
Daemon off
Parsers_File parsers.conf

[INPUT]
Name tail
Tag apache.access
Path /var/log/apache2/access.log
Parser apache

[INPUT]
Name tail
Tag apache.error
Path /var/log/apache2/error.log
Parser apache_error

[FILTER]
Name record_modifier
Match *
Record ecs_cluster ${ECS_CLUSTER}
Record ecs_task_arn ${ECS_TASK_ARN}

 

 

ECS(Fargate)でFireLensを使用するには、以下の手順に従ってください。

  1. FireLens用の設定ファイルを作成します。先程の例と同じように、複数のロググループにルーティングすることができます。
  2. ECSタスク定義にFireLensコンテナを追加します。以下は、例です。
{
  "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "apache",
      "image": "httpd:2.4",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80
        }
      ],
      "logConfiguration": {
        "logDriver": "awsfirelens",
        "options": {
          "Name": "firelens",
          "ConfigurationType": "fluentd",
          "FluentdAddress": "localhost:24224",
          "config-file-type": "s3",
          "config-file-value": "s3://my-bucket/firelens.conf"
        }
      }
    },
    {
      "name": "firelens",
      "image": "amazon/aws-for-fluent-bit:latest",
      "essential": true,
      "firelensConfiguration": {
        "type": "fluentd",
        "options": {
          "config-file-type": "s3",
          "config-file-value": "s3://my-bucket/fluent-bit.conf"
        }
      },
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/aws/containerinsights/my-cluster",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "firelens"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "networkMode": "awsvpc",
  "cpu": "256",
  "memory": "512",
  "family": "my-task"
}

 

この例では、apacheコンテナとfirelensコンテナが含まれるECSタスク定義を示しています。

apacheコンテナは、FireLensログドライバを使用してログを送信し、

firelensコンテナは、Fluent Bitを使用してログを収集します。

FireLensコンテナは、ログを指定されたAWS CloudWatch Logsグループに送信します。

 

  1. ECSクラスターで、Fluentd用のAmazon CloudWatch Logsエージェントを設定します。これにより、FluentdコンテナがAWS CloudWatch Logsにログを書き込むことができます。
  2. タスクを実行するには、ECSクラスターにタスクを登録し、タスクを起動します。タスクを起動すると、ApacheコンテナのログがCloudWatch Logsグループに送信されます。

 

以上の手順に従うことで、ECS(Fargate)環境でFireLensを使用して、

複数のロググループにApacheコンテナのログを送信できます。

注意事項として、ECS(Fargate)環境では、FireLens用のFluentdコンテナを手動で起動する必要はありません。代

わりに、FireLens用の設定をタスク定義のログ設定に含めることができます。

また、Fluent BitはFireLensコンテナで実行されます。Fluent Bitは、FireLensが提供するログデータの形式に対応しており、指定されたロググループにログを送信することができます。

さらに、FireLensを使用して複数のロググループにログを送信する場合、

ロググループの数に応じて、AWSの課金体系が変化することに注意してください。ロググループごとに課金されるため、

必要なロググループの数だけ作成するようにしてください。

 

firelens.confの記述はどうすればよいですか?

FireLens用のFluentdコンフィグレーションファイル(firelens.conf)は、FireLensが収集、ルーティング、および変換するログの形式を定義します。以下は、Apacheアクセスログとエラーログを収集して、CloudWatch Logsに送信するためのFluentdコンフィグレーションファイルの例です。

 

<source>
@type tail
path /var/log/apache2/access.log
pos_file /var/log/fluentd-containers.log.pos
tag apache.access
read_from_head true
<parse>
@type apache2
</parse>
</source>

<source>
@type tail
path /var/log/apache2/error.log
pos_file /var/log/fluentd-containers.log.pos
tag apache.error
read_from_head true
</source>

<match apache.access>
@type aws_cloudwatch_logs
log_group_name apache_access_logs
log_stream_name_key container_id
auto_create_stream true
<buffer>
@type file
path /var/log/fluentd-buffers/apache-access
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 10s
chunk_limit_size 8m
</buffer>
</match>

<match apache.error>
@type aws_cloudwatch_logs
log_group_name apache_error_logs
log_stream_name_key container_id
auto_create_stream true
<buffer>
@type file
path /var/log/fluentd-buffers/apache-error
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 10s
chunk_limit_size 8m
</buffer>
</match>

この例では、tailプラグインを使用して、Apacheアクセスログとエラーログを収集しています。ログは、apache.accessapache.errorというタグでマークされます。@typeディレクティブは、ログの形式を指定します。アクセスログは、Apache2のログ形式を解析するために、apache2形式が使用されます。ログは、pos_fileディレクティブを使用して、Fluentdが最後に読み込んだログ行を追跡するための位置ファイルに書き込まれます。

ログは、aws_cloudwatch_logsプラグインを使用して、CloudWatch Logsに送信されます。ログは、log_group_namelog_stream_name_keyディレクティブで指定されたロググループに送信されます。ロググループは、Fluentdによって自動的に作成されます。log_stream_name_keyディレクティブは、ログを生成したコンテナIDに基づいてログストリーム名を生成します。ロググループとログストリームが存在しない場合、auto_create_streamディレクティブを使用して自動的に作成されます。ログは、bufferディレクティブ

でバッファリングされます。バッファリングは、一時的なネットワークの問題が発生した場合にログの損失を防ぐために使用されます。

ログファイルが異なる場合や、ログの形式が異なる場合は、Fluentdプラグインを適宜変更してください。また、ロググループ名、ログストリーム名、およびバッファリングの設定を変更することもできます。ただし、ロググループ名とログストリーム名にはAWSの命名規則に従う必要があります。

Fluentdの詳細については、公式ドキュメントを参照してください。

 

fluent-bit.confはどのように書けばいいですか?

FireLens用のFluent Bitコンフィグレーションファイル(fluent-bit.conf)は、FireLensが収集、ルーティング、および変換するログの形式を定義します。以下は、Apacheアクセスログとエラーログを収集して、CloudWatch Logsに送信するためのFluent Bitコンフィグレーションファイルの例です。

 

 

[INPUT]
    Name              tail
    Path              /var/log/apache2/access.log
    Tag               apache.access
    Parser            apache

[INPUT]
    Name              tail
    Path              /var/log/apache2/error.log
    Tag               apache.error

[OUTPUT]
    Name              cloudwatch_logs
    Match             apache.*
    region            ap-northeast-1
    log_group_name    apache_logs
    log_stream_prefix {container_id}
    auto_create_group true

 

この例では、tailプラグインを使用して、Apacheアクセスログとエラーログを収集しています。ログは、apache.accessapache.errorというタグでマークされます。Nameディレクティブは、入力プラグインの種類を指定します。アクセスログは、Apacheのログ形式を解析するために、apacheパーサーが使用されます。ログは、Fluent Bitが最後に読み込んだログ行を追跡するための位置ファイルに書き込まれます。

ログは、cloudwatch_logsプラグインを使用して、CloudWatch Logsに送信されます。ログは、Matchディレクティブで指定されたタグに一致するもののみ送信されます。ログは、log_group_nameディレクティブで指定されたロググループに送信されます。ロググループは、Fluent Bitによって自動的に作成されます。ログストリーム名は、log_stream_prefixディレクティブによって設定されます。ログストリームは、コンテナIDに基づいて生成されます。ロググループとログストリームが存在しない場合、auto_create_groupディレクティブを使用して自動的に作成されます。

ログファイルが異なる場合や、ログの形式が異なる場合は、Fluent Bitプラグインを適宜変更してください。また、ロググループ名、ログストリーム名、および自動作成の設定を変更することもできます。ただし、ロググループ名とログストリーム名にはAWSの命名規則に従う必要があります。

Fluent Bitの詳細については、公式ドキュメントを参照してください。

 

複数のロググループへの出力する記述はどうすればよいですか?

FireLensを使用して複数のロググループにログを送信するには、FireLens用の設定ファイルで@labelを使用することができます。以下は、Apacheアクセスログとエラーログを収集し、2つの異なるロググループに送信するFireLens用のFluentdコンフィグレーションファイルの例です。

 

<source>
@type tail
path /var/log/apache2/access.log
pos_file /var/log/fluentd-containers.log.pos
tag apache.access
read_from_head true
<parse>
@type apache2
</parse>
</source>

<source>
@type tail
path /var/log/apache2/error.log
pos_file /var/log/fluentd-containers.log.pos
tag apache.error
read_from_head true
</source>

<match apache.access>
@type label
@label access
</match>

<match apache.error>
@type label
@label error
</match>

<label @access>
<match **>
@type aws_cloudwatch_logs
log_group_name apache_access_logs
log_stream_name_key container_id
auto_create_stream true
<buffer>
@type file
path /var/log/fluentd-buffers/apache-access
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 10s
chunk_limit_size 8m
</buffer>
</match>
</label>

<label @error>
<match **>
@type aws_cloudwatch_logs
log_group_name apache_error_logs
log_stream_name_key container_id
auto_create_stream true
<buffer>
@type file
path /var/log/fluentd-buffers/apache-error
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 10s
chunk_limit_size 8m
</buffer>
</match>
</label>


この例では、tailプラグインを使用して、Apacheアクセスログとエラーログを収集しています。ログは、apache.accessapache.errorというタグでマークされます。ログは、それぞれ@access@errorというラベルにルーティングされます。

@accessラベルのログは、aws_cloudwatch_logsプラグインを使用して、apache_access_logsというロググループに送信されます。同様に、@errorラベルのログは、aws_cloudwatch_logsプラグインを使用して、apache_error_logsというロググループに送信されます。

Fluentdは、<label>ディレクティブを使用して、ラベルを定義します。<match>ディレクティブは、ラベルに一致するログにのみ適用されます。各ラベルには、それぞれ異なるロググループ名が指定されています。これにより、FireLensは、複数のロググループにログを送信する

ことができます。

各ラベルには、AWSの課金体系に基づいて課金されるロググループが含まれます。ロググループの数に応じて、AWSの課金体系が変化することに注意してください。ロググループごとに課金されるため、必要なロググループの数だけ作成するようにしてください。

また、Fluent Bitでも同様の@label機能を使用して、複数のロググループにログを送信することができます。ただし、記述方法はFluentdと異なるため、Fluent Bitのドキュメントを参照してください。

FireLensを使用する場合、ログループ名、ログストリーム名、およびバッファリングの設定を変更することができます。ただし、ロググループ名とログストリーム名にはAWSの命名規則に従う必要があります。また、バッファリングを使用してログの損失を防止することができます。バッファリングの詳細については、公式ドキュメントを参照してください。

 

fluent-bit.confはどのように書けばいいですか?

FireLens用のFluent Bitコンフィグレーションファイル(fluent-bit.conf)で、複数のロググループにログを送信するには、Fluent Bitの@labelを使用することができます。以下は、Apacheアクセスログとエラーログを収集し、2つの異なるロググループに送信するためのFluent Bitコンフィグレーションファイルの例です。

 

[INPUT]
Name tail
Path /var/log/apache2/access.log
Tag apache.access
Parser apache

[INPUT]
Name tail
Path /var/log/apache2/error.log
Tag apache.error

<LABEL @access>
  <MATCH apache.access>
    Name cloudwatch_logs
    region ap-northeast-1
    log_group_name apache_access_logs
    log_stream_prefix {container_id}
    auto_create_group true
  </MATCH>
</LABEL>

<LABEL @error>
  <MATCH apache.error>
    Name cloudwatch_logs
    region ap-northeast-1
    log_group_name apache_error_logs
    log_stream_prefix {container_id}
    auto_create_group true
  </MATCH>
</LABEL>

 

この例では、tailプラグインを使用して、Apacheアクセスログとエラーログを収集しています。ログは、apache.accessapache.errorというタグでマークされます。それぞれのタグには、@access@errorというラベルが定義されています。

@accessラベルのログは、cloudwatch_logsプラグインを使用して、apache_access_logsというロググループに送信されます。同様に、@errorラベルのログは、cloudwatch_logsプラグインを使用して、apache_error_logsというロググループに送信されます。

Fluent Bitは、<label>ディレクティブを使用して、ラベルを定義します。<match>ディレクティブは、ラベルに一致するログにのみ適用されます。各ラベルには、それぞれ異なるロググループ名が指定されています。これにより、FireLensは、複数のロググループにログを送信することができます。

各ラベルには、AWSの課金体系に基づいて課金されるロググループが含まれます。ロググループの数に応じて、AWSの課金体系が変化することに注意してください。ロググループごとに課金されるため、必要なロググループの数だけ作成するようにしてください。

また、ロググループ名、ログストリーム名、および自動作成の設定を変更することができます。ただし、ロググループ名とログスト

リーム名にはAWSの命名規則に従う必要があります。また、バッファリングを使用してログの損失を防止することができます。バッファリングの詳細については、公式ドキュメントを参照してください。

Fluent Bitでは、FireLensが自動的にタグを生成するため、タグの生成について心配する必要はありません。ただし、他のタグを使用している場合は、FireLensのFluent Bit用のタグを使用する必要があります。

Fluent Bitでは、AWS CLIがインストールされている場合は、AWSのクレデンシャルを自動的に取得することができます。この場合、Fluent Bitの設定ファイルにAWSのリージョンを指定する必要があります。AWS CLIがインストールされていない場合は、IAMロールを使用して認証することもできます。IAMロールを使用する場合は、role_arnディレクティブを設定する必要があります。

Fluent Bitは、<label>ディレクティブを使用してラベルを定義し、各ラベルには、それぞれ異なるロググループ名が指定されています。これにより、FireLensは、複数のロググループにログを送信することができます。Fluent Bitでは、ロググループ名、ログストリーム名、および自動作成の設定を変更することができます。ただし、ロググループ名とログストリーム名にはAWSの命名規則に従う必要があります。また、バッファリングを使用してログの損失を防止することができます。バッファリングの詳細については、公式ドキュメントを参照してください。

 

記事タイトル検索