Amazon Elastic Container Service(ECS)
- 컨테이너화된 애플리케이션의 손쉬운 배포, 관리 및 조정에 도움이 되는 완전 관리형 컨테이너 오케스트레이션 서비스
- "ECS Anywhere": 온프레미스 또는 클라우드 모두에서 ECS에서 확인하려는 유사한 클러스터 관리, 워크로드 예약 및 모니터링 이용 가능
- 오케스트레이터: 컨테이너 배포, 컨테이너 상태 확인, 상태가 좋지 않은 노드 교체, 새 배포 처리를 통해 컨테이너의 수명 주기 관리
구성 요소
- Cluster: 클러스터에 배포된 모든 컨테이너를 그룹화하는 논리적 구조
- Task definition: 컨테이너 이미지 위치, CPU 및 메모리 용량, 로그 구성 등과 같은 속성을 포함
- Task: 클러스터 내 태스크 정의를 인스턴스화
- Service: 클러스터에서 원하는 수의 태스크를 동시에 실행하고 유지 가능
- ECR: Amazon에서 제공하는 컨테이너 이미지 저장소
시작 유형
- Fargate: 서버리스 컴퓨팅 엔진
- EC2
- External: 온프레미스 서버 또는 가상 머신
실습
퍼블릭 서브넷 2 / 프라이빗 서브넷 2
퍼블릭 rtb에 igw 추가
(docker 설치 및 dockerfile 만들 ec2 보안그룹) ssh만 열어주자
(로드 밸런서 보안그룹) HTTP 열어주자
(컨테이너 보안그룹) private subnet 배치, alb에서만 받아오자
ec2 인스턴스 생성
위에서 생성했던 vpc와 sg 적용 시키기, 퍼블릭 ip 활성화
(❗ vpc 적용시킬 때 public인지 확인해라...)
이후에 ssh 접속 해서 docker 설치를 해보자!
sudo -s
yum install -y docker
service start docker | systemctl start docker
docker images
docker images 명령어 입력 후 위의 그림과 같은 화면이 나오면 성공적으로 설치된 것.
dockerfile 작성
mkdir dockerfile-folder
cd dockerfile-folder/
vi index.html
//index.html
<!doctype html>
<h1>hello ecs!</h1>
vi dockerfile
//dockerfile
FROM nginx:latest
MAINTAINER "kim.jaewook@classmethod.jp"
COPY ./index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
docker build -t ecs-nginx .
docker images 명령어를 입력해보면
위와 같이 업로드를 확인할 수 있다.
ECR로 이미지를 푸시하기 전 현재 생성한 docker image가 정상 작동하는지 테스트 해보자.
(create 명령어로 container 생성)
docker create -i -t --name ecs-nginx-container -p 8000:80 ac167921553f //ecs-nginx image id
컨테이너 아이디를 확인하고 start 명령어로 컨테이너 실행
docker ps -a
docker start 362972fc9628 // container id
ec2 보안그룹에서 8000번 포트 열고 확인!
컨테이너는 필요없으니 삭제 해주자
docker stop 362972fc9628
docekr rm 362972fc9628
이름은 docker image와 같게 만들자.
ECR에 이미지를 푸시하기 위해선 EC2에 IAM Role이 연결되어 있어야 한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:Describe*",
"ecr:Get*",
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:BatchDeleteImage"
],
"Resource": [
"arn:aws:ecr:REGION:AWS_ACCOUNT_ID:repository/REPOSITORY_NAME"
]
}
]
}
나는 위의 내용을 정책으로 만들고 만든 정책으로 역할을 생성했다.
역할을 업데이트 해준다.
$ aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/리포지토리
로그인 성공!
해당 명령어들을 따라간다..(얘는 ECR 리포지토리 선택 후 '푸시 명령 보기' 클릭하면 나옴..)
2번까진 위에서 테스트 했기 때문에 3번 명령어부터 진행하면 된다.
3번 명령어 까진 실행이 잘 되었다는 것을 알 수 있음.(TAG 명령어)
4번 명령어 실행하면
이와 같은 오류가 뜬다. 아마 aws configure 문제 일듯?
IAM user를 생성한다.
후에 aws configure 작업 진행
ECR 리포지토리의 권한도 설정해준다.(귀찮으니까 모든 사람으로 설정해버림)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPushPull",
"Effect": "Allow",
"Principal": "*",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
]
}
]
}
다시한번 더 4번 명령어(push) 하면 성공이다.
위와 같이 이미지가 잘 올라간 것을 볼 수 있음!
❗ 글이 길어지니까 ECS 구축 관련한 내용은 다음 포스팅에 올리자.. ❗