「초심자」무작정 해보는 ECS 컨테이너 서비스 구축 – 1 (ECR에 이미지 푸시)

「무작정 해보는 ECS 컨테이너 서비스 구축」과정의 첫 번째로 dockerfile을 생성하고 ECR에 이미지를 푸시하는 과정을 정리해 봤습니다.
2021.11.04

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다.「무작정 해보는 ECS 컨테이너 서비스 구축」과정의 첫 번째로 dockerfile을 생성하고 ECR에 이미지를 푸시하는 과정을 정리해 봤습니다.

먼저 ECS 컨테이너 서비스를 구축하기 전에 Docker에 대해서 어느 정도 알 필요가 있다고 생각합니다. Docker 관련해서는 아래 블로그를 참고해 주세요

* 본 블로그에서는 AWS ECS의 이론적인 부분이 아닌, 실습을 중점으로 다루고 있습니다.

다음 챕터는 아래 링크를 참고해 주세요.

환경 구축

ecs-vpc라는 이름으로 vpc를 하나 생성합니다.

이미지와 같이 public subnet과 private subnet을 생성합니다.

public-subnet-1, private-subnet-1은 가용영역 a로 설정하고, public-subnet-2, private-subnet-2는 가용영역 b로 설정합니다.

라우팅 테이블 탭을 클릭해 보면, 디폴트로 생성된 라우팅 테이블이 있습니다. 이 라우팅 테이블에는「pulic-rt」라고 이름을 설정해 주고, public-subnet-1, public-subnet-2를 연결합니다. 그리고 라우팅 테이블을 하나 더 생성해서 이름은「private-rt」라고 설정하고 private-subnet-1, private-subnet-2르 연결합니다.

이어서 인터넷 게이트웨이를 생성합니다. 「VPC에 연결」을 클릭해서 ecs-vpc를 선택합니다.

라우팅 테이블에서「public-rt」의 라우팅 편집에서 인터넷 게이트웨이를 추가합니다.

docker를 설치하고 dockerfile을 만들 EC2가 필요하기 때문에 EC2에 대한 보안 그룹을 생성합니다. 별 다른 작업은 필요없기 때문에 ssh만 열어줍니다.

ECS 컨테이너를 생성할 때, 로드 밸런서를 설정하기 때문에 로드 밸런서의 보안 그룹 또 한 생성합니다.

마지막으로 컨테이너의 보안 그룹을 설정합니다. 컨테이너의 경우 private subnet에 배치할 생각이기 때문에 외부에서 접근할 수 없는 상황입니다. 그렇기 때문에 로드 밸런서를 통해 들어오도록 소스를 로드 밸런서 보안 그룹으로 설정합니다.

지금까지 구축한 환경입니다.

docker 환경 구축

이제 EC2 인스턴스를 생성하고, dockerfile을 생성하는 작업까지 해보도록 하겠습니다.

EC2 인스턴스 생성

인스턴스 탭을 클릭하고「인스턴스 시작」버튼을 클릭합니다.

상단에 있는 아마존 리눅스을 선택합니다.

지금 생성하고 있는 EC2에서는 docker만 다룰 생각이기 때문에, 인스턴스 유형은 디폴트로 설정되어 있는 t2.micro를 확인하고「다음:인스턴스 세부 정보 구성」버튼을 클릭합니다.

네트워크는 ecs-vpc를 선택하고, 서브넷은 public-subnet-1을 선택, 퍼블릭 ip 자동 할당을 활성화 합니다. 그리고 다음으로 넘어갑니다.

스토리지는 디폴트 값을 확인하고 넘어갑니다. name 태그에는 ecs-ec2를 입력하고, 보안 그룹은 ecs-ec2-sg를 선택하고「시작하기」버튼을 클릭합니다.

시작하기 버튼을 클릭하면 새 키 페어를 생성하는 창이 뜹니다. 키 페어 이름을 입력하고「키 페어 다운로드」버튼을 클릭해서 키 페어를 다운로드 받고「인스턴스 시작」버튼을 클릭합니다.

  • chmod 400 ecs-ec2-jw.pem

그리고 터미널에서 chmod로 카 페어에 읽기 권한을 부여합니다.

생성한 ec2로 들어가서 ssh로 접속을 시도합니다.

docker 설치

sudo -i
yum install -y docker
service start docker
docker images

docker를 설치하고 실행시킵니다. 그리고「docker images」명령어로 docker가 정상적으로 설치 되었는지 확인합니다.

docker images 명령어를 입력하고 이미지와 같은 화면이 나오면 성공적으로 docker가 설치된 것 입니다.

dockerfile 작성

mkdir dockerfile-folder
cd dockerfile-folder/
vi index.html

dockerfile-folder를 생성하고 index.html 파일을 생성합니다.

<!doctype html>
<h1>hello ecs!</h1>

간단하게 hello ecs!를 출력하는 index 파일을 만들었습니다.

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

dockerfile의 경우 nginx를 베이스로 해서 조금전 생성한 index.html을 컨테이너 속 nginx/html 폴더에 복사합니다. 포트 번호는 80번으로 설정하고, CMD로 nginx를 실행 시킵니다.

docker build -t ecs-nginx .

그리고 docker build 명령어로 dockerfile을 빌드합니다.

  • docker images

명령어를 입력해 보면 docker image가 생성된 것을 확인할 수 있습니다.

ECR로 이미지를 푸시하기 전에 현재 생성한 docker image가 정상 작동하는지 테스트해 보겠습니다.

docker create -i -t --name ecs-nginx-container -p 8000:80 fc7bd2e085f5

create 명령어로 컨테이너를 생성합니다. 내부 포트의 경우 80번 포트를 사용하고 있지만 호스트에게 공개할 포트는 8000번으로 설정합니다.

docker ps -a
docker start 4ed1d27d27a5

컨테이너 아이디를 확인하고 start 명령어로 컨테이너를 실행 시킵니다.

이제 EC2 보안 그룹에서 8000번 포트를 열어주고 EC2 IP로 접속 해봅니다.

그럼 정상적으로 웹 페이지가 출력되는 것을 확인할 수 있습니다.

docker stop 4ed1d27d27a5
docker rm 4ed1d27d27a5

이제 컨테이너는 필요없으니 삭제해줍니다.

ECR 리포지토리 생성

ECS에서「리포지토리」를 클릭합니다.

「리포지토리 생성」버튼을 클릭합니다.

리포지토리 이름은 docker image와 동일한 이름으로 설정하고 리포지토리를 생성합니다.

EC2에서 프로필 설정

ECR에 이미지를 푸시하기 위해서는 EC2 인스턴스에서 롤 전환을 할 필요가 있습니다.

  • aws configure list

명령어를 입력해 보면 아무것도 설정되어있지 않은 걸 확인할 수 있습니다.

  • aws configure

명령어로 프로필을 설정합니다.

액세스 키와 시크릿 키는 IAM 사용자에서 액세스 키 만들기 버튼을 클릭해서 확인할 수 있습니다.

프로필 설정이 끝났다면 credentials 파일을 수정합니다.

vi ~/.aws/credentials

vi로 credentials 파일을 열어줍니다.

[role]
region = ap-northeast-2
mfa_serial = arn:aws::mfa/
role_arn = arn:aws:iam:role/
aws_access_key_id =
aws_secret_access_key =
source_profile = role

다음과 같이 설정합니다.

mfa_serial은 IAM 사용자에서 보안 자격 증명 탭을 보면 mfa_serial을 확인할 수 있습니다.

role_arn은 role로 전환 한 다음, 역할에서 확인할 수 있습니다.

  • export AWS_DEFAULT_PROFILE=role
  • aws sts get-caller-identity

다음 명령어를 입력하면 mfa를 입력하라는 메시지가 나옵니다. mfa를 입력하면 롤 전환이 됩니다.

ECR에 docker image 푸시

조금 전 생성한 ECR로 들어간 다음「푸시 명령 보기」버튼을 클릭합니다.

dockerfile 빌드는 이미 했기 때문에 2번을 제외만 명령어를 복사해서 터미널에 붙여넣습니다.

다시 리포지토리를 확인해 보면, 성공적으로 이미지가 푸시된 것을 확인할 수 있습니다.

참고