![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/sTUBo/btsE3prV0fo/oxeIi8d9xtzKauVXBKIHp0/img.png)
Java5에서 추가된 Future는 비동기 작업의 결과를 나타내는 인터페이스다. Future는 작업이 아직 완료되지 않았더라도 결과에 접근할 수 있는 방법을 제공한다. 예제 코드 import java.util.concurrent.*; public class FutureExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executor = Executors.newSingleThreadExecutor(); // 비동기 작업 생성 Future future = executor.submit(() -> { Thread.sleep(2000); // 비동기 작업 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/btHeNj/btsEWAhkQwZ/scZGaR1fk3iBUXkDeSaYq0/img.png)
https://sh970901.tistory.com/136 gitlab runner docker in docker 구조 대표적인 CICD(Continuous Integration/Continuous Delivery) 도구들 (gitlab runner, github action, jenkins 등) 이 있지만 이 글에서는 gitlab runner를 사용해 구축하는 과정에서 겪었던 이슈와 해결, 궁금증 대한 정리를 sh970901.tistory.com 상단 포스팅에서 도커 환경의 CI 구성에 대해 간략하게 설명했으니 참고하면 좋을 듯 하다. 이번 포스팅에서는 어떻게 Host와 Gitlab-Runner, 그리고 Runner의 executor Container들이 .m2를 캐싱시킬 것인가에 대해서 작성하려고 한..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ZoiJo/btsESnisPSw/zCdHuyDuKgMP0PRW9rbD8K/img.png)
ECS + Fargate 구축 과정에서 Log 를 보기 위해서는 아주아주 번거롭다. Private Subnet에 구축된 서버리스 환경에 컨테이너에 접근하기 위해 EC2에 접근하고 컨테이너에 접근하여야하는데, 이마저도 ECS에 execute command 설정이 필요하다. 따라서 외부에서 로그를 편하게 볼 수 있는 방법에 대해 고민에 빠졌다. Log Appender를 구축하여 클러스터 외부에 Fluent를 구축하여 한곳에서 로그를 받아 처리할까 했지만 AWS에서는 FireLens라는 기능을 출시했다하여 사용해본 과정과 후기를 적어보려고 한다. Fluentd: 플러그인 구조를 갖고 있는 로그 라우팅, 정제, 변환, 수집을 담당하는 툴 Fluent Bit: Fluentd의 경량화 버전 AWS FireLens는..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/mtz20/btsD2I1D2O9/ju26SXQwkKWEfGc3D3hIK1/img.png)
대표적인 CICD(Continuous Integration/Continuous Delivery) 도구들 (gitlab runner, github action, jenkins 등) 이 있지만 이 글에서는 gitlab runner를 사용해 구축하는 과정에서 겪었던 이슈와 해결, 궁금증 대한 정리를 담아보려고 한다. 개발관련된 툴들을 docker compose로 관리하기 위해 호스트는 하나의 EC2에서 진행하였고 따라서 gitlab runner를 컨테이너 환경에서 실행하였다. 기본적인 구축 셋은 다른 사람들의 예시가 많으니 참고해도 좋고 문서에 내용을 그대로 진행해도 좋다. https://docs.gitlab.com/runner/install/docker.html Run GitLab Runner in a co..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/borwJa/btsDAihfw6Y/EmEtu2vsxULIaOPXVoqkL0/img.png)
이슈는 간단했지만 해결책은 결국 돌고 돌았던 내용을 정리해보려고 한다. (최종 코드는 맨 하단을 참고) 일반적인 url path에 대한 400이나 404 등의 에러 핸들링은 성공적으로 진행되었고 문제가 없었다. ErrorController, @ExceptionHandler을 적절히 사용하여 커스텀하게 에러를 핸들링하고 있던 도중 url에 특수문자가 들어간 경우 톰 캣의 버전이 노출된다는 요청이 있었고 보안상 막을 필요가 있었다. 첫번째로 의문이 들었다. 왜 내가 만든 ErrorController를 타지 않는 것이지? 디버깅을 해볼 필요도 없었다. 요청에 대한 트레이싱 정보가 아예 애플리케이션에 전달 조차 되지 않았다. 내가 생각한 것보다 더 앞단에서 막는 것 같다는 생각이 들었고 이것저것 찾아보기 시작했..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/tHdJ2/btsDfQrkT2C/a0sRHyk6gjJCbp9J0Q7691/img.png)
200개가 넘는 국가에서 2000개가 넘는 IP를 통해 수십만건의 요청(공격)이 1분동안 발생했다. 유효한 API 요청이였지만 파라미터 값이 모두 널(null) 값 이기에 일반적으로 제공하지 않는 요청이였다. 이것이 DDOS 공격인가 싶었다. 이전에 토이프로젝트로 만들어둔 RateLimiter를 사용할 때인가 싶었지만, 수천개의 IP에서 보내는 것이기에 룰이 애매했다. https://github.com/sh970901/TOTORO 이로 인해 JVM OOM(Out Of Memory)이 발생하였고 서비스는 장애가 났다. 이정도 TPS에 뻗을만한 일인가 싶었다. SEO 이후에 자주 이런 비정상요청이 있었지만 서비스가 뻗은 것은 처음이였다. 생각해보니 늘 요청하는 API는 달랐고 이번에 공격받은 API는 처..