Amazon Elastic Container Service(ECS)

  • 컨테이너화된 애플리케이션의 손쉬운 배포, 관리 및 조정에 도움이 되는 완전 관리형 컨테이너 오케스트레이션 서비스
  • "ECS Anywhere": 온프레미스 또는 클라우드 모두에서 ECS에서 확인하려는 유사한 클러스터 관리, 워크로드 예약 및 모니터링 이용 가능
  • 오케스트레이터: 컨테이너 배포, 컨테이너 상태 확인, 상태가 좋지 않은 노드 교체, 새 배포 처리를 통해 컨테이너의 수명 주기 관리

https://tech.cloud.nongshim.co.kr/2021/08/30/%EC%86%8C%EA%B0%9C-amazon-ecs%EB%9E%80/

구성 요소

  • Cluster: 클러스터에 배포된 모든 컨테이너를 그룹화하는 논리적 구조
  • Task definition: 컨테이너 이미지 위치, CPU 및 메모리 용량, 로그 구성 등과 같은 속성을 포함
  • Task: 클러스터 내 태스크 정의를 인스턴스화
  • Service: 클러스터에서 원하는 수의 태스크를 동시에 실행하고 유지 가능
  • ECR: Amazon에서 제공하는 컨테이너 이미지 저장소

시작 유형

  • Fargate: 서버리스 컴퓨팅 엔진
  • EC2
  • External: 온프레미스 서버 또는 가상 머신

실습

  • VPC 생성

퍼블릭 서브넷 2 / 프라이빗 서브넷 2

퍼블릭 rtb에 igw 추가

 

  • 보안그룹

(docker 설치 및 dockerfile 만들 ec2 보안그룹) ssh만 열어주자

(로드 밸런서 보안그룹) HTTP 열어주자

(컨테이너 보안그룹) private subnet 배치, alb에서만 받아오자

 

  • docker 환경 구축

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

 

  • ECR 리포지토리 생성

이름은 docker image와 같게 만들자.

 

  • EC2에서  프로필 설정

 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"
            ]
        }
    ]
}

나는 위의 내용을 정책으로 만들고 만든 정책으로 역할을 생성했다.

역할을 업데이트 해준다.

 

  • ECR 로그인
$ aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/리포지토리

로그인 성공!

 

  • ECR Push

해당 명령어들을 따라간다..(얘는 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 구축 관련한 내용은 다음 포스팅에 올리자.. ❗

'Cloud > AWS' 카테고리의 다른 글

[AWS] Cloud9 - Github 연동  (0) 2022.09.16
[AWS] ECS 실습 -2(ECS 구축)  (0) 2022.09.15
[AWS] ECS에 HTTP API 구축  (0) 2022.09.13
[AWS] Mobile Backend 구성  (1) 2022.09.08
[AWS] AWS Amplify -1(Amplify Studio)  (0) 2022.09.07

+ Recent posts