ECS (Elastic Container Service)
- AWS에서 제공하는 Container Ochestration Service
- Docker Container 실행 및 관리 가능
- Load-Balancing, Auto-Scaling, IAM 통합 지원
- CloudWatch 및 ELB(ALB/NLB) 연동 가능
- 실행 방식
- EC2 Launch type : 사용자가 관리하는 EC2 Instance에서 실행
- Fargate Launch type : Serverless 방식으로 AWS가 인프라 관리
- 구성 요소
- Cluster : ECS Resource의 논리적인 그룹
- Task Definition : Container를 구성하는 Template
- Task : 실행중인 Container 그룹 (~ Pod랑 비슷)
- Service : Task의 배포 및 가용성 관리
관리대장
-
VPC
-
Subnet
- PUB-2A (10.17.0.0/24)
- PRI-2A (10.17.10.0/24)
- PUB-2C (10.17.1.0/24)
- PRI-2C (10.17.11.0/24)
-
IGW
-
NAT G/W
-
Routing Table
- RT-PUB
- Routing : 0.0.0.0/0 => IGW-00
- Subnet : PUB-2A, PUB-2C (명시적)
-
RT-PRI
- Routing : 0.0.0.0/0 => NGW-00
- Subnet : PRI-2A, PRI-2C (명시적)
-
Security Group
- PUB-SG-00 (22, 80, 443)
- PRI-SG-00 (22, 80, 443, 8080)
(1) VPC 생성
- 10.17.0.0/16으로 VPC를 생성한다.

(2) Subnet
- PUB-2A(10.17.0.0/24), PRI-2A(10.17.10.0/24)를 설정한다.가용영역과 CIDR을 그림을 보고 설정한다.


- PUB-2C(10.17.1.0/24), PRI-2C(10.17.11.0/24)를 설정한다.가용영역과 CIDR을 그림을 보고 설정한다.


(3) IGW


(4) NAT 게이트웨이

- NAT 게이트웨이 설정시에 영역별을 선택한다. PUB-2A에 연결한다.
- 퍼블릭으로 연결한다.
- 탄력적 IP 할당한다.


(5) 라우팅 테이블
- 2개의 라우팅 테이블을 생성할 것이다.
- RT-PUB 라우팅 테이블을 생성하면서 VPC에 연결한다.
- 라우팅 편집해준다.




- 두번째 라우팅 테이블 RT-PRI을 생성한다.

- RT-PRI는 NAT 게이트웨이를 연결해준다. 라우팅 테이블에 서브넷도 연결해준다.


- 여기 까지 했으면, 2개 서브넷, 2개 서브넷 각각 연결되어 있을 것이다.
(6) Security group

- 인바운드 규칙을 설정해준다. (22 80 443)
- Anywhere-IPv4를 선택해준다.



- PRI를 위한 인바운드 규칙을 넣는다. (22 80 443 8080)


(7) Elastic Container Service
- 메인 페이지 보면, 선택할 수 있는 것들이 많다.

- 클러스터를 생성한다.
- 중간에 네임스페이스를 생성해줘야 한다.



- Fargate 전용으로 선택한다. 아래에 세부적인 설명을 읽어보고 자신에게 맞는 것을 선택하면 된다.
- 시간이 좀 걸린다.

- 클러스터 생성중에 오류가 발생했다. 어떤게 문제일까..
- CloudFormation 버튼을 눌러서 원인을 찾아본다.

- 스택으로 연결해줬는데, 리소스가 Failed 상태였다고 한다. 권한이 없어서

- IAM > 사용자 그룹 > yslee-grp > 권한 > 권한 추가


- 기타 권한 정책에 ECS 써서 FullAccess를 선택한다. 정책을 연결한다.


- 이번에는 다른 에러가 발생하였다. 이미 있다고 한다. 이전 단계에서 뭔가 생성이 되어 있었나보다.


- 다시 클러스터를 생성해본다. 클러스터가 생성되었다.


- 이번에는 클러스터로 들어가서 태스크를 설정해준다. 왼쪽 바에서 '테스크 정의' > '새 테스크 정의 생성'을 눌러서 만든다.



- 아래에 컨테이너 부분도 작성한다.
- 컨테이너 이미지는 도커허브에서 nginx를 가져온다.

docker.io/library/nginx:1.28.3-alpine

- 컨테이너 설정할 때, 포트 이름도 nginx-80-tcp 로 설정해두었다.
- 여기 까지하면 yslee-TDF를 만든 것이다.

- 왼쪽 메뉴에서 클러스터로 돌아와서, yslee-TDF를 yslee-ECS-cluster-00으로 설정해줘야 한다.
- 새 태스크 실행으로 설정한다.



- 네트워킹 VPC,서브넷 (PUB-2A, PUB-2C),보안 그룹(PUB-SG-00)을 설정한다.

- 2개로 설정했기 때문에 2개가 생겼다. 프로비저닝이 좀 걸린다.

- 프로비저닝 끝난 후, 실행중이라는 상태가 나오면 안으로 들어가서 네트워크 바인딩에 있는 IP와 포트 번호를 확인해본다.





Managed-server
- EC2 > 인스턴스 시작으로 간다.
- managed-server 인스턴스를 만들고, 우분투 22.04 LTS를 넣는다.


- 보안그룹은 기존 보안 그룹 선택에서 PUB-SG-00
- 퍼블릭 IP를 활성화한다.
- 서브넷은 PUB-2A를 사용한다.




- root 계정으로 작업하기 위해서 비번 설정하고 바꾼다.

# docker install
wget -O install_docker.sh https://raw.githubusercontent.com/Joes-s/docker-daemon/main/aws_install_docker.sh
# 실행 권한 부여
chmod +x install_docker.sh
# 실행
./install_docker.sh
# 버전 확인
docker --version
# 폴더를 하나 만든다.
mkdir docker && cd docker
# 테스트용 html
echo "AWS Web Server" > index.html

vi Dockerfile
# 작성한 내용
FROM nginx:1.28.3-alpine
COPY ./index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# 도커 로그인
docker login

# 이미지 빌드
docker build -t yslee-nginx:v1.0 .
# 이미지 확인
docker image ls
# 이지미 삭제
docker rmi yslee-nginx:v1.0


- Push 할려면 레파지토리 설정해줘야 한다.
- 여기까지하면, 이미지 파일을 도커 허브로 올린 상태가된다.
# 빌드
docker build -t yslee4050/yslee-nginx:v1.0 .
# Push
docker push yslee4050/yslee-nginx:v1.0


- 클러스터로 돌아가본다. 아까 위에서 태스크 만들고 중지해놨던 그곳이다.
- 태스크에서 yslee-TDF에 대한 새 개정 생성을 눌러서 수정한다.

- 이미지 URI를 보면 새로 만든 것을 적용하기 위해서 수정해줬다.(아래 그림은 library 글자 삭제해야함.)
docker.io/yslee4050/yslee-nginx:v1.0


- yslee-TDF:2 새로운 개정이 적용되었다.

- 클러스터로 돌아간다. 태스크 > 새 태스크 실행에서

- 태스크 실행 설정을 시작한다. 네트워킹 부분 PUB로 설정되어 있고, 보안 그룹을 PUB꺼로 설정하였다.
- 태스크 갯수도 2로 설정한다.



- 시작 잘 되었으면, 네트워크 바인딩으로 들어가서 퍼블릭 IP로 접속해본다.


- 종료 순서 : 클러스터 > 태스크 모두 종료 > 클러스터 삭제 > 태스크 정의 등록 취소