AWS Fargate에서 실행되는 애플리케이션 컨테이너가 Amazon CloudWatch, Amazon Data Firehose 또는 Splunk와 같은 여러 대상에 로그를 전달하기를 원합니다.
간략한 설명
Amazon Elastic Container Service(Amazon ECS) 작업 정의에서는 지정된 컨테이너에 대해 하나의 로그 구성 객체만 지정할 수 있습니다. 이 제한은 로그를 단일 대상으로만 전달할 수 있음을 의미합니다. Fargate의 Amazon ECS에서 여러 대상에 로그를 전달하려면 FireLens를 사용하면 됩니다.
참고: FireLens는 Fluent Bit 및 Fluentd 로그 포워더 모두에서 작동합니다. 다음 해결 방법에서는 Fluent Bit가 Fluentd보다 리소스 효율이 더 높기 때문에 Fluent Bit를 사용합니다.
해결 방법
사전 요구 사항:
다음 정보를 검토하세요.
- FireLens는 ECS 작업 정의의 logConfiguration 객체에 옵션으로 지정된 키-값 쌍을 사용하여 Fluent Bit 출력 정의를 생성합니다. 로그가 라우팅되는 대상은 Fluent Bit 구성 파일의 [OUTPUT] 정의 섹션에 지정됩니다. 자세한 내용은 Fluent Bit 웹사이트에서 Output를 참고하세요.
- FireLens가 사용자를 대신하여 구성 파일을 생성하지만 사용자 지정 구성 파일을 지정할 수도 있습니다. 이 구성 파일을 Amazon Simple Storage Service(Amazon S3)에서 호스팅할 수 있습니다. 또는 사용자 지정 출력 구성 파일이 추가된 사용자 지정 Fluent Bit Docker 이미지를 만들 수 있습니다.
- Fargate에서 Amazon ECS를 사용하는 경우에는 Amazon S3에서 구성 파일을 가져올 수 없습니다. 대신 구성 파일을 사용하여 사용자 지정 Docker 이미지를 만들어야 합니다.
IAM 권한 생성
참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.
작업 역할이 로그를 다른 대상으로 라우팅할 수 있도록 AWS Identity and Access Management(AWS IAM) 권한을 만듭니다. 예를 들어, 대상이 Data Firehose인 경우 firehose:PutRecordBatch API를 직접적으로 호출할 수 있는 작업 권한을 부여해야 합니다.
참고: Fluent Bit는 여러 플러그인을 로그 대상으로 지원합니다. CloudWatch 및 Kinesis와 같은 대상에는 logs:CreateLogGroup, logs:CreateLogStream, logs:DescribeLogStreams, logs:PutLogEvents 및 kinesis:PutRecords를 포함하는 권한이 필요합니다. 자세한 내용은 GitHub 웹사이트에서 CloudWatch 및 Kinesis에 대한 사용 권한을 참고하세요.
사용자 지정 출력 구성 파일을 사용하여 Fluent Bit Docker 이미지 만들기
-
선택한 [OUTPUT] 정의로 logDestinations.conf라는 사용자 지정 Fluent Bit 구성 파일을 생성하세요. 예를 들어, 다음 구성 파일에는 CloudWatch, Data Firehose 및 Splunk에 대해 정의된 구성이 포함되어 있습니다.
[OUTPUT] Name firehose
Match YourContainerName*
region us-west-2
delivery_stream nginx-stream
[OUTPUT]
Name cloudwatch
Match YourContainerName*
region us-east-1
log_group_name firelens-nginx-container
log_stream_prefix from-fluent-bit
auto_create_group true
[OUTPUT]
Name splunk
Match <ContainerName>*
Host 127.0.0.1
Splunk_Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
Splunk_Send_Raw On
참고: 대상에 따라 [OUTPUT] 정의에 지정해야 하는 필드가 다릅니다. 예시는 GitHub 웹사이트에서 amazon-ecs-firelens-examples를 참고하세요.
-
다음 Dockerfile 예제를 사용하여 사용자 지정 Fluent Bit 출력 구성 파일이 포함된 Docker 이미지를 생성하세요.
FROM amazon/aws-for-fluent-bit:latestADD logDestinations.conf /logDestinations.conf
참고: 자세한 내용은 Docker 웹사이트에서 Dockerfile 참조를 참고하세요.
-
사용자 지정 Fluent Bit Docker 이미지를 만들기 위해 생성한 Docker파일을 사용하려면 다음 명령을 실행합니다.
docker build -t custom-fluent-bit:latest .
중요: Dockerfile과 동일한 위치에서 docker build 명령을 실행합니다.
-
Docker 이미지가 Amazon ECS에서 사용 가능한지 확인하려면 Amazon Elastic Container Registry(Amazon ECR)로 Docker 이미지를 푸시합니다. 또는 Docker 이미지를 자체 Docker 레지스트리로 푸시합니다. 예를 들어, 로컬 Docker 이미지를 Amazon ECR로 푸시하려면 다음 명령을 실행하세요.
docker push aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest
-
작업 정의에서 FireLens 구성에 대한 옵션을 업데이트합니다.
{
"containerDefinitions": [
{
"essential": true,
"image": "aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest",
"name": "log_router",
"firelensConfiguration": {
"type": "fluentbit",
"options": {
"config-file-type": "file",
"config-file-value": "/logDestinations.conf"
}
}
}
]
}
참고: 사용자 지정 구성 파일을 지정하려면 FireLens 구성 파일에 config-file-type 및 config-file-value 옵션을 포함해야 합니다. 이러한 옵션을 포함하려면 AWS CLI 또는 Amazon ECS 콘솔을 사용하여 작업 정의를 생성합니다.
-
구성의 containerDefinition 섹션에서 image 속성을 수정하여 유효한 Amazon ECR 이미지 위치를 반영합니다. Amazon ECR 리포지토리에 이미지를 지정하려면 전체 registry/repository:tag 명명 규칙을 사용하세요. 예를 들면 다음과 같습니다.
aws_account_id.dkr.ecr.region.amazonaws.com/custom-fluent-bit:latest
다른 리포지토리를 사용하려면 작업 정의의 이미지 속성을 참고하세요.