ECS로 docker container를 띄우기 위해 Task Definition을 작성하다 보면 container에 port mapping 하는 부분이 있다. 이 설정을 통해 host의 port를 container의 port로 매핑시킬 수 있다.
Port Mapping
예를 들어 8080:80, 8081:81, 8082:82 포트로 매핑을 시킨 Task Definition을 가지고 container를 생성하면 아래 그림과 같다.
호스트의 8080 포트로 요청이 오면 80번 포트에서 기다리는 container로 보낸다. 8081 포트는 81번 포트, 8082 포트는 82번 포트에서 기다리는 container로 보낸다.
ECS Cluster가 관리하는 ECS Instance에 각 task가 띄워질 테니, 외부에서는 요청하려고 하는 container의 매핑된 호스트의 포트번호를 사용하면 된다. 이렇게 하면 ECS Service가 task 관리도 해주고, container까지 매핑도 잘 된다.
하지만 한 가지 문제점이 있다. 하나의 인스턴스에 같은 포트를 사용하는 container를 동시에 띄울 수 없다는 점이다. 실제로 ECS Cluster의 인스턴스를 n개 설정한 상태에서, 같은 호스트 포트를 가지는 task definition의 Desired count를 n개 보다 크게 설정해도 최대 n개의 task만 실행된다.
자원을 효율적으로 사용하려고 하는 측면에서 보면 상당한 제약이다. 이를 해결하기 위해 dynamic port mapping을 사용한다.
Dynamic Port Mapping
Dynamic port mapping은 container에 매핑되는 호스트의 포트를 고정하지 않는다. ECS가 Ephemeral Port 중 하나의 값을 알아서 매핑시켜준다. 선언하는 방법은 Task Definition에 있다. 해당 container의 Host Port를 0으로 설정하면 동적 포트 매핑이 된다.
이렇게 Dynamic Port Mapping으로 만든 Task Definition으로 인스턴스를 띄우면 호스트의 포트는 임의로 지정된다. 이 임의로 생성된 포트로 요청을 날려야 하는데 이 블랙박스를 ALB(Application Load Balancer)가 대신해준다.
ALB는 사용자는 몰라도 되는 ECS에서 임의로 생성되는 포트로 알아서 요청을 분산한다. 덕분에 하나의 인스턴스에 여러 task를 쉽게 서비스할 수 있다.
한 가지 주의할 점은 ECS가 기존에 사용하는 고정된 포트가 아닌 임의의 포트를 사용하기 때문에 ECS의 security group에 inbound로 0 - 65535 포트를 추가해야 한다. 보안을 위해 source 부분에는 alb의 security group만을 허용하도록 제한도 필요하다.
'aws' 카테고리의 다른 글
AWS Lambda (0) | 2020.04.27 |
---|---|
AWS DynamoDB (0) | 2020.04.26 |
AWS VPC를 연결하는 서비스 (0) | 2020.04.19 |
AWS SNS(Simple Notification Service) (0) | 2020.04.12 |
AWS SQS(Simple Queue Service) (0) | 2020.04.12 |
댓글