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 호출 로그가 남지 않는 문제가 발생하였습니다.
- CloudWatchJsonAppender 적용 : API 호출 관련 로그가 조회
- 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 로그 관리에 대해서는 추후에 정리하여 블로그에 업로드 하겠습니다.
읽어주셔서 감사합니다.
레퍼런스
최근댓글