AWS ECS Fargate および EC2 のコンテナ ログの収集
このページでは、AWS FireLens を使用して、AWS Fargate または EC2 で起動された AWS ECS コンテナからアプリケーション コンテナ ログを収集する方法について説明します。
- Fargate コンテナ ログの収集
- EC2 コンテナ ログの収集
- (省略可能) 集中型の Fluentd アグリゲータの作成
- (省略可能) カスタム Fluent Bit イメージの作成
- トラブルシューティング
収集プロセスの概要
次の図は、FireLens ログ ドライバを使用して、AWS Fargate または EC2 上で実行されている ECS コンテナから Sumo Logic にコンテナ ログを送信するプロセスを示しています。
FireLens を使用すると、Fargate タスク定義で Fluentd または Fluent Bit の出力を設定できます。Fluent Bit は Fluentd よりリソース使用率が大幅に少ないため、Fluent Bit を使用することをお勧めします。
Fargate コンテナ ログの収集
このセクションでは、Fargate コンテナ ログを収集するための AWS リソースと Sumo Logic リソースを作成する方法を説明します。
ステップ 1: Hosted Collector と HTTP Source の追加
Hosted Collector を使用すると、クラウドに保存されているデータを Sumo Logic にアップロードできます。HTTP Source は、URL を介してアップロードされたログやメトリクスを受信するためのエンドポイントです。
Hosted Collector および HTTP Source を追加するには、次の手順を実行します。
- Sumo Logic で、Hosted Collector を設定します。
- Sumo Logic で、HTTP Source を設定します。
ステップ 2: AWS のタスク定義およびサービスの作成
Amazon ECS で Docker コンテナを実行するには、タスク定義が必要です。タスク定義では、複数のコンテナを定義できます。タスク定義で使用するパラメータは、タスクの起動タイプによって異なります。タスク定義で使用可能なパラメータと、それらのパラメータが有効である起動タイプの詳細については、Amazon ECS の『タスク定義のパラメータ』ドキュメントを参照してください。
ECS では、Fargate と EC2 の 2 つの起動タイプが許可されます。環境に最適な起動タイプを作成します。
こちらの JSON を使用して、FluentBit イメージに基づくログ ルータとアプリケーションのコンテナを使用した新しいタスク定義を作成する必要があります。
前提条件
タスク定義を作成する前に、サンプルの JSON 内の次の値を置き換えます。
- ECS Task IAM Role (ECS タスク IAM ロール): ecs_task_iam_role という新しいロールを作成します。
- AWS Fluent Bit Image (AWS Fluent Bit イメージ): デフォルト イメージは、amazon/aws-for-fluent-bit:latest です。デフォルト イメージは、Docker Hub でホストされます。このイメージを使用することをお勧めしますが、別のイメージを使用する場合には、地域特定化されている Amazon ECR イメージ リポジトリは、可用性が高いため、このリポジトリを使用することをお勧めします。
- Sumo Logic <endpoint> and <token> (Sumo Logic <エンドポイント> および <トークン>): エンドポイントとトークンは、ステップ 1 で生成した HTTP Source のアドレス URL から抽出する必要があります。
たとえば、次の URL を使用します。
https://endpoint3.collection.us2.sumologic.com/receiver/v1/http/ExampleToken5UilxWIRSnHhU6-L_CCbuFDkc9j0l74XvUiFrmESfdsSFDsfsdQ5vYYYEu2HFuQArdsfsdfsdSaaaskNSn-VPkWsdfdWt4A==
endpoint3.collection.us2.sumologic.com は、エンドポイントです。パス /receiver/v1/http/ の後にあるのは、トークンです。サンプルの JSON ファイルで、太字の変数を次のスニペットに示すように置き換えます。
"logConfiguration": { "logDriver":"awsfirelens", "options": { "Name":"http", "Host": "<endpoint>", "URI": "/receiver/v1/http/<token>", "Port": "443", "tls": "on", "tls.verify": "off", "Format": "json_lines" }
Source Category
Source Category と Source 名を追加するには、Header パラメータを logConfiguration オプション内で渡します。次の例を参照してください。
"options": { "Name":"http", "Header": "X-Sumo-Category ECS/FireLens/Fargate",
アプリケーション コンテナ
サンプルの JSON では、httpd アプリケーション コンテナが作成されます。image パラメータでは、httpd をデプロイ対象アプリケーションに置き換えます。次の例を参照してください。
"essential": true, "image": "your_application", "name": "app", "logConfiguration": {
CloudWatch グループ
用意されているサンプルの JSON の場合、FireLens ログ ルータ コンテナは、その自身のログを CloudWatch グループ「awslogs-ecs-fargate-sumo」に送信するように設定されています。Fluent Bit の問題をデバッグするため、FireLens ログを CloudWatch に送信することをお勧めします。
この設定を保持する場合は、「awslogs-ecs-fargate-sumo」という名前のログ グループを us-west-1 内に作成します。また、タスク実行ロールの名前がデフォルトの「executionRoleArn」ではない場合は、タスク実行ロールを置き換え、次の例で太字で示されている account id を設定します。
"executionRoleArn": "arn:aws:iam::<account_id>:role/ecsTaskExecutionRole"
別の名前のログ グループを作成することもできます。これを行うには、次の例で太字で示されている新しい CloudWatch グループ名でタスク定義の JSON を更新します。
"logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "awslogs-ecs-fargate-sumo", "awslogs-region": "us-west-1", "awslogs-stream-prefix": "awslogs-ecs-fargate-sumo" } }
その他のプロパティ
CPU や RAM などのその他のプロパティは、必要に応じて変更できます。詳細については、Amazon ECS の『タスク定義のパラメータ』ドキュメントを参照してください。
A. タスク定義の作成
Fargate タスク定義を作成するには、次のコマンドを使用します。
aws ecs register-task-definition --region us-west-1 --cli-input-json file:///httpd_fargate_sumologic.json
B. サービスの起動
サービスを起動するには、次のコマンド構文を使用します。このコマンドでは、サービスのサブネットとセキュリティ グループが必要です。 クラスタ VPC、サブネット、およびセキュリティ グループの変数を実際の環境の値で置き換える必要があります。クラスタ VPC、サブネット、および関連するセキュリティ グループは、AWS コンソールから決定できます。
aws ecs create-service --cluster fargate-ecs-firelens-cluster --service-name firelens-sumologic-fargate --task-definition firelens-sumologic-fargate:1 --desired-count 1 --region us-west-1 --launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-1,subnet-2],securityGroups=[sg-1],assignPublicIp=ENABLED}"
VPC ID のセキュリティ グループを決定するには、次のコマンドを使用します。
aws ec2 describe-security-groups --filters Name=vpc-id,Values=VPC_ID --region us-west-1
ステップ 3: Sumo Logic でのログの確認
前のステップでは、コンテナ ログ収集の設定方法について説明しました。このセクションでは、ログが Sumo Logic に表示されることを確認する方法について説明します。
コンテナ ログが Sumo Logic に送信されていることを確認するには、次の例に示すようなインタラクティブ検索を実行します。
_sourceCategory=ECS/Fargate
EC2 コンテナ ログの収集
この手順のステップに従って、サンプル EC2 タスク定義ファイルを使用して EC2 コンテナ ログ収集を設定します。
ステップ 1: Hosted Collector と HTTP Source の追加
Hosted Collector を使用すると、クラウドに保存されているデータを Sumo Logic にアップロードできます。HTTP Source は、URL を介してアップロードされたログやメトリクスを受信するためのエンドポイントです。
Hosted Collector および HTTP Source を追加するには、次の手順を実行します。
- Sumo Logic で、Hosted Collector を設定します。
- Sumo Logic で、HTTP Source を設定します。
ステップ 2: タスク定義の作成
Fargate 用に前に行ったように、サンプル JSON の <account_id>、<endpoint>、<token>、および AWS Fluent Bit イメージを置き換えます。
次のコマンドを使用してタスク定義を作成します。
aws ecs register-task-definition --region us-west-1 --cli-input-json file:///httpd_ec2_sumologic.json
ステップ 3: サービスの作成
次のコマンドを使用してサービスを作成します。
aws ecs create-service --cluster ec2-ecs-firelens-cluster --service-name firelens-sumologic-ec2 --task-definition firelens-sumologic-ec2:1 --desired-count 1 --region us-west-1 --launch-type "EC2"
(省略可能) 集中型の Fluentd アグリゲータの作成
このタスクは省略可能です。集中型の Fluentd アグリゲータを作成してすべてのコンテナのログを収集する場合は、このセクションで説明されているステップを実行します。
次の図は、集中型の Fluentd 収集プロセスを示しています。
集中型の Fluentd アグリゲータを作成するには、次の手順を実行します。
- このドキュメントの説明に従って、Fluentd デプロイを作成します。
- Sumo Logic FluentD プラグインを使用して、ログが Sumo Logic に送信されるように Fluentd を設定します。
- 前のセクションの説明に従って、FireLens、Fluent Bit、およびアプリケーションのコンテナを作成します。
- 次のアプリケーション コンテナ ログ ドライバ設定を使用して、ログを Fluentd アグリゲータに転送します。(次の例で太字で示されている) 「fluentdhost」を Fluentd ホストの実際の名前に置き換えます。
"logConfiguration": { "logDriver":"awsfirelens", "options": { "Name": "forward", "Host": "fluentdhost", "Port": "24224" } }
(省略可能) 複数の HTTP ヘッダーのサポート
現在、FireLens はタスク定義内で 1 つのヘッダーのみをサポートしています。複数のヘッダーを追加する必要がある場合は、EC2 では Fluent Bit 設定を S3 に保存できますが、Fargate では S3 設定は機能しません。Fargate の場合は、カスタム Fluent Bit イメージを作成し、外部設定ファイルでカスタム Fluent Bit 設定を指定できます。
EC2 の場合に Fluent 設定を S3 に保存するには、次の手順を実行します。
- ログ設定として次のように設定します。
"logConfiguration": { "logDriver": "awsfirelens", }
- FireLens 設定で次のように設定します。
"firelensConfiguration": { "type": "fluentbit", "options": { "config-file-type": "s3", "config-file-value": "arn:aws:s3:::yourbucket/yourdirectory/extra.conf" } },
Fargate の場合にカスタム Fluent Bit イメージを作成し、デプロイし、使用するには、次の手順を実行します。
- こちらにある AWS Fluent Bit イメージを複製します。
- ルートフォルダに、カスタム設定を含む新しいファイル fluent-bit-custom.conf を追加します。
[OUTPUT] Name http Match * Host <endpoint> URI /receiver/v1/http/<token> Port 443 Header X-Sumo-Category ECS/FireLens/Custom/Fargate Header X-Sumo-Name ECS FireLens Custom tls on tls.verify off Format json_lines
- 「前提条件」セクションで説明したように、エンドポイントとトークンを置き換えます。
- 次の手順を実行して、Docker ファイルを変更します。
- 次のコマンドを使用して、イメージの fluent-bit-custom.conf を保存するカスタムディレクトリ /fluent-bit/etc/custom を追加します。
RUN mkdir -p /fluent-bit/bin /fluent-bit/etc /fluent-bit/log /tmp/fluent-bit-master/ /fluent-bit/etc/custom
- 次の行を追加して、fluent-bit-custom.conf をカスタムディレクトリにコピーします。
COPY fluent-bit-custom.conf /fluent-bit/etc/custom
- 標準命名規則に従って Makefile の名前を sumologic/aws:latest などに変更します。
- コマンド make release を使用して、イメージを作成します。
- コマンド docker push sumologic/aws:latest を使用して、イメージをパブリック リポジトリにアップロードします。
- 次のようにタスク定義を変更して、新しく作成されたイメージを使用し、カスタム設定を使用するオプションを設定します。
"firelensConfiguration": { "type": "fluentbit", "options": { "enable-ecs-log-metadata": "true", "config-file-type": "file", "config-file-value": "/fluent-bit/etc/custom/fluent-bit-custom.conf" } }
- サンプル JSON を使用して新しいタスク定義を作成し、アカウント ID とイメージ名を更新し、次のコマンドを実行します。
aws ecs register-task-definition --region us-west-1 --cli-input-json file:///httpd_fargate_sumologic_external_config.json
- 次のコマンドを実行してサービスを作成します。サブネットとセキュリティ グループの変数を実際の環境の値で置き換える必要があります。クラスタ サブネットおよび関連するセキュリティ グループは、AWS コンソールから決定できます。
aws ecs create-service --cluster fargate-cluster --service-name firelens-sumologic-fargate-ext-image --task-definition firelens-sumo-fargate-external-config-custom-image:1 --desired-count 1 --region us-west-1 --launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-1,subnet-2],securityGroups=[security group],assignPublicIp=ENABLED}"
トラブルシューティング
- クラスタがインターネットに接続してログを Sumo Logic に送信できることを確認します。
- その他のトラブルシューティングについては、こちらの説明を参照してください。