# Sample Project 다운로드
다음 명령어를 수행하여 애플리케이션 구성에 필요한 코드를 다운로드합니다.
```
git clone https://github.com/hijigoo/ecs-fargate-sagemaker-based-webservice
```
# AWS Fargate 기반 Web Service 구성
AWS Fargate 기반 Web 서비스를 구성하기 위해서 여러 단계를 거칩니다. 먼저 다운로드한 프로젝트에서 Web Application을 Docker로 빌드합니다. 그리고 빌드한 이미지를 Amazon ECR 에 등록하여 AWS ECS Service 에 배포할 준비를 합니다. 다음으로 Web 서비스와 로드 밸런서에 적용할 Security Group을 생성하고 로드 밸런서를 생성합니다. 마지막으로 Web 서비스 구성을 위한 태스크 정의를 하고 Web 서비스를 생성합니다.
## Web Application 빌드
다운로드한 프로젝트에서 [Web Application](https://github.com/hijigoo/ecs-fargate-sagemaker-based-webservice/tree/main/web)을 빌드합니다. 콘솔이나 터미널에서 /web 폴더로 이동 후 다음 명령어로 Docker 빌드를 진행합니다.
```
docker build -t app-web .
```
Mac M1, M2 환경에서는 기본 linux/arm64로 빌드되기 때문에 다음 명령어로 Docker 빌드를 수행합니다.
```
docker buildx build --platform=linux/amd64 -t app-web .
```
Docker 이미지가 빌드되었는지 확인합니다.
```
docker images
```
## Amazon ECR 에 Web Application 이미지 등록
Amazon ECR(Elastic Container Registry) 콘솔로 이동 후 왼쪽 메뉴에서 Repositories를 선택합니다. 그리고 Private 탭에서 Create repository 버튼을 눌러서 레파지토리 생성을 시작합니다.
레파지토리는 다음 그림과 같이 구성합니다. 이름은 app-web으로 입력하고 나머지는 그대로 둡니다.
구성을 완료한 다음에 맨 아래에 있는 Create 버튼을 누르고 기다리면 레파지토리가 생성된 것을 확인할 수 있습니다.
다음으로 생성한 레파지토리의 app-web 링크를 눌러서 이동합니다. 그리고 오른쪽의 View push commands 버튼을 눌러서 계정을 인증하고 빌드한 이미지를 생성한 레파지토리에 푸시합니다. 앞에서 이미지를 이미 빌드한 경우에 빌드 명령어는 제외해도 괜찮습니다.
이미지 푸시를 완료하면 다음과 같이 등록된 것을 확인할 수 있습니다.
## Security Group 생성
AWS ECS에서 구동되는 Web 서비스에 적용할 보안 그룹과 서비스 앞에서 트래픽을 분산할 로드 배런서에 적용할 보안 그룹을 생성합니다. 먼저 로드 밸런서에 적용할 보안 그룹을 생성합니다. EC2 콘솔로 이동 후 왼쪽 메뉴에서 Security Groups를 선택합니다. 그리고 Create security group 버튼을 눌러서 보안 그룹 생성을 시작합니다. Security group name은 app-web-alb-sg로 지정합니다. VPC는 처음 생성한 app-vpc를 선택합니다. 외부와 HTTP 통신을 위해서 80 포트를 인바운드 값으로 허용하고 Source로 Anywhere를 선택합니다. 구성을 완료한 다음에 Create security group 버튼을 눌러서 보안 그룹을 생성합니다.
다음으로 ECS 서비스에 적용할 보안 그룹을 생성합니다. Security group name 은 app-web-sg로 지정합니다. VPC는 처음 생성한 app-vpc를 선택합니다. 8000 포트 트래픽을 인바운드 값으로 허용하고 Source로 방금 생성한 app-web-alb-sg를 선택합니다. 구성을 완료한 다음에 Create security group 버튼을 눌러서 보안 그룹을 생성합니다.
기다리면 다음과 같이 두 개의 보안 그룹이 생성된 것을 확인할 수 있습니다. 보기 편하게 Name 값을 Security Group Name 과 동일하게 변경합니다.
## Load balancer 생성
AWS ECS의 Web 서비스 구성에 사용할 로드 밸런서를 생성합니다. EC2 콘솔로 이동 후 왼쪽 메뉴에서 Load balancers를 선택합니다. 그리고 Create load balancer 버튼을 눌러서 로드 밸런서 구성을 시작합니다. Application Load Balancer의 Create 버튼을 눌러서 생성을 시작합니다.
Load balancer name는 app-web-alb를 입력하고 Scheme 은 Internet-facing을 선택합니다. Networking 구성에서 VPC는 생성해 둔 app-vpc를 선택하고 Subnets에는 public subnets 두 개를 선택합니다. 그리고 Security groups에는 미리 생성해 둔 app-web-alb-sg를 선택합니다.
Listeners and routing에서 Create target group 버튼을 눌러서 신규 타겟 그룹의 구성을 시작합니다. Choose a target type는 IP addresses를 선택하고 Target group name 값으로 app-web-alb-tg를 입력하고 Port는 8000을 입력합니다. VPC는 app-vpc를 선택합니다. 그리고 Health check path 값으로 /health를 입력합니다. Next 버튼을 눌러서 다음 단계를 넘어간 뒤 Create target group 버튼을 눌러서 타겟 그룹을 생성을 완료합니다.
다시 로드 밸런서 구성 페이지로 돌아옵니다. Select a target group 옆에 새로고침 아이콘 버튼을 눌러서 방금 생성한 타겟 그룹을 가져오고 선택합니다.
Create load balancer 버튼을 눌러서 로드 밸런서 생성을 완료합니다.
## Task definitions 구성
Amazon ECS에서 Docker 컨테이너를 실행하기 위해서 태스크를 정의합니다. 하나의 태스크에서 한 개 이상의 컨테이너를 정의할 수 있습니다. 즉 서비스를 실행하기 위한 최소 단위라고 생각할 수 있습니다. Amazon ECS 콘솔로 이동 후 왼쪽 메뉴에서 Task definition을 열고 Create new task definition 버튼을 눌러서 태스크 정의를 시작합니다.
태스크 정의는 다음 그림과 같이 구성합니다. Task definition family는 app-web-td로 지정합니다. 그리고 태스크를 구성할 컨테이너 정보를 입력합니다. Name 은 app-web으로 지정하고 Image URI는 ECR 콘솔에서 앞 단계에서 푸시한 이미지 URI를 찾아서 입력합니다. 포트는 8000으로 입력합니다. Next 버튼을 눌러서 다음으로 진행합니다.