Amazon Web Services 한국 블로그

AWS Firelens – 컨테이너 로그 통합 관리 기능 출시

AWS에서 컨테이너 서비스에서 만들어진 전체 로그를 훨씬 더 간편하게 처리하는 AWS FireLens라고 하는 모니터링 도구를 새로 출시했습니다. FireLens를 사용하면 고객은 배포 스크립트를 수정하거나 직접 추가 소프트웨어를 설치하거나 추가 코드를 작성하지 않고도 스토리지와 분석 도구에 컨테이너 로그를 보낼 수 있습니다. Amazon ECS 또는 AWS Fargate에서 몇 가지 구성을 업데이트하면 대상을 선택하고 필요한 경우 필터를 정의하여 FireLens에서 필요한 위치로 컨테이너 로그를 전송하도록 지시할 수 있습니다.

FireLens는 Fluent Bit 또는 Fluentd와 함께 작동하므로, 이러한 오픈 소스 프로젝트에서 지원하는 모든 대상에도 로그를 전송할 수 있습니다. AWS 솔루션 아키텍트가 검토한 AWS Partner Network 제품 목록을 볼 수 있는 웹 페이지를 관리하고 있습니다. FireLens를 사용하여 이러한 제품으로 로그 데이터나 이벤트를 전송할 수 있습니다.

FireLens를 이해하는 가장 간단한 방법은 직접 사용해보는 것입니다. 그래서 이 블로그 게시물의 나머지 부분에서는 Amazon ECS의 컨테이너에서 FireLens를 사용하고 컨테이너 로그를 Amazon CloudWatch로 전달하는 작업을 보여드리고자 합니다.

먼저, 태스크 정의를 구성해야 합니다. 그래서 Amazon ECS FireLens Examples on GitHub에서 예제 정의를 가져왔습니다.

AWS Identity and Access Management(IAM) 역할을 제 taskRoleArnexecutionRoleArn 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 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 콘솔에 로그인하고 서비스와 태스크를 탐색하면 외부 링크를 공개하는 컨테이너 정의를 찾을 수 있습니다. 태스크 정의 안에 호스트 포트(포트 80)에 컨테이너 포트(포트 80)를 매핑하도록 요청했기 때문에 이 IP 주소가 공개된 것입니다.

브라우저에서 해당 IP 주소로 이동하면 앱으로 사용하는 NGINX 컨테이너가 기본 페이지를 지원합니다. NGINX 컨테이너는 Stdout에 수신되는 모든 요청을 로깅하고 이제 FireLens는 이러한 로그를 CloudWatch로 전달합니다. 로그를 볼 때 다른 요청들 중에서 이 요청을 더 빨리 식별할 수 있도록 URL에 짧은 메시지를 추가했습니다.

Amazon CloudWatch 콘솔로 이동한 후 firelens-fluent-bit 로그 그룹을 탐색합니다. 이 로그 그룹 이름은 원래 태스크 정의에서 설정한 이름입니다. 아래에서 로그 스트림에 몇 개 로그가 있고 마지막 로그가 브라우저에서 방금 작성한 요청임을 확인할 수 있습니다. 로그를 더 자세히 보면 GET 요청의 일부로 “IT WORKS”가 전달되었음을 알 수 있습니다.

자, 이제 FireLens를 설정했고 컨테이너 로그를 CloudWatch로 전달했습니다. 물론, Datadog와 같은 타사 공급업체나 Amazon Kinesis Data Firehose와 같은 AWS 대상 등 여러 대상을 선택할 수 있습니다.

FireLens를 사용해보고 싶다면 Amazon ECSAWS Fargate를 지원하는 모든 리전에서 오늘 바로 사용할 수 있습니다.

즐거운 로깅을 직접 체험해보세요!

– Martin Beeby;