Tempo Di Valse

[AWS] ECS 에 Docker 연동하기 -1- (ECR 리포지토리 생성) 본문

개발/AWS

[AWS] ECS 에 Docker 연동하기 -1- (ECR 리포지토리 생성)

TempoDiValse 2022. 11. 18. 15:46

이번 포스팅 시리즈는 ECS 라는 AWS 의 서비스를 이용하여 로컬에서 작업중이던 Docker 를 AWS 에 띄우는 방법에 대해서 기술해보도록 한다.

 

먼저 ECS 란, Elastic Container Service 라는 풀네임을 가진 서비스로 Container 라는 환경 내에서 웹 서버(or 기타 서비스) 가 동작할 수 있도록 환경을 제공해주는 서비스라고 하면 될까 싶다. 더 자세한 내용은, 

 

Amazon Elastic Container Service란 무엇입니까? - Amazon Elastic Container Service

Amazon Elastic Container Service란 무엇입니까? Amazon Elastic Container Service(Amazon ECS)는 확장성이 뛰어나고 빠른 컨테이너 관리 서비스입니다. 이를 사용하여 클러스터에서 컨테이너를 실행, 중지 및 관리

docs.aws.amazon.com

이런게 있지만 항상 AWS 공식 문서는 봐도 모르겠다고 한다.

 

그래서 내가 ECS 를 왜 사용해야 하는 지 이유를 생각해 본다면,

  1. 로컬에서 Docker 를 사용하여 개발을 하고있다.
  2. Docker 를 AWS 상에서도 사용하고 싶다.
  3. AWS 상에 올려놓고 스케일업 같은건 신경을 많이 쓰고 싶지 않다.
  4. 그냥 AWS 상에 올려서 같은 환경을 만들고 싶다.

이 정도가 내가 ECS 를 선택하여 사용하고자 했던 1차원적인 생각이었다. 가장 중요한 포인트는 Docker 에서 사용하던 환경을 가져다 쓴다는 것이 아닐까 싶다.

 ECS 에서는 컨테이너 기반으로 움직여서 Docker 에서 만든 이미지를 등록하여 띄워달라고 요청하면 컨테이너 안에서 이미지가 실행이 되며, 로컬환경이 아니라도 바로 서버환경에서 사용 할 수 있게 된다. 그렇기 때문에 테스트 뿐만 아니라 배포 환경도 같은 환경을 만들 수 있어 EC2 인스턴스를 만들어서 서비 초기 개발 환경 구축을 해야하는 일을 하지 않아도 된다. 단, Docker 를 처음 만져봤을 때 처럼 어렵다.

 

 그래서 일단 맨 먼저 해볼 것은 ECS 에 컨테이너에 띄울 이미지를 만드는 서비스? 인 ECR 를 이용하여 이미지 등록을 해보도록 하겠다.


1. ECS 진입

현재(221118) 보이는 구 버전의 ECS 콘솔

ECR 은 따로 콘솔 홈에서 검색을 통해 들어가는 서비스는 아니다. 그래서 ECR 을 검색하는 것이 아니라 ECS 서비스의 관리 콘솔에 있는 ECR 메뉴로 들어가도록 한다. 위에 있는 스크린샷은 구버전에 있는 ECS 콘솔인데, 조만간 리뉴얼 될 예정이기 때문에 미리 새로운 ECS 콘솔로 바꿔서 사용하도록 하자.

새로운 버전의 ECS 콘솔

이게 더 이쁜 것 같다. 그리고 왼쪽에 있는 'Amazon ECR - 리포지토리' 메뉴에 들어가도록 한다. 

아직은 리뉴얼 중이라 그런 지 한글화가 완전히 되어있지 않은 모양이다. 진입하게되면 보이는 리스트는 프라이빗 리포지토리 메뉴를 기본으로 보여주고 있다. 리포지토리에는 Private/Public 2가지의 유형이 있는데, Private 은 로컬에서 내가 만든 Dockerfile 로 빌드한 이미지를 AWS 에 푸쉬하게 되면 사용할 수 있는 리포지토리이고, Public 은 여러 파트너사들이 제공해주는 이미지(예를 들어, nginx 나 php, ubuntu 같은) 들이라고 할 수 있다. 어떻게 보면 DockerHub 에 있는 이미지라고도 할 수 있을 것 같다. 그럼 리포지토리 동록을 진행해 보도록 하자.

 

2. 리포지토리 등록

 

리포지토리 생성 메뉴를 누르게 되면 다음의 화면이 뜬다. 이 화면을 통해서 쉽게 리포지토리르 만들 수도 있다. 그러나... 여기서 생성하고 있는 리포지토리는 쉽게 보면 비어있는 Git 을 생성하는 것 과 같다고 생각하면 된다. 그래서 이 리포지토리에 만들어 놓은 이미지를 Push 를 해야지만이 ECS에서 사용할 수 있다.

 그래서 푸쉬는 어떻게 하는가... 하면, 터미널 창을 통해서 할 수 있다고 한다. 편한 GUI 를 통해 업로드를 할 수 있을까 했지만 그런 방법은 만들어지지 않은 것 같다. 그래서 리포지토리 생성과 푸쉬를 터미널 을 통해서 만들어 보도록 한다.

 

먼저, 터미널에서 작업을 해야 하기 때문에 IAM 에서 터미널을 통하여 AWS 작업을 할 수 있도록 IAM 계정을 발급 받도록 한다. 나는 다음과 같은 식으로 만들었다.

- 사용자 그룹: CLIAccessGroup

- 사용자 : 내 사용자 명

- 정책 : 아직 없음

 

이렇게 만들어 놓고, 내가 터미널에서 AWS 콘솔에 접속할 수 있도록 해주는 Access Key 를 발급 받도록 한다. 발급은 '사용자 - 내 사용자 명 - 보안 자격증명 탭 - 액세스 키' 에서 하도록 한다. 이미 발급 받은 사람은 발급 받은 것을 바로 사용 하면 될 것이다. 그 다음, 터미널(Mac OS 기준) 을 키고, 다음의 명령어를 실행 시킨다.

aws configure

만약 설치가 안되어있다면, 다음의 페이지를 보고 설치하도록 한다.

 

최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface

이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이

docs.aws.amazon.com

aws configure 명령어를 실행하면 다음의 항목을 넣어주도록 한다.

  • Access Key : credential.csv 참조
  • Secret Access Key : credential.csv 참조
  • Region : 사용하는 리전 값 참조 
  • Output Format : json

다음으로는, 로컬 Docker 환경에서 ECR 을 사용하기 위하여 접속 인증 정보를 받을 수 있도록 커맨드를 입력해주어야 한다.

 

aws ecr get-login-password --region ${region} | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.${region}.amazonaws.com

${aws_account_id} 는 각자의 AWS 계정 ID 값을 입력하면 되며, ${region} 은 각자의 서비스가 들어있는 리전을 입력하면 될 것이다.

여기서 aws 에 들어가는 --region 은 aws configure 에서 값을 입력했다면 스킵해도 무방하다.

값을 입력하고 엔터를 치게되면 Login Succeeded 라는 문구가 나오게 되는데, 이 문구가 나오게 되면 정상적으로 연결이 된 것이라고 생각하면 된다.

 

다음으로는 리포지토리 생성 커맨드를 통해 프라이빗 리포지토리를 생성해보도록 하자

aws ecr create-repository \
    --repository-name ${repository-name} \
    --image-scanning-configuration scanOnPush=true \
    --region ${region}

해당 명령어를 통해서 비어 있는 리포지트로리를 만들 수 있는데, 여기서도 --region 은 스킵이 가능하다. 

입력 후에는 다음과 같은 결과 값이 나오고, 웹페이지 콘솔에서 확인해보면,

다음처럼 커맨드를 통해 만들었던 리포지토리가 생성이 되어있을 것이다. 생성이 완료되면 이제 Docker 를 통해 이미지를 만들고 푸쉬하는 절차를 진행하도록 한다.

 

3. Docker 이미지 생성

 

터미널을 마저 켜놓은 상태에서 내가 정의 해놓은 Dockerfile 으로 옮겨서 빌드를 해보도록 한다. 

docker build -t ${repository_name} . --no-cache

이 부분은 어디까지나 Dockerfile 을 통해서 이미지를 만드는 과정이고, 이미 이미지가 만들어져 있다면 지금의 스텝은 밟지 않아도 된다. 이미지가 없는 경우에는 이미지를 빌드 시켜주도록 한다.

 

이미지가 빌드 되었다면 전송할 이미지에 태깅을 하는데, 왜 하는 지는 잘 모르겠지만 어떤 것을 보낼 것인지에 대한 타겟을 정하는 것 같다. 

docker tag ${local_repository_name} ${aws_account_id}.dkr.ecr.${region}.amazonaws.com/${repository_name}

다음으로는 리포지토리에 이미지를 푸쉬하는 커맨드를 입력한다.

docker push ${aws_account_id}.dkr.ecr.${region}.amazonaws.com/${repository-name}

입력과 동시에 리포지토리로 전송이 되는 모습을 볼 수 있다.

전송이 완료된 후에 웹 페이지 콘솔을 확인하게 되면, 내가 만든 리포지토리 안에 latest 태그가 걸려있는 이미지가 들어가 있는 것을 볼 수 있다.

 

여기까지가 ECR 의 리포지토리 를 생성하는 과정이었다.


이미지를 업데이트 해야 한다면 같은 방식으로 이미지를 빌드하고 태깅하여 푸쉬하는 과정을 거쳐야 되며, ECR 에서는 그냥 이미지 등록만 한다는 것을 생각하면 될 것이다.

 

이 다음 부터는 더 복잡해진다.

반응형
Comments