目次
Apacheコンテナの複数ログを複数ロググループに出力するfirelens
Amazon ECS (Elastic Container Service) の Fargate で Firelens を使用して、Apache コンテナの複数ログを CloudWatch の複数ロググループに出力する手順を以下に示します。
前提条件:
- AWS CLI がインストールされ、適切な権限が設定されていること
- Docker がインストールされていること
- Apache コンテナが作成され、複数のログファイルが生成されるように設定されていること
手順:
- 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を使用するには、以下の手順に従ってください。
- FireLens用の設定ファイルを作成します。先程の例と同じように、複数のロググループにルーティングすることができます。
- 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グループに送信します。
- ECSクラスターで、Fluentd用のAmazon CloudWatch Logsエージェントを設定します。これにより、FluentdコンテナがAWS CloudWatch Logsにログを書き込むことができます。
- タスクを実行するには、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.access
とapache.error
というタグでマークされます。@type
ディレクティブは、ログの形式を指定します。アクセスログは、Apache2のログ形式を解析するために、apache2
形式が使用されます。ログは、pos_file
ディレクティブを使用して、Fluentdが最後に読み込んだログ行を追跡するための位置ファイルに書き込まれます。
ログは、aws_cloudwatch_logs
プラグインを使用して、CloudWatch Logsに送信されます。ログは、log_group_name
とlog_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.access
とapache.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.access
とapache.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.access
とapache.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の命名規則に従う必要があります。また、バッファリングを使用してログの損失を防止することができます。バッファリングの詳細については、公式ドキュメントを参照してください。