서론 Cognito의 역할 Cognito는 아래 그림과 같이 동작한다. - 클라이언트 측에서 특정 경로로 접속하려고하는데, 그 경로가 권한이 부여되어있다면 접근이 제한된다. - 클라이언트는 Cognito의 앱 클라이언트로 들어가서 로그인을 실행한다. - 로그인에 성공하면 Cognito에서 인증 토큰을 발급하여 클라이언트 측으로 전송한다. 그리고 Cognito에 의해 Callback URL로 redirect되어 API gateway에 다시 접근하게 된다. - HTTP API gateway는 JWT 권한 부여자를 통해 헤더의 JWT를 인식하고 이를 Cognito에 보내서 알맞은 토큰인지 검증 요청한다. - 토큰이 알맞은 토큰일 경우 라우팅으로 접속하여 어플리케이션을 실행시켜 응답을 클라이언트에게 돌려준다. ..
서론 지난 포스팅에서 AWS ECR까지 생성하는 것을 진행해보았다. 이번 글에서는 내용을 이어서 VPC Endpoint를 생성하여 AWS ECR과 AWS ECS를 연결하고, 컨테이너 인스턴스를 구동하여 동작이 되는 것까지 확인해보도록 하겠다. VPC Endpoint 생성 VPC Endpoint를 통해 Private subnet 상에 있는 ECS와 ECR을 서로 연결해주면 ECR에 있는 이미지를 ECS가 가져와 쓸 수 있다. 인터페이스 엔드포인트 생성 앞서 VPC 엔드포인트는 크게 인터페이스 엔드포인트와 게이트웨이 엔드포인트가 있다고 하였다. 우리는 Private link를 사용하여 AWS ECR 과 ECS를 연결해야 하므로 인터페이스 엔드포인트를 생성하겠다. 이름은 임의로 입력한다. ECR은 AWS의 서..
서론 프로젝트를 진행하면서 HTTP API gateway와 Network Load Balancer를 통합해봤다. 하지만 이 통합 방식에는 단점이 하나 있었는데, API gateway의 라우팅 주소가 실제 어플리케이션 코드에서 라우팅 주소와 정확히 일치해야 정상 작동하는 것이었다. 문제를 그림으로 설명하면 다음과 같다. 현재 프로젝트 서비스 구조는 다음과 같이 세가지 개별적 VPC에 API gateway가 라우팅 하는 형태로 되어있다. API gateway의 리소스 "/customer"에 접근하면, 소비자 서비스의 루트 경로로 들어가고 "/restaurant"에 접근하면, 음식점 서비스의 루트 경로로, "/rider"에 접근하면 배달기사 서비스의 루트 경로로 접근하게 하고 싶다. 원하던 동작 API gat..
서론 지난 글에서 NAT gateway를 사용하여 private subnet에서 Docker Hub에 요청을 보내어 docker image를 가져오는 실습을 진행해봤다. 글을 마치면서 NAT gateway 단점으로 비용이 많이 발생한다는 것을 언급하였다. 실제로 서비스를 이용해보니 NAT gateway의 비용이 상당하게 부과되는 것을 경험하였다. 아래는 글쓴이의 AWS Billing Dashboard의 청구서 페이지를 일부 캡쳐한 것이다. NAT Gateway를 361시간 사용하고 21.3달러가 청구되었다. NAT gateway는 시간당 0.059 달러 비용이 발생하는 것이다. (리전마다 비용이 다르다.) 이는 꽤 부담스러운 가격이다. NAT gateway가 얼마나 비싼지 감이 안 온다면 아래 표도 참고..
Private Subnet에서 배포하면서 생긴 문제 프로젝트 진행 중에 AWS ECS가 생성되지 않는 문제가 발생했다. 현재 프로젝트 설계 구조는 다음과 같이 VPC 내 프라이빗 리소스를 통해 API gateway - Load balancer - Container Service 가 연결되어있는 구조다. 보안상의 이유로 어플리케이션인 ECS에는 외부에서 접속하지 못하게 해야한다. 우리 어플리케이션의 인증/인가는 API gateway와 Cognito에서 이뤄지기 때문에 ECS에는 인증/인가 프로세스가 없기 때문이다. 그래서 허가되지 않은 외부 사용자는 ECS에 접근할 수 없어야 한다. Private subnet에서 ECS를 생성하려고 하면 딜레이가 발생하다가 생성되지 않는 문제가 발생한다. 이 문제를 해결하..
서론 Spring 프로젝트를 도커 이미지로 만들어 클라우드에서 구동하려고 했으나 이에 관련하여 one way로 깔끔하게 정리되어있는 문서를 보지 못한 것 같아서 정리해두려고 한다. 또한 코드를 업데이트하고 나서 BootJar로 빌드 하지 않아서 코드의 변경사항이 반영되지 않는 실수를 방지하고자 한다. 해당 글은 build 도구로 Gradle을 사용하며, IDE로 IntelliJ를 사용하는 것을 기준으로 한다. 또한 해당 실습을 하기 위해서는 Docker Hub 계정이 있고, Docker가 local 환경에 설치되어 있어야 한다. Spring Project로 Docker image 만들기 프로젝트 생성 컨트롤러를 생성해서 RestContoller를 사용하여 라우팅한다. 현재 프로젝트는 루트 주소에 대해서만..