ECS, ALB - 동적 포트 매핑 활성화와 DNS 접속
ECS를 동적 포트 매핑을 활성화하고 ALB DNS를 이용해 접속해 보자.
이전 포스팅에서 ECS 태스크 정의에서 호스트 포트와 컨테이너 포트를 전부 8081로 설정해 주고, 재 배포가 진행되면 8081 포트가 이미 사용 중이라는 에러를 만났었다. 그래서 호스트 포트를 0으로 설정해서 동적 포트를 활성화시켰더니 포트 충돌 에러가 해결됐다. 그리고 이름 확인하기 위해 ALB DNS로 접속해 확인해 보자
동적 포트 매핑
- ECS에서 호스트 포트를 0으로 설정하는 것은 "동적 포트 매핑"을 활성화하는 것이다.
- 이렇게 설정하면, ECS는 컨테이너가 시작될 때 사용 가능한 포트를 자동으로 할당받는다. 이 방법은 여러 인스턴스에서 같은 컨테이너를 실행할 때 포트 충돌을 방지하는 데 유용하다.
8081 충돌 에러 해결 과정
1. 서비스를 ECS 클러스터에 배포할 때, 각 태스크가 컨테이너를 실행하고 해당 컨테이너가 특정 포트에서 애플리케이션을 서비스한다. 이 경우 컨테이너 포트는 8081로 설정했다.
2. 원래는 호스트 포트도 8081로 설정하여 컨테이너의 8081 포트를 직접 호스트의 8081 포트에 매핑했다. 이는 태스크의 각 인스턴스가 호스트의 8081 포트를 사용해 트래픽을 처리하도록 했다.
3. 하지만 배포 과정에서 '포트 8081이 이미 사용 중'이라는 에러가 발생했다. 이는 동일한 호스트에서 여러 태스크를 실행하려 할 때 발생할 수 있는 문제로, 한 호스트의 특정 포트는 한 번에 하나의 태스크에서만 사용할 수 있다.
4. 이 문제를 해결하기 위해 호스트 포트를 0으로 설정하여 동적 포트 매핑을 활성화했다. 이렇게 하면 ECS가 태스크가 시작될 때 사용 가능한 호스트의 어떤 포트든지 자동으로 컨테이너 포트에 할당한다.
ALB 대상 확인
로드 밸런서에 들어가서 직접 health check를 통과한 포트를 확인해 보자.
아래 보이는 바와 같이 32772 포트로 생성된 인스턴스가 보인다.
이제 포트 충돌 문제는 해결되었으니 제대로 배포가 되었는지 확인해 보자.
ALB DNS로 접속하기 - port 적으면 접속 불가
접속 불가 이슈
여기서 깜빡하고 내가 로드 밸런서를 적용하기 전처럼 'ALB-DNS:8081/test-url'을 입력해서 접속했더니 화면이 로깅이 걸리면서 접속이 안 되는 이슈가 생겼다.
그래서 새로 할당받은 포트인 32772로도 연결을 시도해 봤다. 그래도 접속이 안 됐다.
접속 불가 이유
ALB(Application Load Balancer)는 표준 HTTP 또는 HTTPS 포트(각각 80과 443)에서 들어오는 요청을 받는다.
컨테이너 내부에서 애플리케이션이 8081 포트를 사용하더라도, 외부에서는 ALB의 DNS 이름에 8081 포트를 추가하여 접근할 수 없다.
ECS에서 호스트 포트를 0으로 설정하면 ECS가 자동으로 사용 가능한 포트를 선택하여 컨테이너에 할당한다.
이 때문에 외부에서는 어떤 포트를 사용해야 하는지 알 수 없으며, 실제로 ALB가 이 동적으로 할당된 포트를 관리한다.
사용자가 'ALB-DNS:8081/mapping-url'로 접속 시도를 하면 다음과 같은 이유로 접속이 막힌다:
- ALB 설정에서 8081 포트에 대한 리스너가 없기 때문에, ALB는 해당 포트로 들어오는 요청을 받지 않는다.
- ALB는 80과 443 포트로 들어오는 요청만을 받아서 내부적으로 ECS 서비스의 태스크로 라우팅 한다.
- 클라이언트는 ALB의 DNS 주소만 입력하면 되고, ALB가 적절한 태스크로 요청을 전달한다.
따라서, 외부에서 애플리케이션에 접근하려면 단순히 ALB의 DNS 주소만 입력하고, 특정 포트 번호를 추가하지 않아야 한다.
ALB는 내부적으로 ECS 태스크의 동적 포트로 요청을 라우팅 하기 때문에, 외부에서 ECS 태스크의 내부 포트로 직접 접속하는 것은 허용되지 않는다.
이러한 이유로 포트를 적지 않고 'ALB-DNS/mapping-url'로 접속하면 제대로 접속되는 모습을 볼 수 있다.
마무리
이번 기회에 동적 포트 매핑과 로드 밸런서에 대해서 잘 이해하게 된 것 같다.
그동안 당장 에러만 해결하기 급급해서 해결 방안에 대해서 제대로 이해하지 않고 넘어간 적이 많았는데 지금은 해결 방안도 하나하나 짚어가면서 공부하다 보니 더 잘 이해가 되고 다음부터 같은 실수는 하지 말아야겠다고 생각했다.
'AWS' 카테고리의 다른 글
[AWS] SNS, SQS 연동하기 (1) - SNS, SQS 생성하기 (0) | 2023.11.06 |
---|---|
[AWS] IAM MFA 설정하기 (1) | 2023.11.05 |
[AWS] ECS 배포 실패해도 서버가 다운 안되는 이유 - ECS 서비스 롤링 업데이트 방식 (1) | 2023.11.04 |
[AWS] ECS와 RDS 연동하기 (4) - Secrets Manager 이용해서 환경변수 적용하기(IAM 정책, Spring Boot 코드 수정) (1) | 2023.11.04 |
[AWS] ECS와 RDS 연동하기 (3) - Secrets Manager 이용해서 환경변수 적용하기 (0) | 2023.11.03 |