Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

ECS Fargate

AWS ECS 는 관리형 컨테이너 서비스다. ECS를 기반으로 3가지 유형의 컨테이너 서비스들을 실행 할 수 있다.
  1. EKS : ECS를 기반으로 하는 Kubernetes 서비스다. Kubernetes를 ECS 클러스터의 오케스트레이션 툴로 사용한다.
  2. ECS : AWS에서 제공하는 도커 컨테이너 서비스다. ECS는 관리형 컨테이너 서비스로 관리 범위에 따라서 2개 서비스로 분류한다.
    1. EC2 Linux 타입 : EC2 인스턴스로 도커 컨테이너 클러스터를 구성한다. 사용자 VPC에 인스턴스가 올라간다. EC2 Linux 타입은 EC2 Linux 기반의 ECS 서비스를 참고하자.
    2. Fargate 타입 : EC2 인스턴스 자체가 필요 없는 서버리스(Serverless) 서비스다.
EC2 Linux 타입과 구성에 별 차이 없을 것으로 생각한다.

ECS Fargate 서비스 구성요소

ECS Fargate 서비스를 위해서는 3개의 구성요소가 필요하다.

 ECS Fargate 구성요소

  • ECS Fargate Cluster
  • ECR
  • Task Definition
ECS Fargate Cluster 는 도커 컨테이너를 실행하기 위한 클러스터 자원이다. 컴퓨터 클러스터라고 보면 되겠다. ECS Fargate의 경우에는 이 클러스터를 구성하기 위한 서버도 필요 없는 서버리스 서비스다.

ECR(Elatic Container Registry)는 완전관리형 도커 이미지 저장소다.

Task Definition은 도커 컨테이너 기반 애플리케이션을 실행하기 위한 애플리케이션 정의정보를 담고 있다. 어느 정도의 메모리와 CPU를 가진 컨테이너를 몇 개 실행 할지. 해당 컨테이너를 실행할 도커 이미지의 위치 정보등을 포함하고 있다.

ECS 클러스터 생성

 ECS 클러스터 생성

Create Cluster 버튼을 누르면 템플릿 선택 화면으로 넘어간다.

 ECS Cluster Template 선택화면

  1. Networking Only : 사용자는 VPC 네트워크만 제공하면 된다. 클러스터는 AWS에서 제공하는 서버리스 클러스터다. AWS ECS Fargate라고 부르는 서비스다.
  2. EC2 Linux + Networking : 사용자의 VPC에 컨테이너를 올릴 EC2 인스턴스들이 설치된다.
  3. Windows + Networking : 리눅스 대신 윈도우즈 운영체제가 올라간 EC2 인스턴스들이 설치된다.
 ECS Configure cluster

Next 버튼을 누르면 설정화면으로 넘어간다.
  1. Cluster name : 클러스터 이름. joinc-cluster로 설정했다.
  2. Create VPC : ECS Fargate를 위한 VPC를 새로 만들경우 선택한다. 나는 이전에 만들어 놓은 VPC를 사용하기로 했다.
Create 버튼을 클릭하면 클러스터가 만들어진다. 서버리스 이므로 EC2 인스턴스를 설정하는 등의 작업을 할 필요가 없다.

ECR 만들기

ECR은 AWS의 완전관리형 Docker Image Registry 다.

 ECR

Create repository를 클릭하면 설정화면으로 넘어간다.

 Repository 설정

레포지토리의 이름은 "helloworld"로 설정했다. Create repository를 클릭하면 이미지 저장소가 만들어진다.

 ECR 대시보드

ECR 대시보드에서 레포지토리 정보를 확인 할 수 있다. 이제 ECR에 Docker 이미지를 등록해보자.

테스트 용 애플리케이션과 Dockerfile

테스트를 위해서 간단한 Go 애플리케이션을 만들었다.
package main

import (
	"fmt"
	"net/http"
)

func main() {
	fmt.Println("vim-go")
	http.HandleFunc("/v1/hello", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello world Version 1")
	})
	err := http.ListenAndServe(":8088", nil)
	if err != nil {
		fmt.Println(err.Error())
	}
}
테스트를 수행했다.
# go build -o hello
# ./hello
# curl localhost:8088/v1/hello
Hello world Version 1

도커라이징을 위한 Dockerfile이다.
FROM ubuntu 
ADD hello / 
CMD ["/hello"]

도커이미지를 만든다.
# docker build -t joinc/hello:0.1 .        
Sending build context to Docker daemon   7.39MB
Step 1/3 : FROM ubuntu
 ---> d131e0fa2585
Step 2/3 : ADD hello /
 ---> 8e415e64c0db
Step 3/3 : CMD ["/hello"]
 ---> Running in a6177e542786
Removing intermediate container a6177e542786
 ---> b58dff1f2b01
Successfully built b58dff1f2b01
Successfully tagged joinc/hello:0.1

도커 이미지를 실행해서 테스트해보자.
# docker run --name joinc_hello joinc/hello:0.1       
vim-go

# curl 172.17.0.2:8088/v1/hello
Hello world Version 1%

... 계속