티스토리 뷰

728x90
반응형

 포스팅에서는 AWS ECS를 구성해 보는 세션입니다.


Amazon ECS는 Cloud 환경에 적용 가능한 Container Service로 OS를 포함하지 않아 가볍고, 빠른 배포, 빠른 기동이 가능한 컨테이너 오케스트레이션 서비스입니다.

컨테이너 오케스트레이션 도구에는 Docker에서 만든 Docker Swarm, 구글의 Kubernetes, 하시코프의 Nomad등 다양한 오케스트레이션 도구가 있습니다.


본 세션에서는 ECS의 Instance 형태인 Serverless기반의 Fargate와 VM기반의 EC2에 대해 각각 다뤄볼 예정입니다.

AWS EC2의 경우 컨테이너를 EC2 서버에 배치하고 이를 클러스터로 묶어서 관리하며, Fargate의 경우 서버 또는 클러스터를 관리할 필요없이 컨테이너를 논리적으로 관리하는 형태입니다.


본 실습은 총 세번에 걸쳐 진행될 예정입니다.

 AWS ECS의 기본 개념 및 VPC & IAM 구성

㉡ Docker Image 생성 및 ECR Private Registry 반영

㉢ ECS Cluster 생성 및 구성

이번 포스팅에서는 그 두번째 Docker Image 생성 및 ECR Private Registry 반영 방법에 대해 살펴보겠습니다.


포스팅에 앞서 AWS ECS의 기본 구성요소 및 VPC, IAM에 관련된 포스팅은 아래를 참고하시기 바랍니다.

[AWS ECS 구성하기] Part 1. VPC & IAM 구성하기



ECS DockerInstance 생성 및 접속

1) DockerInstance 생성

EC2 인스턴스 생성과정은 간단히 패스하도록 하겠습니다. 참고해야할 설정은 다음과 같습니다.

AMI - Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-018a9a930060d38aa, Instance Type - t2.micro를 선택합니다.

네트워크, 서브넷은 설정한 NrsonPublicVPC를 선택하며, 퍼블릭 IP 자동 할당 활성화 그리고 IAM 역할을 NrsonDockerInstance로 선택 후 EC2 인스턴스를 생성합니다.

앞서 생성한 보안 그룹 중 NrsonDockerInstance로 선택하여 설정을 마무리하고 EC2 인스턴스를 기동합니다.


2) Docker Instance 접속

생성 된 Instance에 접속하여 Docker Image를 생성해 보도록 하겠습니다.

접속 방법은 다음과 같습니다.

NrsonDockerInstance의 퍼블릭 DNS(IPv4)를 복사하여 접속 URL로 사용합니다.

접속 시 ID는 ec2-user를 사용합니다.

Putty, SecureCRT, Mobaxterm등에 접속 테스트를 진행하였으며, 사용할 SSH 프로그램은 SecureCRT입니다.

먼저 입력 IP에 Public DNS값을 입력합니다.

다음으로 접속 계정으로 ec2-user를 입력합니다. 비밀번호는 없습니다.

마지막으로 인증방식으로 PublicKey를 선택하고 EC2 Instance 생성 시 신규로 생성한 또는 기존에 생성했던 Key를 입력합니다.

정상적으로 접속이 완료되면 다음과 같은 CLI를 확인할 수 있습니다.


Docker Image 생성

Console에 접속이 완료되면 먼저 선행 작업으로 아래 명령어를 CLI 환경에서 수행합니다.


CentOS / RedHat 계열의 Package 매니저인 yum을 활용하여 Docker를 설치하고 권한을 부여하는 과정입니다.

# docker install

sudo yum update -y

sudo yum install -y docker

sudo service docker start

sudo usermod -a -G docker ec2-user

sudo service docker restart


Docker Image를 생성한 Application을 다운로드 받습니다.

# get Source

curl -O s3-us-west-2.amazonaws.com/apn-bootcamps/microservice-ecs-2017/ecs-lab-code-20170524.tar.gz

gzip -d ecs-lab-code-20170524.tar.gz

tar -xvf ecs-lab-code-20170524.tar


Docker Build를 수행하여 각각의 Image를 생성합니다. Docker Build를 수행한 이미지가 정상 동작하는지도 확인합니다.

docker build의 경우 Dockerfile을 이용한 이미지를 생성하는 명령어입니다.

# docker build (web)

cd /home/ec2-user/Docker/aws-microservices-ecs-bootcamp-v2/web

docker build -t nrson/web .

docker images

docker run -d -p 3000:3000 nrson/web

docker ps

curl localhost:3000/web


위와 같은 과정으로 Docker Image를 생성합니다. 생성에 앞서 Dockerfile에 대해 살펴보고 진행하도록 하겠습니다.


FROM ubuntu:latest

MAINTAINER widha@amazon.com

RUN apt-get update -y && apt-get install -y apt-transport-https curl ca-certificates wget unzip python-pip python-dev build-essential && apt-get clean && apt-get autoremove && rm -rf /var/lib/apt/lists/*

RUN wget https://s3.dualstack.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-linux-2.x.zip && unzip aws-xray-daemon-linux-2.x.zip && cp ./xray /usr/bin/xray

COPY . /app

WORKDIR /app

RUN pip install -r requirements.txt

ENTRYPOINT ["python"]


EXPOSE 3000


CMD ["xray", "--log-file /var/log/xray-daemon.log"] &

CMD ["app.py"]


작성 방법은 위와 같습니다.

Ubuntu base image로 Docker Image를 생성합니다. Ubuntu OS에 기본 Package manager인 apt-get을 이용하여 update를 수행하고, AWS X-Ray라는 도구를 설치합니다. 애플리케이션이 처리하는 요청에 대한 데이터를 수집하는 서비스로, 해당 데이터를 보고, 필터링하고, 통찰을 얻어 문제와 최적화 기회를 식별할 수 있는 도구입니다. 실행을 위해서는 EXPOSE를 이용해 포트를 명시할 수 있습니다.


본격적으로 Image를 생성해 보도록 하겠습니다.


[ec2-user@ip-10-0-0-203 web]$ pwd

/home/ec2-user/Docker/aws-microservices-ecs-bootcamp-v2/web

[ec2-user@ip-10-0-0-203 web]$ docker build -t nrson/web .

Sending build context to Docker daemon  13.82kB

Step 1/11 : FROM ubuntu:latest

 ---> 47b19964fb50

Step 2/11 : MAINTAINER widha@amazon.com

 ---> Using cache

 ---> d24751612c1c

Step 3/11 : RUN apt-get update -y && apt-get install -y apt-transport-https curl ca-certificates wget unzip python-pip python-dev build-essential && apt-get clean && apt-get autoremove && rm -rf /var/lib/apt/lists/*

 ---> Using cache

 ---> f783fcacd7f5

Step 4/11 : RUN wget https://s3.dualstack.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-linux-2.x.zip && unzip aws-xray-daemon-linux-2.x.zip && cp ./xray /usr/bin/xray

 ---> Using cache

 ---> a47b2cabcb52

Step 5/11 : COPY . /app

 ---> Using cache

 ---> 4cf41d782dbe

Step 6/11 : WORKDIR /app

 ---> Using cache

 ---> 629c6e3c6855

Step 7/11 : RUN pip install -r requirements.txt

 ---> Using cache

 ---> 76296dda5f80

Step 8/11 : ENTRYPOINT ["python"]

 ---> Using cache

 ---> 582ee2f1d620

Step 9/11 : EXPOSE 3000

 ---> Using cache

 ---> 8be0dc4bbd77

Step 10/11 : CMD ["xray", "--log-file /var/log/xray-daemon.log"] &

 ---> Using cache

 ---> 267e55de74cb

Step 11/11 : CMD ["app.py"]

 ---> Using cache

 ---> 853150af6a28

Successfully built 853150af6a28

Successfully tagged nrson/web:latest

[ec2-user@ip-10-0-0-203 web]$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

nrson/web           latest              853150af6a28        16 seconds ago      453MB

ubuntu              latest              47b19964fb50        10 days ago         88.1MB

[ec2-user@ip-10-0-0-203 web]$ docker run -d -p 3000:3000 nrson/web

9ea692d59f7662025c4e03e000a11aaa730824b17980b423d5dfba38ff768e8e

[ec2-user@ip-10-0-0-203 web]$ docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES

9ea692d59f76        nrson/web           "python app.py"     5 seconds ago       Up 4 seconds        0.0.0.0:3000->3000/tcp   cocky_bardeen

[ec2-user@ip-10-0-0-203 web]$ curl localhost:3000/web

<html>

  <head>

...

...

...

  </script>

  </body>

</html>

[ec2-user@ip-10-0-0-203 web]$ 


동일한 과정으로 api application도 Image를 생성합니다.


# docker build (api)

cd /home/ec2-user/Docker/aws-microservices-ecs-bootcamp-v2/api

docker build -t nrson/api .

docker images

docker run -d -p 8000:8000 nrson/api

docker ps

curl localhost:8000/api


ECR 배포

docker image를 ECR(Amazon Elastic Container Registry)에 배포하기 위해서는 먼저 aws system에 로그인을 수행해야 합니다.

# configure aws cli

aws configure


ex) input data - Refer IAM


[ec2-user@ip-10-0-0-222 api]$ aws configure

AWS Access Key ID [****************OMJA]: AKIAIS********BB6AJA

AWS Secret Access Key [****************9lio]: i/HQbfb646H5Kq7***********8brn2BUMw0j

Default region name [ap-northeast-2]: ap-northeast-2

Default output format [json]: json

[ec2-user@ip-10-0-0-222 api]$


위와 같이 aws configure를 수행하기 위해서는 IAM 정보가 필요합니다. 생성된 액세스 키 ID, Secret Access Key, 리전 코드, Output 형식을 입력합니다.


IAM 정보는 다음에서 확인할 수 있습니다.

AWS WebConsole -> IAM -> 사용자 -> 사용자이름 -> 보안 자격 증명

아래와 같이 액세스 키 ID를 확인할 수 있습니다.

엑세스 키의 경우 분실할 경우 확인할 수 있는 방법이 없으니 생성 시점에 csv 파일을 저장해 두시기 바랍니다.

물론 분실하였을 경우 손쉽게 액세스 키를 생성할 수 있으며, 재생성 할 수 있습니다.

다음으로 aws ecr registry에 로그인을 수행합니다.

# get login ecr

aws ecr get-login --no-include-email --region ap-northeast-2


ex) input data


[ec2-user@ip-10-0-0-203 api]$ aws configure

AWS Access Key ID [****************6AJA]: 

AWS Secret Access Key [****************Mw0j]: 

Default region name [ap-northeast-2]: 

Default output format [json]: 

[ec2-user@ip-10-0-0-203 api]$ aws ecr get-login --no-include-email --region ap-northeast-2 

docker login -u AWS -p eyJwYXlsb2FkIjoiRHlpQTE2amxJN00vUVp3YXg0U3FlcWZSS1NqVWdCd3JiWVVUOWN4QXNYL3ZnWC9COWRQWVNMaitkb3N5RUVDRH

...

...

https://284655097643.dkr.ecr.ap-northeast-2.amazonaws.com

[ec2-user@ip-10-0-0-203 api]$ docker login -u AWS -p eyJwYXlsb2FkIjoiRHlpQTE2amxJN00vUVp3YXg0U3FlcWZSS1NqVWdCd3JiWVVUOWN4QXNYL3ZnWC9COWRQWVNMaitkb3N5R

...

...

https://284655097643.dkr.ecr.ap-northeast-2.amazonaws.com

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store


Login Succeeded

[ec2-user@ip-10-0-0-203 api]$


ecr get-login이 정상적으로 수행되면 위와 같이 docker login을 수행하기 위한 암호화된 url이 Return됩니다. 이를 그대로 복사하여 재입력하면 ecr에 정상적으로 로그인 됩니다.


지금부터 ECR Elastic Container Registry에 이미지를 업로드 해보도록 하겠습니다.

# push image to ecr

docker tag nrson/web:latest 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web:latest

docker push 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web:latest

aws ecr list-images --repository-name=nrson/web

docker tag nrson/api:latest 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/api:latest

docker push 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/api:latest

aws ecr list-images --repository-name=nrson/api


먼저 docker tag를 생성합니다.

생성된 tag를 docker images로 확인해 보면 nrson/web의 Image ID와 동일한 것을 확인할 수 있습니다.


[ec2-user@ip-10-0-0-203 api]$ docker tag nrson/web:latest 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web:latest

[ec2-user@ip-10-0-0-203 api]$ docker images

REPOSITORY                                                    TAG                 IMAGE ID            CREATED             SIZE

nrson/api                                                     latest              ae9d617732a4        About an hour ago   453MB

284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web   latest              853150af6a28        About an hour ago   453MB

nrson/web                                                     latest              853150af6a28        About an hour ago   453MB

ubuntu                                                        latest              47b19964fb50        10 days ago         88.1MB

[ec2-user@ip-10-0-0-203 api]$ 



docker push를 수행해 보도록 하겠습니다.


[ec2-user@ip-10-0-0-203 api]$ docker push 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web:latest

The push refers to repository [284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web]

b2540b0250c7: Preparing 

f193b2315cee: Preparing 

df04f43d2421: Preparing 

50df215f02cc: Preparing 

4b7d93055d87: Preparing 

663e8522d78b: Waiting 

283fb404ea94: Waiting 

bebe7ce6215a: Waiting 

name unknown: The repository with name 'nrson/web' does not exist in the registry with id '284655097643'

[ec2-user@ip-10-0-0-203 api]$


위와 같이 nrson/web이라는 repository가 없다는 메시지를 확인할 것입니다. 물론 ECR에 repository를 생성하지 않았기에 발생하는 문제로 이미지를 push 하기전에 먼저 repository를 생성합니다.


AWS Services 중 ECR로 이동합니다.

ECR -> Repositories

생성 과정은 간단합니다.

리포지토리 생성 - 리포지토리 구성에는 이름만 입력하면 생성이 완료됩니다.

nrson/web, nrson/api를 각각 생성합니다.


다시 docker push를 수행해 보도록 하겠습니다.


[ec2-user@ip-10-0-0-203 api]$ docker push 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web:latest

The push refers to repository [284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web]

b2540b0250c7: Pushing [==================================================>]  5.285MB

f193b2315cee: Pushing [==================================================>]  14.85kB

df04f43d2421: Pushing [==================================================>]  17.21MB

50df215f02cc: Pushing [==>                                                ]  19.77MB/343.1MB

4b7d93055d87: Pushing [==================================================>]  3.072kB

663e8522d78b: Waiting 

283fb404ea94: Waiting 

bebe7ce6215a: Waiting 


==> 위와 같이 Pushing 과정이 진행되고


[ec2-user@ip-10-0-0-203 api]$ docker push 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web:latest

The push refers to repository [284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/web]

b2540b0250c7: Pushed 

f193b2315cee: Pushed 

df04f43d2421: Pushed 

50df215f02cc: Pushed 

4b7d93055d87: Pushed 

663e8522d78b: Pushed 

283fb404ea94: Pushed 

bebe7ce6215a: Pushed 

latest: digest: sha256:8fefcf67c3db3bfcb85aabd5f8e5fb11294600e276514b4ed37b938024d6cee7 size: 1993

[ec2-user@ip-10-0-0-203 api]$ 


업로드가 완료된 것을 볼 수 있습니다.


물론 업로드 된 이미지는 ECR 리포지토리에서 볼 수 있습니다.

업로드 완료된 이미지를 cli에서 확인하기 위해서는

aws ecr list-images --repository-name=nrson/web 명령어로 손쉽게 확인할 수 있습니다.


[ec2-user@ip-10-0-0-203 api]$ aws ecr list-images --repository-name=nrson/web

{

    "imageIds": [

        {

            "imageTag": "latest", 

            "imageDigest": "sha256:8fefcf67c3db3bfcb85aabd5f8e5fb11294600e276514b4ed37b938024d6cee7"

        }

    ]

}

[ec2-user@ip-10-0-0-203 api]$



동일한 과정으로 api 이미지 역시 push를 수행하고 업로드를 확인합니다.

docker tag nrson/api:latest 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/api:latest

docker push 284655097643.dkr.ecr.ap-northeast-2.amazonaws.com/nrson/api:latest

aws ecr list-images --repository-name=nrson/api


지금까지 ECR & Docker Image를 생성하는 과정에 대해 살펴보았습니다. 다음시간에는 마지막으로 ECS Cluster를 생성하고 Application을 호출해 보도록 하겠습니다.

728x90
반응형