이번 포스팅에서는 VPC 내부에 ALB+ECS Fargate를 만들어보자.
💡 VPC 구축은 포스팅 [Vpc + Alb + Ec2]을 참고하세요!
Alb를 만들기 위해 Target Group(대상그룹)부터 만든다.
타겟그룹은 Ecs Fargate 이므로 IP 유형으로 해야한다.
ECS생성시에 타겟대상을 잡아주는 과정이 있으므로 여기서 따로 추가할 필요없다.
생성 완료.
이번 포스팅에 보안그룹에서 헷갈릴만한 두 개를 미리 만들어 놓자.
주의할 점이라고 하면은 ECS에서 task를 수행 시 이미지를 가져올 때 80 포트로 개방을 해놔야한다는 점이다. 본인은 Alb에서 오는 인바운드만 열면된다고 생각해서 왜 이미지가 안가져와지는가 하며 한참을 헤맸다. (관련 에러는 포스팅 하단에서 기록함)
ALB를 만들어준다.
새로 생성한 ALB는 다음과 같다.
인터넷 게이트웨이를 간단하게 만들어주고 ECS에 사용할 VPC에 붙여주자.
그리고 Nat gateway도 만들어준다.
내 라우팅 테이블은 Public, Private 두 가지로 나누어져있다.
처음에는 뭐하러 나누나 했지만, 인터넷 게이트웨이와 Nat Gateway를 하나의 라우팅테이블로 두면 인터넷 게이트웨이가 방화벽기능으로 차단한다고한다. 이번 과정에서 나누는 이유를 알게 되었다.
ECS 작업 정의부터 만들어준다.
테스크 역할에는 해당 컨테이너가 다른 Aws 서비스에 api요청할 때 사용하므로 이번 포스팅에는 필요없다.
다음과 같이 넣어준다. 작업 실행 역할은 기본 role로 넣었다.
이 역할은 EC2관련, ECS관련 정책들이 들어가있다.
컨테이너의 이미지는 아파치 httpd 사용
테스트페이지를 띄우기 위해 환경에서 진입점과 명령을 입력해준다.
/bin/sh -c "echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground"
그리고 별다른 작업 없이 생성.
Fargate를 사용할 것이기 때문에 네트워크 전용 선택하며 시작한다.
기존 VPC 사용할 것이므로 별도 VPC 생성 X
다음 클러스터의 서비스를 생성해보자.
만들어 놓은 작업정의 선택
작업 개수는 1개여도 상관없다 ( 추후 조정가능)
그래도 2개 넣어서 진행
배포옵션은 롤링업데이트 방식
네트워크 구성에서 주의할점은 ECS가 Private 서브넷에 둘 경우 자동 할당 퍼블릭 IP를 Disabled 해준다. 로드밸런서를 타고 다닐꺼라 필요가 없다. 만약 Public 서브넷에 둘 경우는 Enabled로 설정한다.
이번에는 Private 서브넷에 둘 것이므로 Disabled해준다.
보안 그룹도 잘 확인해주자.
80포트로 개방되고, 로드밸런서에서 트래픽을 받을 수 있도록 인바운드가 설정되어있어야한다.
로드밸런서는 미리 생성해둔 ALB로 잡고
대상그룹도 앞서 미리 생성해둔 걸로 잡는다. 처음 대상그룹 만들 때 ip를 따로 안잡은 이유가 여기서 잡기 때문이다.
오토스케일링은 적용 X
생성해준다.
작업상태에서 프로비저닝 후 Running 상태가 되야한다.
만약 여기서 Pending상태가 지속되거나 Stop된 경우 로그를 확인해주자.
로그는 Stoped된 컨테이너의 작업번호를 클릭하고 해당 컨테이너를 보면 로그가 찍혀있다.
Running 상태인 것을 보았으면 타겟그룹에 들어가보면 알아서 잡혀있는 것을 볼 수 있다.
초록색으로 건강하다~!
ALB의 DNS NAME 으로 접속해보는 것으로 마무리한다.
끝.
Log
cannotpullcontainererror: error response from daemon: Get ~ net/http request canceled while waiting for connection(Client Timeout exceeded while awaiting headers)
이 에러는 ECS에서 이미지가 제때 받아와지지 않아 발생하는 에러로 무한로딩이 일어나 타임아웃이 발생한 것 같다. 다음을 통해 해결할 수 있다.
나는 2번의 Ecs에 사용한 보안그룹 인바운드에 로드밸런서만 들어오게 해놔서 이미지가 pull 하지 못해 발생한 경우다.
=> http 80으로 인바운딩을 추가하여 해결할 수 있었다.