Amazon ECS 및 ECR 이해
Amazon ECS(Elastic Container Service)
- 컨테이너화된 애플리케이션을 배포, 관리 스케일링할 수 있도록 도와주는 완전 관리형 컨테이너 오케스트레아션 서비스
- Amazon ECS 기반 애플리케이션들은 간단한 API 호출을 이용하여 컨테이너 애플리케이션 운영, 관리를 손쉽게 할 수 있고, 단일 컨테이너부터 수천 개의 컨테이너까지 복잡한 과정 없이 확장 가능할수 있다.
- Serverless 방식으로 클라우드 인프라에서 애플리케이션을 호스팅하는 Fargate 방식
- AWS Cloud 인프라의 가상 환경인 firecracker 기반의 serverless container compute engine
- 직접적인 클러스터 관리(모든 리소스 관리)를 강화하기 위해 Amazon EC2 인스턴스를 서버로 구성한 Docker 기반 서비스 인프라를 호스팅하는 방식
Amazon ECS 구성요소
- ECS Cluster
- 작업(task) or 서비스(service)의 논리적 그룹으로 EC2 기반 or Fargate 선택 구성
- 작업을 배포하기 위한 인스턴스의 집합
- Service
- ECS cluster에서 지정된 수의 작업(task)을 통시에 실행, 관리하는 구성 요소
- service는 작업을 포함, task의 관련된 클러스터, 작업정의, 시작유형, LB, ASG, 배포 유형 등을 관리
- Kubernetes의 deployment, replicaSet과 동일한 기능 수행
- Task
- task definition(작업정의서)에 정의된 설정으로 컨테이너 인스턴스(EC2 or Fargate)에 배포됨
- 하나 이상의 컨테이너를 실행하는 최소 단위(작업 정의 내용을 기반으로 배포된 컨테이너들)
- Task Definition
- 애플리케이션 컨테이너의 명세서(JSON), 작업(task)를 실행하기 위한 명세 기술, docker run~ 과 유사
- 시작유형, 사용할 컨테이너 이미지, 노출 포트, 리소스 사용량(cpu, memory), 볼륨구성 등
- ECR
- AWS cloud의 컨테이너 이미지 저장소(hub.docker.com과 같은 역활)
- ECR에서 제공하는 image URI를 이용해 build된 image를 pull, push
- ECS console
- ECS cluster 관리도구로 모니터링 및 제어 수행(Kubernetes의 master node(control plane)과 동일)
- 컨테이너 인스턴스(EC2)는 Kubernetes의 worker node와 동일
Amazon ECR 구성 요소
- Registry
- Amazon ECR private registry는 각 AWSD 계정 단위로 제공되며 registry에 하나 이상의 Repository를 생성하고 이 Repository에 생성한 image를 저장할 수 있다.
- Repository
- Amazon ECR Repository에는 Docker 이미지, Open Container Initiative(OCI) 이미지 및 OCI 호환 Artifact가 포함됨
- Repository policy
- Docker image에 대한 Access control 관리를 수행할 수 있다.
- Image
- Repository에 컨테이너 이미지를 push/pull 할 수 있고, 개발 시스템에서 로컬로 이러한 이미지를 사용하거나, Amazon ECS 태스크 정의 및 Amazon EKS Pod spec에서 사용 가능하다.
- 사용자 권한 토큰
- Client는 Amaxon ECR Registry에 AWS 사용자로서 인증을 해야 Image를 push/pull 가능하다.
- 제공기능
- 수명 주기 정책
- 이미지 취약점 점검 스캔 기능
- 교차 리전 및 교차 계정 복제
AWS Cloud 컨테이너 관련 서비스
[실습] Amazon ECS 구성
vpc를 생성한다. 이름 태그는 ecs로 만들고 vpc등을 선택한다.
public subnet 2
private subnet 2
CIDR은 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24, 10.0.4.0/24으로 작성한다
NAT 게이트웨이는 1개의 AZ에서
생성됨을 확인한다.
각 보안 그룹에 속한 인스턴스는 인바운드 규첵에서 허용된 트래픽만 접근할수 있다. 아래의 보안그룹을 만드는 이유는 애플리케이션 로드밸런서(ALB)가 외부 HTTP요청을 수신하고 ECS에서 생성한 웹 서비스가 ALB에서 보내는 트래픽만 수신하도록 하기 위해서이다.
보안그룹 이름: ecs-sg-alb
설명: allow http
vpc: ecs-vpc
인바운드 아웃바운드 규칙 0.0.0.0/0으로 모든 트래픽을 허용하도록 설정(스터디용으로 전부 오픈)
위에서 alb에서 사용하는 보안그룹을 만들었다. 이번에 만들 보안그룹은 ecs 인스턴스가 사용할 보안그룹이다. 위에서 만든 ecs-sg-alb가 통가 시킨 트래픽을 ecs 인스턴스에 연결 시켜줄 보안그룹니다.
보안그룹 이름: ecs-sg-instance
vpc: ecs-vpc
인바운드규칙 추가
소스: ecs-sg-alb
보안 그룹을 만들었다. 이제 alb를 만들차례다. alb는 위에서 만든 만든 두개의 보안 그룹을 사용하여 외부에서 들어오는 트래픽을 제어하고 인스턴스에 트래픽을 전달한다.
로드 밸런서 이름: ecs-alb
vpc: ecs-vpc
가용영역: ap-northeast-2a, ap-northeast-2c
보안 그룹: ecs-sg-alb
태그 이름: ecs-alb
리스너는 구성한 프로토콜과 포트를 사용하여 연결을 요청을 확인하는 과정이다. 리스너가 수신한 트래픽은 대상그룹으로 라우팅 된다.
다음으로는 대상 그룹을 만든다. 포트는 80번이다.
만든 대상 그룹을 선택해서 alb를 생성한다.
배포될 웹 서비스의 docker image를 빌드 하기 위해서 aws에서 제공하는 개발환경인 cloud9을 이용할 것이다. 이것을 위해서 IAM권한 정책을 생성해야한다.
역활만들기 > AWS서비스 > EC2 > AmazonEC2Container RegistryFullAccess > 역할 이름 ECS-fastcampus-workshop > 역활생성
could9으로 이동한다.
이름: ecs-workshop
설명: fastcampus ecs workshop
t3.medium Amazon ??Linux 2023
vpc: ecs-vpc
subnet: ecs-oybkuc-subnet-1
연결: ssm
생성
AWS EC2로 이동한후 aws=cloud9-ecs-workshop을 선택후 오른쪽 상단의 작업 > 보안 > IAM 역할 수정을 클릭 ECS-fastcampus-workshop을 선택한다.
cloud9 열어보자. 먼저 임시 자격증명을 제거 하는 설정을 하자. 톱니바퀴 모양을 클릭 preferences > AWS SETTIGNS > Credentials > AWS managed temporary credentials off .
이제 preferences 탭을 닫고 기존 임시 자격 증명을 삭제한다.
rm -vf ${HOME}/.aws/credentials aws sts get-caller-identity --query Arn | grep ecs-workshop aws configure set default.region ap-northeast-2 aws configure get default.region git clone https://github.com/hylee-kevin/fastcampus.git
임시 자격 증명을 삭제하고 소스를 다운로드 받았다. 컨테이너 이미지를 저장하기 위한 저장소를 생성해보자.
aws ecr create-repository --repository-name nodejs
repositoryUri는 나중에 dockerfile을 빌드한후 컨테이너 이미지를 ECR에 push할 때 사용된다. 저장해 놓자.
ECR에 nodejs라는 저장소가 생성됨을 확인한다.
다시 cloud9으로 돌아 오자.
sudo yum update -y sudo yum install docker docker version docker build -t nodejs:1.0 . docker images # ECR에 Login aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com # account ID 확인 aws sts get-caller-identity --query Account --output text docker image tag nodejs:1.0 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/nodejs:1.0 docker push 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/nodejs:1.0
docker을 설치하고 ECR에 로그인 하고 내려 받은 소스를 도커 이미지로 빌드한다. 그런 다음 이미지를 ECR의 nodejs 저장소에 푸시하자.
푸시한 이미지가 잘 저장된지 확인해보자.
이제 ECS를 만들어볼 차례이다. 여기서는 아까 만든 이미지를 실행해서 만든 컨테이너를 실행 시킬 장소이다. 클러스터 클릭 > 클러스터 생성 클릭 하자.
EC2 인스턴스 선택
이름: ecs-cluster
온디맨드 인스턴스
t3.medium 권장
인스턴스 개수 2
나머진 기본값
VPC: ecs-voc
서브넷: ecs-private-subnet-1, ecs-private-subnet-2
보안 그룹: ecs-sg-instance
위에서 클러스터를 만들었다. 이제는 클러스터에서 실행한 task를 만들어야 한다. 하나의 클러스터에는 여러개의 서비스가 있을수 있다.
그리고 하나의 서비스에는 여러개의 task로 구성되어 있다. 여기서는 task를 만들어보자.
태스크의 이름: ecs-task
컨테이너를 추가하자.
이름: nodejs-app
이미지 URI: ECR에 저장한 이미지의 URI
메모리 제한: 0.5기가
포트: 3000:3000
생성을 클릭하여 task를 만든다
위에서 task 하나를 만들었다. 이제 그 태스크를 실행한 서비를 만들어보자. 클러스터로 이동하자. ecs-cluster 클릭하자. 서비스탭에서 생성을 클릭하자.
기존 클러스터: ecs-cluster
용량 공급자 전략
클러스터 기본값 사용
애플리케이션 유형: 서비스
패밀리: ecs-task
개정: 4
서비스 이름: ecs-task4
원하는 태스크: 2
로드밸런서 유형: Application Load Balancer
ecs-alb
nodejs-app 3000:3000
리스너 포트 선택
생성한 타켓 그룹 선택
다음 다음 클릭 하자. 서비가 생성이 되면 클러스터의 작업 탭에서 확인 할수 있다.
이제 서비스를 생성했으니 다만들었다. 클러스터에 배포한 서비스에 접속해보자. EC2로 이동하자. Load balancers로 이동 > DNS name을 클릭해서 주소를 복사하자. 브라우저에 복사한 주소를 붙여놓고 확인해보자.
504 Gateway Time-out이 발생했다. 이건 alb를 통해서 접근하고 cluster의 서비스에서 3000번 포트로 접근해야 하는데 여기에 포트를 전달 받는 보안 그룹인 ecs-sg-instance가 3000번 포트가 닫혀 있어서 그렇다. 인바운드 규칙을 추가 해자.
이제 다시 접근해보면 성공적으로 열리는것을 확인할수 있다.
Amazon ECS를 활용한 컨테이너 배포
이번 실습에서는 아래의 그림과 같이 nginx와 django를 이용한 2-tier 구조의 웹서비를 구성해 보겠습니다.
먼저 fc-django, fc-nginx 저장소를 만들겠습니다.
# ECR login aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com aws ecr create-repository --repository-name fc-django aws ecr create-repository --repository-name fc-ngin cd fastcampus/ch13 docker build -t fc-django:1.0 . docker build -t fc-nginx:1.0 . docker image tag fc-django:1.0 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/fc-django:1.0 docker image tag fc-nginx:1.0 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/fc-nginx:1.0 docker push 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/fc-django:1.0 docker push 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/fc-nginx:1.0
저장소 를 만들고 소스 위치로 이동한후에 이미지를 빌드하고 푸시하였습니다.
ECS로 이동하자. 기존과 동일하다. 새로운 task를 만들어보자. 작업정의 탭으로 이동. 새 작업 정의 생성을 클릭한다.
컨테이너 1에는 django 이미지를 설치한다.
컨테이너2에는 fc-nginx를 설치한다.
로깅 설정을 한다.
스토리지 설정을 한다. 볼륨을 하나 만들고 fc-django와 연결한다.
태스크를 만들었으니 이제 서비스를 만들 차례이다.
기존 클러스터: ecs-cluster
용량 공급자 전략
클러스터 기본값 사용
서비스
서비스 이름: 2tier-task
복제본
원하는 태스크: 2
서비스를 만들었다. 잘 생성되었는지 확인하자.
alb url로 접근해보자.
오늘은 aws를 통해서 웹서비를 어떻게 배포하는지 살펴보았다.