ECS-EC2 서비스를 도입하면서 로깅 라이브러리를  Log4j2 -> Logback 으로 대체하였습니다.

그 이유로는 ECS 환경은 컨테이너의 리소스 제한이 되므로 가벼운 Logback 프레임워크가 장점이 많습니다.

 

AwsLogsAppender class를 활용하여 logback 설정을 적용하였습니다.

    <appender name="CloudWatchJsonAppender" class="ca.pjer.logback.AwsLogsAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">            
		...
        </encoder>
        <logGroupName>${LOG_GROUP_NAME}</logGroupName>
        <logStreamUuidPrefix>${LOG_GROUP_PREFIX}</logStreamUuidPrefix>
        <logRegion>${LOG_GROUP_REGION}</logRegion>
        <!-- AWS SDK 다음 순서로 자격 증명을 찾습니다:
             1. 환경 변수 
             2. Java 시스템 프로퍼티 
             3. 기본 자격 증명 프로필 
             4. ECS 컨테이너 자격 증명 
             5. EC2 인스턴스 프로파일 -->
        <!--        <accessKeyId>${AWS_ACCESS_KEY}</accessKeyId>-->
        <!--        <secretAccessKey>${AWS_SECRET_KEY}</secretAccessKey>-->
    </appender>

    <appender name="ConsoleJsonAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
		...
        </encoder>
    </appender>

 

그 이후 ECSTaskExecutionRole IAM 권한에 Cloudwatch 권한을 추가하였습니다.

-> 다른 블로그에서 accessKeyId, secretAccessKey를 코드화하는 예제가 있습니다.

Git으로 업로드 시 중요 정보가 노출될 수 있으므로 IAM 권한을 사용하는 것을 추천합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CloudWatchLogsFullAccess",
            "Effect": "Allow",
            "Action": [
                "logs:*",
                "cloudwatch:GenerateQuery"
            ],
            "Resource": "*"
        }
    ]
}

 

 

하지만 ECS CloudWatch에서 API 호출 로그가 남지 않는 문제가 발생하였습니다.

  1. CloudWatchJsonAppender 적용 : API 호출 관련 로그 조회
  2. ConsoleJsonAppender 적용 : 애플리케이션 실행까지 로그는 조회 능하나, API 호출 로그 조회되지 않음

AWS 솔루션 아키텍처분께 문의하여 답변받은 사항 공유합니다.

 

ECS에서 Log가 수집되는 절차는 일반적으로 다음과 같습니다.

Application log -> Docker log -> ecs-agent log collector -> CloudWatch

 

ecs-agent log collector가 실행되고 있는 컨테이너에는 TaskExecutionRole IAM 권한을 상속받기 때문에

애플리케이션 실행까지 log가 생성됩니다.

 

그러나 Logback을 사용하는 경우에는 아래와 같이 로그가 저장됩니다.

Application log -> Logback -> Console or file

 

Logback은 직접적으로 CloudWatch에 쓸 수 있는 권한이 없기 때문에 log가 남지 않습니다.

그러나 CloudWatchJsonAppender를 사용하게 되면 Credential 설정으로 CloudWatch 권한을 부여받아

CloudWatch log를 생성할 수 있습니다.

 

다만, AwsLogsAppender 라이브러리가 AWS에서 인증하고 있는 라이브러리가 아니므로,

Cloudwatch 서비스 부하가 발생할 수 있어 개발단계에서만 사용하는 것을 권장합니다.

 

운영환경 CloudWatch 로그 관리에 대해서는 추후에 정리하여 블로그에 업로드 하겠습니다.

읽어주셔서 감사합니다.

 

레퍼런스 
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기