Amazon Web Services ブログ

Firelens の発表 – コンテナログの新たな管理方法

本日、AWS でコンテナサービスを構築した素晴らしいチームが、従来に比べて非常に簡単にログを取り扱うことを可能にする AWS FireLens と呼ばれる新たな優れたツールを立ち上げました。

FireLens を使用することで、顧客は、デプロイメントスクリプトを修正したり、手動で追加のソフトウェアをインストールしたり、追加コードを書き込んだりすることなく、コンテナログをストレージや分析ツールに直接追加できます。Amazon ECS または AWS Fargate の設定をいくつか更新することにより、必要な場所にコンテナログを送信することを FireLens に指示するため、宛先を選択し、オプションでフィルターを定義します。

FireLensFluent Bit または Fluentd と動作します。このことは、それらのオープンソースのプロジェクトによりサポートされた宛先にログを送信できることを意味します。AWS ソリューションアーキテクトによりレビューされた AWS Partner Network 製品のリストを確認できるウェブページを維持します。FireLens を使用して、これらの製品にログデータやイベントを送信できます。

FireLens を理解するのに最も簡単な方法は使ってみることです。そこで、このブログの投稿では、Amazon ECS にあるコンテナを用いて、FireLens を使用して、コンテナログを Amazon CloudWatch に転送するデモンストレーションを行います。

まず、タスク定義を設定する必要があります。GitHub の Amazon ECS FireLens の例から定義の例を取得しました。

AWS Identity and Access Management (IAM) ロールを独自の taskRoleArn および executionRoleArn IAM ロールに代替し、また、ブラウザから NGINX コンテナにアクセスできるよう、ポートマッピングを追加しました。

{
	"family": "firelens-example-cloudwatch",
	"taskRoleArn": "arn:aws:iam::365489000573:role/ecsInstanceRole",
	"executionRoleArn": "arn:aws:iam::365489300073:role/ecsTaskExecutionRole",
	"containerDefinitions": [
		{
			"essential": true,
			"image": "906394416424.dkr.ecr.us-east-1.amazonaws.com/aws-for-fluent-bit:latest",
			"name": "log_router",
			"firelensConfiguration": {
				"type": "fluentbit"
			},
			"logConfiguration": {
				"logDriver": "awslogs",
				"options": {
					"awslogs-group": "firelens-container",
					"awslogs-region": "us-west-2",
					"awslogs-create-group": "true",
					"awslogs-stream-prefix": "firelens"
				}
			},
			"memoryReservation": 50
		 },
		 {
			 "essential": true,
			 "image": "nginx",
			 "name": "app",
			 "portMappings": [
				{
				  "containerPort": 80,
				  "hostPort": 80
				}
			  ],
			 "logConfiguration": {
				 "logDriver":"awsfirelens",
				 "options": {
					"Name": "cloudwatch",
					"region": "us-west-2",
					"log_group_name": "firelens-fluent-bit",
					"auto_create_group": "true",
					"log_stream_prefix": "from-fluent-bit"
				}
			},
			"memoryReservation": 100
		}
	]
}

タスク定義をローカルフォルダに保存してから、タスク定義を登録するために AWS Command Line Interface (CLI) を使用しました。

aws ecs register-task-definition --cli-input-json file://cloudwatch_task_definition.json

この事例では、すでに ECS クラスターを設定していますが、設定していない場合は、ECS ドキュメントで設定方法を確認できます。以下のコマンドで、新しく登録されたタスク定義を使用して、自分のECS クラスターにサービスを作成できます。

aws ecs create-service --cluster demo-cluster --service-name demo-service --task-definition firelens-example-cloudwatch --desired-count 1 --launch-type "EC2"

Amazon ECS コンソールにログインし、サービスやタスクを見ていくと、外部リンクを公開するコンテナを発見しました。この IP アドレスが公開されるのは、タスク定義内部で、コンテナがコンテナポートのポート 80 をホストポートのポート 80 にマップするようリクエストしたことによります。

その IP アドレスにブラウザでアクセスすると、アプリとして使用した NGINX コンテナがデフォルトのページになります。NGINX コンテナは、受領したリクエストを stdout に記録するため、FireLens はこれらのログを CloudWatch に転送しません。URL に簡単なメッセージを追加しました。これは、ログを見たときに、このリクエストを他のリクエストから素早く識別できるようにするためです。

その後、Amazon CloudWatch コンソールに移動し、firelens-fluent-bit のロググループをドリルダウンしました。これが当初のタスク定義で設定したロググループ名であったことを思い出してください。以下では、ログストリームにいくつかログがあり、最後のログがつい先ほどブラウザで行ったリクエストであることがわかります。ログをよく見れば、「IT WORKS」が GET リクエストの一部としてパスされていることがわかります。

これで、正常に FireLens を設定し、 CloudWatch にコンテナログを転送できました。もちろん、Datadog のような第三者プロバイダーや、Amazon Kinesis Data Firehose のような AWS の宛先など、異なる宛先を選択することもできました。

FireLens をお試しになりたい場合、Amazon ECS および AWS Fargate をサポートするすべてのリージョンで本日からご利用いただけます。

ログをお楽しみください。