ECS/Fargate の FireLens で Sumo Logic へログを送ってみた

こんにちは、望月です。

最近リリースされた FireLens により、ECS/Fargate タスクのログ出力先が柔軟に選択できるようになりました。

この FireLens を利用し、Sumo Logic に直接ログを取り込むようにしてみたのでご紹介します。

FireLens については下記ブログで紹介しているため、ここでは Sumo Logic の部分にフォーカスし、説明していきたいと思います。

[アップデート] ECS/Fargateでログ出力先をカスタマイズできる「FireLens」機能がリリースされました

やってみた

ホスト型コレクタの作成

FireLens からのログ送信先として利用するホスト型コレクタの作成します。

  • "Manage Data" -> "Collection" を選択
  • 右上に表示された "Add Collector" を選択
  • "Hosted Collector" を選択し、作成
  • "HTTP Logs & Metrics" を選択し、作成
    • 作成後、発行されたHTTPソースアドレスをメモる
    • 発行したHTTPソースアドレスは Fargate のログドライバー設定で必要となります。

これで Sumo Logic 側は準備完了となります。簡単ですね!

タスク定義の作成

ECS のタスク定義を作成していきます。

紹介した弊社ブログにも記載されていましたが、現在 FireLens の設定をするためにはコンソールからはできないため JSON を用意し、AWS CLI やコンソールから直接 JSON を流す必要があります。

AWS CLI から流し込むときは、バージョンが最新ではない場合はエラーとなる可能性があるため、注意してください。

  • 以下は自身の環境に合わせ、変更してください。
    • <account id>
    • <endpoint>
    • <token>
{
    "family": "firelens-sumologic-fargate",
    "executionRoleArn": "arn:aws:iam::<account id>:role/ecsTaskExecutionRole",
    "networkMode": "awsvpc",
    "cpu": "256",
    "memory": "512",
    "containerDefinitions": [
        {
            "name": "log_router_sumo",
            "image": "906394416424.dkr.ecr.ap-northeast-1.amazonaws.com/aws-for-fluent-bit:latest",
            "essential": true,
            "firelensConfiguration": {
                "type": "fluentbit"
            },
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "awslogs-ecs-fargate-sumo",
                    "awslogs-create-group": true,
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "awslogs-ecs-fargate-sumo"
                }
            }
         },
        {
            "name": "web-app",
            "image": "httpd:2.4",
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "entryPoint": [
                "sh",
                "-c"
            ],
            "command": [
                "/bin/sh -c \"echo 'FireLens Sumologic Fargate' > /usr/local/apache2/htdocs/index.html && httpd-foreground\""
            ],
            "logConfiguration": {
                "logDriver":"awsfirelens",
                "options": {
                    "Name": "http",
                    "Host": "<endpoint>",
                    "URI": "/receiver/v1/http/<token>",
                    "Port": "443",
                    "tls": "on",
                    "tls.verify": "off",
                    "Format": "json_lines"
                }
            }
        }
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ]
}
  • Sumo Logic へログ出力する設定部分は以下となります。
  • 発行したHTTPソースアドレスのエンドポイントとトークンは以下の形となります。
    • https://<endpoint>/receiver/v1/http/<token>
  • 以下は自身の環境に合わせ、変更してください。
    • <endpoint>
    • <token>
            "logConfiguration": {
                "logDriver":"awsfirelens",
                "options": {
                    "Name": "http",
                    "Host": "<endpoint>",
                    "URI": "/receiver/v1/http/<token>",
                    "Port": "443",
                    "tls": "on",
                    "tls.verify": "off",
                    "Format": "json_lines"
                }
            }

ログの確認

立ち上がったコンテナへアクセスを行い、ログが Sumo Logic へ出力されているか確認します。

  • "Manage Data" -> "Collection" を選択
  • 作成したコレクションから "Open in Log Search" をクリックし、Log Search を開く
  • JSON 形式でログが取り込まれていることを確認

まとめ

FireLens を利用し、Sumo Logic にログを取り込むことができました。

今まで ECS/Fargate から Sumo Logic にログを取り込むためには CloudWatch Logs に一旦ログを出力し、Kinesis や Lambda などを利用する必要があったかと思いますが、この方法を使えば CloudWatch Logs を介さず、Sumo Logic にログを取り込むことができます。

ログの用途などによって、Sumo Logic へ直接取り込みたいという場合には、こちらの方法がマッチするかと思いますので、試していただければと思います。

参考

AWS Fargate log collection - Sumo Logic