CloudWatch Logs의 비용을 줄이기 위해 S3 버킷으로 로그를 이동

CloudWatch Logs의 비용을 줄이기 위해 S3 버킷으로 로그를 이동시키는 방법에 대해서 정리해 봤습니다.
2024.02.18

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 CloudWatch Logs의 비용을 줄이기 위해 S3 버킷으로 로그를 이동시키는 방법에 대해서 정리해 봤습니다.

CloudWatch Logs 비용

CloudWatch Logs에 로그를 보존하다 보면 비용에 대해 생각하지 않을 수 없습니다.

CloudWatch Logs에서 로그의 수집, 데이터 저장량, 데이터 스캔 양에 따른 비용을 생각한다면 보존할 혹은 보존 해야할 로그가 많으면 많을수록 그만큼 요금이 발생할 것입니다.

CloudWatch Logs에서는 보존 기간을 별도로 설정하여 보존 기간이 지난 로그를 삭제할 수도 있지만, 장기간 보존해야 할 로그가 있거나 영구적인 보존을 목적으로 로그를 취득할 경우 어떻게 하면 비용을 절감시킬 수 있을까요?

Amazon S3를 활용

CloudWatch Logs의 비용을 절감하기 위해서 Amazon S3를 활용합니다.

Amazon S3에서는 다양한 객체 클래스를 제공하고 있으며 이 객체 클래스를 활용한다면 로그를 CloudWatch Logs 보다 저렴한 가격으로 보존할 수 있을 것입니다.

CloudWatch Logs에서 Amazon S3로 로그 전송

이번에는 CloudWatch Logs에서 Amazon S3로 로그를 전송해 보도록 하겠습니다.

먼저 로그를 보존할 S3 버킷을 생성합니다.

특별한 설정은 필요없으며, CloudWatch Logs의 리전과 동일한 리전으로 설정하고 버킷 이름을 입력한 다음 생성을 끝마칩니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.Region.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::my-exported-logs",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "AccountId1"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:Region:AccountId1:log-group:*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.Region.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-exported-logs/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "AccountId1",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:Region:AccountId1:log-group:*"
                }
            }
        }
    ]
}

이어서 S3 버킷의 관리 권한을 설정합니다.

기본적으로 S3 버킷은 비공개로 설정되어 있기 때문에 권한을 설정하여 CloudWatch Logs에서 S3 버킷으로 로그를 전송할 수 있도록 해야합니다.

  • my-exported-logs : 생성한 버킷 이름
  • Region : 리전 명
    • ex) ap-northeast-2
  • AccountId1 : 사용자 계정 ID

상기 3개 항목에 대해서는 본인 계정에서 설정한 환경에 맞추어 값을 변경합니다.

이어서 CloudWatch Logs로 들어와, 로그를 전송할 로그 그룹을 선택합니다.

그리고 작업에서「Amazon S3로 데이터 내보내기」를 클릭합니다.

  • 전송할 로그의 시작점과 끝지점을 지정합니다.
    • 예를 들어 2024년 2월 17일 11시 05분 부터 2024년 2월 18일 11시 05분에 저장된 로그를 전송하고 싶다면 상기 이미지와 같이 설정합니다.
  • 로그를 전송할 S3 버킷을 설정하고, 필요에 따라 접두사를 입력합니다.
    • 접두사의 경우 test/rds 식으로 접두사를 지정하면 해당 S3 버킷에 test/rds의 객체 폴더가 생성되며 해당 폴더에 로그가 저장됩니다.
  • 마지막으로「내보내기」를 클릭합니다.

CloudWatch Logs에서 로그를 전송한 결과를 확인하고 싶으면「Amazon S3에 대한 모든 내보내기 보기」를 클릭합니다.

해당 화면에서 로그의 전송 결과를 확인할 수 있습니다.

S3 버킷으로 들어와 확인해 보면, test/rds 경로에 로그가 보존된 것을 확인할 수 있습니다.

이러한 방법을 통해 CloudWatch Logs에서 S3 버킷으로 로그를 전송할 수 있으며, 라이프사이클과 객체 스토리지 클래스와 같은 방법으로 S3에 보존된 로그를 관리할 수도 있습니다.

하지만, 이렇게 매번 콘솔을 활용하여 S3 버킷에 로그를 전송하는 것보다 로그 전송을 자동화하는 것이 이상적이라 생각합니다. 자동화는 Amazon EventBridge, AWS Lambda와 같은 서비스를 이용하여 자동으로 S3 버킷으로 로그를 전송할 수 있도록 구현할 수 있습니다. 이러한 구현에 대해서는 별도 블로그를 통해서 다시 찾아뵙도록 하겠습니다.

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !