Amazon ECS Windows コンテナに Fluent Bit をデプロイする - Amazon Elastic Container Service

Amazon ECS Windows コンテナに Fluent Bit をデプロイする

Fluent Bit とは、さまざまなオペレーティングシステムでサポートされている高速で柔軟なログプロセッサおよびルーターです。Amazon CloudWatch Logs、Firehose Amazon S3、Amazon OpenSearch Service など、さまざまな AWS の宛先にログをルーティングするために使用できます。Fluent Bit は、DatadogSplunk、カスタム HTTP サーバーなどの一般的なパートナーソリューションをサポートしています。Fluent Bit の詳細については、Fluent Bit のウェブサイトを参照してください。

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 の 1 つのインスタンスが常にクラスター内のコンテナインスタンス上で実行されるようになります。

    • 転送入力プラグインを使用して、ポート 24224 でリッスンします。

    • Docker ランタイムがこの公開ポートを使用して Fluent Bit にログを送信できるように、ポート 24224 をホストに公開します。

    • Fluent Bit がログレコードを指定された宛先に送信できるようにする設定があります。

  • fluentd ロギングドライバーを使用して、その他すべての Amazon ECS タスクコンテナを起動します。詳細については、Docker ドキュメントのウェブサイトの「Fluentd ロギングドライバー」を参照してください。

    • Docker は、ホスト名前空間内のローカルホスト上の TCP ソケット 24224 に接続します。

    • Amazon ECS エージェントは、クラスター名、タスク定義ファミリー名、タスク定義リビジョン番号、タスク ARN、およびコンテナ名を含むラベルをコンテナに追加します。fluentd docker ロギングドライバーの labels オプションを使用して、同じ情報がログレコードに追加されます。詳細については、Docker ドキュメントのウェブサイトの「ラベル、labels-regex、env、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、タスクコンテナ名、タスク定義ファミリー、タスク定義リビジョン番号などのを含むメタデータを各ログエントリに追加します。

    例えば、container_1container_2 のある task_1 および container_3 のある task_2 の場合、CloudWatch ログストリームは次のようになります。

    • /aws/ecs/windows.ecs_task_1

      task-out.TASK_ID.container_1

      task-out.TASK_ID.container_2

    • /aws/ecs/windows.ecs_task_2

      task-out.TASK_ID.container_3

前提条件

このチュートリアルでは、以下の前提条件が完了済みであることを前提としています。

  • AWS CLI の最新バージョンがインストールされ、設定されていること。詳細については、「AWS Command Line Interface のインストール」を参照してください。

  • 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] です。

  • EC2 インスタンスを起動するパブリックサブネットを持つ VPC があります。デフォルトの VPC を使用できます。Amazon CloudWatch エンドポイントがサブネットに到達できるようにするプライベートサブネットを使用することもできます。Amazon CloudWatch エンドポイントの詳細については、「AWS 全般のリファレンス」の「Amazon CloudWatch のエンドポイントとクォータ」を参照してください。Amazon VPC ウィザードを使用して VPC を作成する方法の詳細については、「仮想プライベートクラウドを作成する」を参照してください。

ステップ 1: IAM アクセスロールを作成する

Amazon ECS の IAM ロールを作成します。

  1. 「ecsInstanceRole」という名前の Amazon ECS コンテナインスタンスロールを作成します。詳細については、「Amazon ECS コンテナインスタンス IAM ロール」を参照してください。

  2. 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": "*" } ] }
  3. ロールへのポリシーの付与

    1. 上記の内容を、fluent-bit-policy.json という名前のファイルに保存します。

    2. 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 インスタンスを作成するには
  1. aws ssm get-parameters コマンドを使用して、VPC をホストするリージョン用の AMI ID を取得します。詳細については、「Amazon ECS に最適化された AMI メタデータを取得する」を参照してください。

  2. Amazon EC2 コンソールを使用して、インスタンスを起動します。

    1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

    2. ナビゲーションバーから、使用するリージョンを選択します。

    3. EC2 ダッシュボードから、[Launch Instance] を選択します。

    4. [Name (名前)] に一意の名前を入力します。

    5. [Application and OS Images (Amazon Machine Image)] (アプリケーションおよび OS イメージ (Amazon マシンイメージ)) で、最初の手順で取得した AMI を選択します。

    6. [Instance type (インスタンスタイプ)] として [t3.xlarge] を選択します。

    7. [Key pair (login)] (キーペア (ログイン)) には、キーペアを選択します。

    8. [Network settings] (ネットワーク設定) にある [Security group] (セキュリティグループ) には、既存のセキュリティグループを選択することも、新しいセキュリティグループを作成することもできます。

    9. [Network settings] (ネットワーク設定) の [Auto-assign Public IP] (パブリック IP の自動割り当て) で、[Enable] (有効にする) を選択します。

    10. [Advanced details] (高度な詳細) で、[IAM instance profile] (IAM インスタンスプロファイル) として [ecsInstanceRole] を選択します。

    11. 次のユーザーデータを使用して、Amazon ECS コンテナインスタンスを設定します。[Advanced Details] (詳細情報) にある [User data] (ユーザーデータ) フィールドに以下のスクリプトを貼り付け、cluster_name をクラスターの名前に置き換えます。

      <powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster cluster-name -EnableTaskENI -EnableTaskIAMRole -LoggingDrivers '["awslogs","fluentd"]' </powershell>
    12. 準備ができたら、確認フィールドを選択してから、[Launch Instances] を選択します。

    13. 確認ページは、インスタンスが起動中であることを通知します。[View Instances] (インスタンスを表示) を選択して確認ページを閉じ、コンソールに戻ります。

ステップ 3: Fluent Bit の設定

AWS に用意されている次のデフォルト設定を使用すると、すぐに開始できます。

または、AWS で提供されている他のデフォルト設定を使用することもできます。詳細については、aws-for-fluent-bit Github ウェブサイトの「Windows イメージのエントリポイントのオーバーライド」を参照してください。

デフォルトの Amazon CloudWatch Fluent Bit 設定を以下に示します。

以下の変数を置き換えます。

  • region を、Amazon CloudWatch ログを送信したいリージョンで置き換えます。

[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 の内部パイプラインは、Match regex を使用してログエントリをルーティングし、フィルターを変更します。このフィルターは、ログレコード JSON のキーを Fluent Bit が使用できる形式に置き換えます。

  • 変更されたログエントリは、その後 rewrite_tag フィルターによって使用されます。このフィルターは、ログレコードのタグを out.TASK_IDCONTAINER_NAME 形式に変更します。

  • 新しいタグは、CloudWatch 出力プラグインの log_group_template オプションおよび log_stream_prefix オプションを使用して前述のようにロググループとストリームを作成する出力 cloudwatch_logs プラグインにルーティングされます。追加情報については、「Fluent Bit 公式マニュアル」の「設定パラメータ」を参照してください。

ステップ 4: ログを CloudWatch にルーティングする Windows Fluent Bit タスク定義を登録する

ログを CloudWatch にルーティングする Windows Fluent Bit タスク定義を登録します。

注記

このタスク定義では、Fluent Bit コンテナポート 24224 をホストポート 24224 に公開します。外部からのアクセスを防ぐため、EC2 インスタンスのセキュリティグループでこのポートが開いていないことを確認してください。

タスク定義を登録するには
  1. 次の内容で、fluent-bit.json という名前のファイルを作成します。

    以下の変数を置き換えます。

    • task-iam-role。タスク IAM ロールの Amazon リソースネーム (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" }
  2. 次のコマンドを実行して、タスク定義を登録します。

    aws ecs register-task-definition --cli-input-json file://fluent-bit.json --region region

    list-task-definitions コマンドを実行して、アカウントのタスク定義をリスト表示できます。出力には、run-task または start-task と一緒に使用できるファミリーとリビジョンの値が表示されます。

ステップ 5: デーモンスケジューリング戦略を使用して ecs-windows-fluent-bit タスク定義を Amazon ECS サービスとして実行する

アカウントのタスク定義を登録したら、クラスターでタスクを実行できます。このチュートリアルでは、FluentBit-cluster クラスターで ecs-windows-fluent-bit:1 タスク定義のインスタンスを 1 つ実行します。デーモンスケジューリング戦略を使用するサービスでタスクを実行することにより、Fluent Bit の単一インスタンスが常に各コンテナインスタンスで実行されます。

タスクを実行するには
  1. 以下のコマンドを実行して、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
  2. 次のコマンドを実行して、タスクを一覧表示します。

    以下の変数を置き換えます。

    • region。サービスタスクが実行されるリージョンに置き換えます。

    aws ecs list-tasks --cluster FluentBit-cluster --region region

ステップ 6: ログを生成する Windows タスク定義を登録する

ログを生成するタスク定義を登録します。このタスク定義では、1 秒ごとに増分数を stdout に書き込む Windows コンテナイメージをデプロイします。

タスク定義では、Fluent Bit プラグインがリッスンするポート 24224 に接続する fluentd ロギングドライバーを使用します。Amazon ECS エージェントは、クラスター名、タスク ARN、タスク定義ファミリー名、タスク定義リビジョン番号、タスクコンテナ名などを含むタグのある各 Amazon ECS コンテナにラベルを付けます。これらのキー値ラベルは Fluent Bit に渡されます。

注記

このタスクは、default ネットワークモードを使用します。ただし、タスクで awsvpc ネットワークモードを使用することもできます。

タスク定義を登録するには
  1. 次の内容で、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" }
  2. 次のコマンドを実行して、タスク定義を登録します。

    以下の変数を置き換えます。

    • region。タスクが実行されるリージョンに置き換えます。

    aws ecs register-task-definition --cli-input-json file://windows-app-task.json --region region

    list-task-definitions コマンドを実行して、アカウントのタスク定義をリスト表示できます。出力には、run-task または start-task と一緒に使用できるファミリーとリビジョンの値が表示されます。

ステップ 7: windows-app-task タスク定義を実行する

windows-app-task タスク定義を登録したら、FluentBit-cluster クラスターで実行します。

タスクを実行するには
  1. 前の手順で登録した windows-app-task:1 タスク定義を実行します。

    以下の変数を置き換えます。

    • region。タスクが実行されるリージョンに置き換えます。

    aws ecs run-task --cluster FluentBit-cluster --task-definition windows-app-task:1 --count 2 --region region
  2. 次のコマンドを実行して、タスクを一覧表示します。

    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.FIRST_TASK_ID.sample-container - このログストリームには、sample-container タスクコンテナ内のタスクの最初のインスタンスによって生成されたすべてのログが含まれます。

    task-out.SECOND_TASK_ID.sample-container - このログストリームには、sample-container タスクコンテナ内のタスクの 2 番目のインスタンスによって生成されたすべてのログが含まれます。

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 設定を検証するには
  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

  2. ナビゲーションペインで、[Log groups] (ロググループ) を選択します。Fluent Bit をコンテナにデプロイしたリージョンにいることを確認してください。

    AWS リージョンのロググループのリストは、以下のように表示されます。

    • /ecs/fluent-bit-logs

    • /aws/ecs/FluentBit-cluster.windows-app-task

    これらのロググループが表示される場合、Fluent Bit のセットアップは検証済みです。

ステップ 9: クリーンアップする。

このチュートリアルが終了したら、使用していないリソースに対する料金が発生しないように、チュートリアルに関連付けられたリソースをクリーンアップします。

チュートリアルリソースをクリーンアップするには
  1. windows-simple-task タスクおよび ecs-fluent-bit タスクを停止します。詳細については、「Amazon ECS タスクの停止」を参照してください。

  2. 次のコマンドを実行して、/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
  3. 次のコマンドを実行して、インスタンスを停止します。

    aws ec2 terminate-instances --instance-ids instance-id
  4. 次のコマンドを実行して、IAM ロールを削除します。

    aws iam delete-role --role-name ecsInstanceRole aws iam delete-role --role-name fluentTaskRole
  5. 次のコマンドを実行して、Amazon ECS クラスターを削除します。

    aws ecs delete-cluster --cluster FluentBit-cluster