평상시와 같이 프로젝트를 진행하면서 AWS의 EC2 서버에도 배포를 하고 있었다. 그런데 테스트를 해봤을 때 수정한 코드가 적용되지도 않고 로깅이 제대로 되지 않고 있었다.
프로젝트에서 release 브랜치에 pull request를 날려서 merge하면 설정해둔 github actions가 실행되어 CodeDeploy를 통해 자동으로 배포되는 구조를 가지고 있다. 그러나 github actions는 문제 없이 잘 동작하고 있었고, 서버 설정에도 문제는 없어 보였다. 결론부터 말하자면, S3의 용량이 가득차서 발생한 문제였다.
서버 연결, DB 동작, EC2 서버에서 서버 실행 파일 수동으로 실행 등을 테스트 해봤음에도 문제를 찾지 못하고 있었다. 그러다가 AWS의 CodeDeploy 대시보드를 확인해보니 최근에 시도했던 목록들이 모두 실패로 떠있었고, 다음과 같은 에러 메세지를 확인할 수 있었다.
No space left on device - /opt/codedeploy-agent/deployment-root/ongoing-deployment/d-YB15FW0R1
용량이 부족해서 발생한 문제였다. 그래서 S3 파일 삭제(약 8.8GB) 삭제하니 정상적으로 배포가 되는 것을 확인할 수 있었다.
문제가 해결되기는 했지만, 배포파일이 쌓이다보면 언젠가 같은 문제가 터질 것이고, 그 때 가서 또 시간을 허비할 것이 뻔하다. 그렇기 때문에 이러한 일을 방지하기 위해 S3 파일 개수 또는 용량을 제한하거나 오래된 파일을 자동으로 삭제해주는 기능을 찾게되었다.
Amazon S3에서는 위와 같은 상황 등을 위해 수명 주기 규칙(Lifecycle rules)라는 기능을 제공하고 있다.
수명 주기 관리란?
S3 수명 주기 관리는 미리 정의된 정책으로 객체의 수명 주기를 정의하여 스토리지 비용을 절감할 수 있는 기능을 제공합니다. 수명 주기 전환 정책을 설정하여 S3 Standard 스토리지 클래스에 저장된 객체를 데이터 사용 기간에 따라 자동으로 S3 Standard-IA, S3 One Zone-IA 및/또는 S3 Glacier 스토리지 클래스로 마이그레이션할 수 있습니다. 또한, 객체 사용 기간에 따라 객체가 자동으로 삭제되도록 수명 주기 만료 정책을 설정할 수도 있습니다. 멀티파트 업로드 만료에 대한 정책을 설정할 수 있습니다. 이 정책에서는 업로드 수명에 따라 미완료 멀티파트 업로드를 만료합니다.
수명 주기 규칙에는 다양한 기능들이 있지만 나는 일정 기간이 지난 파일을 삭제하려고 한다. 먼저 규칙을 생성할 S3 버켓의 관리탭에 들어간다.
[수명 주기 규칙 생성] 버튼을 눌러주고 아래와 같이 내용을 입력한다. 수명 주기 규칙 이름은 임의로 설정해주면 되고, 모든 파일에 적용하고 싶기 때문에 [버킷의 모든 객체에 적용]을 선택해준다.
[객체의 현재 버전 만료를 선택]하고 경과 일수를 30일로 설정해준다.
[하나 이상의 필터를 사용하여 이 규칙의 범위 제한]을 선택하면 특정 폴더 또는 파일 이름을 포함할 때, 객체 태그, 크기 등을 지정하여 조건 적용 대상을 제한할 수 있다. 아래 사진에서는 folder 1
아래의 파일들에만 규칙을 적용한다.
마지막으로 수명 주기 규칙 작업의 요청당 요금이 청구된다고 하는데, 문서를 읽어봐도 사실 어떤 경우인지는 잘 이해를 못했다. 아마 객체의 이동, 삭제 등이 조건에 따라 수행될 때마다 객체 수 및 크기를 따져서 청구되는 것 같다.
AWS 요금 계산기에서 두드려보니 한 달에 1회 정도로는 요금이 청구되는 것 같지는 않은데... 다음달에 청구되는 비용을 확인해봐야 알 것 같다. 개인 프로젝트 수준에서는 신경쓰지 않아도 되지 않을까 싶다.