29
AWS DevDay Seoul Container hands on lab workshop Page 1 of 29 Amazon EC2 Container Service Lab Guide

AWS DevDay 실습 가이드 - 콘테이너

Embed Size (px)

Citation preview

Page 1: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 1 of 29

Amazon EC2 Container

Service Lab Guide

Page 2: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 2 of 29

Table of Contents

Lab 개요 ................................................................................................................................................................. 3

준비 조건 ................................................................................................................................................................ 4

Lab 1. VPC 생성 .................................................................................................................................................. 4

1. VPC 생성........................................................................................................................................................................ 4

Lab 2. IAM Roles 과 Security Group 설정 ............................................................................................... 6

1. Role 생성 ....................................................................................................................................................................... 6

2. Security Group 생성 ................................................................................................................................................. 7

Lab 3. ECS Cluster설정 .................................................................................................................................... 7

1. ECS Cluster 생성 .......................................................................................................................................................... 8

Lab 4. Workstation (Bastion)생성 ............................................................................................................... 9

1. Workstaion(Bastion) 생성 ....................................................................................................................................... 9

Lab 5. Docker Image 준비 ............................................................................................................................ 11

1. image Source 생성 .................................................................................................................................................. 11

2. web, api microservice 로컬 테스트 .................................................................................................................. 11

Lab 6. ECR 을 이용한 container registries 생성 .................................................................................. 14

Lab 7. AWS CLI 설정 ....................................................................................................................................... 15

Lab 8. 테스트 이미지를 ECR에 Push ........................................................................................................ 17

Lab 9. ALB 생성 ............................................................................................................................................... 18

Lab 10. Task Definitions 생성 ..................................................................................................................... 21

Lab 11. Services 생성...................................................................................................................................... 24

Lab 12. Consol과 ALB를 통한 서비스 배포 테스트 ............................................................................ 27

Lab 13. Cloudwatch를 통한 ECS로깅 확인 ........................................................................................... 28

Lab 14. 실습 종료후 삭제할 내용 ................................................................................................................ 28

Page 3: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 3 of 29

Lab 개요

Amazon EC2 Container Service 는 기존의 Docker Container 를 클라우드 환경에서 쉽고, 유연하게 사용할

수 있도록 도와줍니다. 클러스터 관리, 설정, 서버의 확장을 손쉽게 지원하며, 다양한 클라우드

서비스(Amazon EBS, Auto Scaling, IAM, Security Group, Elastic Load Balancing 등)와의 조합을 통하여

견고한 시스템으로 통합됩니다

EC2 Container Registry 는 완전관리형 고가용의 도커 이미지 리포지토리로 도커 컨테이너 이미지

관리방안에 대하여 알아봅니다.

Amazon CloudWatch 를 사용하여 지표를 수집 및 추적하고 로그 파일을 수집 및 모니터링하고 경보를

설정할 수 있으며, 이를 기반으로 Auto Scale 을 사용할 수 있습니다.

이 Workshop 에서는 마이크로 서비스 및 ECS 작업의 기본 사항을 소개합니다. 여기에는 두 개의 마이크로

서비스 컨테이너 이미지 준비, 초기 ECS 클러스터 설정 및 ALB 를 통해 라우팅되는 트래픽이있는 컨테이너

배포가 포함됩니다.

이 Workshop 은 US East (N.Virginia) 리전에서 진행합니다.

Page 4: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 4 of 29

준비 조건

Amazon ECS ( EC2 Container Service ) Workshop 을 진행을 위해서는 다음의 준비사항이 필요합니다.

Microsoft Windows, Mac OS X 또는 Linux(Ubuntu, SuSE 또는 Red Hat)를 실행하며 인터넷 연결 필요

인터넷 브라우저: Chrome, Firefox 또는 IE9(이전 버전의 Internet Explorer 는 지원되지 않음)

PuTTY, Secureshell 등의 SSH 클라이언트 사용

AWS 계정 및 기본적인 AWS 사용 방법 숙지

Lab 1. VPC 생성

1. VPC 생성

1) AWS Console 로그인 하여 VPC 을 선택합니다. 리전은 반드시 N.Virgina(us-east-1)임을 확인합니다.

Page 5: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 5 of 29

2) 전체 인프라에 대한 새로운 VPC 를 만듭니다. Workstaion Bastion Host, ECS 클러스터 및 ALB 에 대해

2 개의 퍼블릭 서브넷이 필요합니다. 다음 요구 사항으로 VPC 를 구성하십시오.

Field value

Name tag ECS Lab VPC

IPv4 CIDR 10.0.0.0/16

Subnet a

Name tag Public subnet a

CIDR 10.0.0.0/24

AZ us-east-1a

Subnet b

Name tag Public subnet b

CIDR 10.0.1.0/24

AZ us-east-1b

( Route Table 과 Internet Gateway 설정을 하셔야 합니다. )

Note : 실제 운영 환경에서는 개인 서브넷에 ECS 클러스터가 있을 가능성이 큽니다. 이 경우 각 ECS

컨테이너 에이전트가 레지스트리에서 컨테이너 이미지를 업데이트하고 검색 할 수 있도록 서브넷에 NAT

게이트웨이를 연결해야합니다.

Page 6: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 6 of 29

Lab 2. IAM Roles 과 Security Group 설정

워크 스테이션에서 ECS 로 접속해서 작업 하려면, 워크스테이션 EC2 인스턴스에 해당 권한이 필요합니다.

IAM 의 Roles> Create New Role 을 통해서 Role 과 EC2 의 Security Group 에, 추후 EC2 워크스테이션

호스트에 할당합니다.

1. Role 생성

1) IAM 에 다음과 같이 Role(ecslabworkstationprofile)을 생성합니다

field value

Select Amazon EC2

Attach Policy: AmazonEC2ContainerRegistryFullAccess

Role Name: ecslabworkstationprofile

2) IAM 에 다음과 같이 Role(ecslabinstanceprofile)을 생성합니다.

ECS 클러스터의 EC2 인스턴스가 컨테이너 레지스트리에 액세스하고, 자동 확장 등을 수행 할 수있는

적절한 권한을 갖고 있는지 확인해야합니다. 나중에 이 역할을 ECS 클러스터의 EC2 인스턴스에

할당합니다.

field value

select Amazon EC2

Attach Policy: AmazonEC2ContainerServiceforEC2Role, AmazonEC2ContainerServiceAutoscaleRole

Role Name: ecslabinstanceprofile

Note : ECS 를 Wizard 를 통해 만들때, 자동으로 ecsInstanceRole 이 생성됩니다. 그러나, 필요할 때 더 많은

정책을 추가 할 수 있도록 항상 특정 역할을 만드는 것이 좋습니다. (이번 랩에서는 지금 생성된 Role 을

사용합니다. )

Page 7: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 7 of 29

2. Security Group 생성

1) EC2 에 Security Group 에 새로운 Security Group(sgecslabpublic)을 생성합니다.

Type Protocol Port Range Source

HTTP TCP 80 0.0.0.0/0

2) EC2 에 Security Group 에 새로운 Security Group(sgecslabworkstation)을 생성합니다.

Type Protocol Port Range Source

SSH TCP 22 My IP

3) EC2 에 Security Group 에 새로운 Security Group(sgecslabpubliccluster)을 생성합니다.

Type Protocol Port Range Source

HTTP TCP 80 0.0.0.0/0

ALL TCP TCP 0 – 65535 sgecslabpublic

(Securtity Group ID)

Lab 3. ECS Cluster설정

컨테이너 인스턴스를 호스팅 할 ECS 클러스터를 만들것이며, 퍼블릭 서브넷에 인스턴스를 생성 할

것입니다.

Page 8: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 8 of 29

1. ECS Cluster 생성

1) EC2 Container Services 콘솔의 Create Cluster 를 선택합니다.

기본적으로 지원하는 Wizard 에서는 Cancel 을 클릭하고, 직접 아래의 정보를 이용해서 생성합니다.

Field Name Value

Cluster Name EcsLabPublicCluster

EC2 instance type t2.micro

Number of instances 2

EBS storage 22

Keypair none

VPC ECS Lab VPC

Subnets pick the 2 public subnets

Security Group sgecslabpubliccluster

IAM Role ecslabinstanceprofile

Page 9: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 9 of 29

Lab 4. Workstation (Bastion)생성

Workstation 은 Docker 를 실행하고 Git 저장소에 액세스 할 수있는 개발자 머신이라고 가정합니다.

1. Workstaion(Bastion) 생성

1) EC2 콘솔의 Launch instance 를 통하여, 아래의 정보를 이용해서 생성합니다.

Field Name Value

AMI: Amazon Linux AMI 2017.03.1

Instance type: t2.micro

Network: ECS Lab VPC

subnet: one of the public subnet

Auto-assign Public IP: enable

IAM Role: ecslabworkstationprofile

next Storage Default 그대로 둠

next tags

name: ecs-lab-workstation

next security group Select an existing security group

(sgecslabworkstation)

Review and launch

기존에 있는 Key 가 있다면, existing keypair 를 아니면

generate a new one 을 선택

2) 인스턴스가 실행될 때 까지 기다리고, 실행되면 다음과 같이 public DNS 을 통하여 접속합니다

Page 10: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 10 of 29

$ ssh -i <사용하는 키> ec2-user@[public DNS 주소]

3) 접속 후, 업데이트와 Docker 설치, 그리고 docker 그룹에 ec2-user 를 추가합니다.

$ sudo yum update -y

$ sudo yum install -y docker

$ sudo service docker start

$ sudo usermod -a -G docker ec2-user

Docker 명령을 sudo 를 사용하지 않고, 실행하기 위해서 Docker 그룹에 ec2-user 를 추가한 것이고,

사용자를 추가한 이후에는 인스턴스에 재접속을 통하여, 새로운 권한으로 실행될 수 있도록 합니다.

지금까지 설정된 것이 정상적으로 되었는지 다음과 같이 확인합니다. ( 아직은 container 가 하나도 올라가

있지 않아서, Containers 는 0 입니다. 추후 web, api 를 배포한 이후에 다시 확인하면 containers 및

Running 이 2 로 보여 질 것입니다. )

[ec2-user@ip-10-0-1-153 ~]$ docker info

Containers: 0

Running: 0

Paused: 0

Stopped: 0

Kernel Version: 4.9.32-15.41.amzn1.x86_64

Operating System: Amazon Linux AMI 2017.03

OSType: linux

..

Live Restore Enabled: false

Page 11: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 11 of 29

Lab 5. Docker Image 준비

web 과 api Microservice 를 개발했고, 최신 소스를 소스 리포지토리에서 가져온다고 가정합니다. 실습을

위해서, 여기서는 curl 로 가져오지만, git 을 이용한다고 가정합니다.

1. image Source 생성

1) 다음과 같이 이미지를 다운 받고 압축을 풉니다.

$ curl -O https://s3-us-west-2.amazonaws.com/apn-

bootcamps/microservice-ecs-2017/ecs-lab-code-20170524.tar.gz

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

2. web, api microservice 로컬 테스트

container 를 내부적으로 빌드하고 실행하도록 하겠습니다. 이번 실습에서 사용하는 몇가지 기본적인

명령어을 사용하고 있습니다. 만약, Docker 를 사용해 본 적이 없으시고, 좀더 자세한 자료를 원하시면 다음

링크를 통하여 알 수 있습니다 (https://docs.docker.com/engine/getstarted/).

1) 첫 번째 컨테이너인 ‘web’을 빌드하기 위해서, 다음과 같이 압축이 풀린 ‘web’폴더로 이동합니다.

해당 폴더에는 ‘web’ Python Flask microservice 가 포함되어 있습니다.

$ cd <path/to/project>/aws-microservices-ecs-

bootcamp/web

2) 해당 container 를 빌드 합니다.

$ docker build -t ecs-lab/web .

위의 명령을 실행하면 다음과 비슷한 화면이 나타나게 됩니다.

Page 12: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 12 of 29

Sending build context to Docker daemon 8.704 kB

Step 1/11 : FROM ubuntu:latest

latest: Pulling from library/ubuntu

75c416ea735c: Pull complete

c6ff40b6d658: Pull complete

Digest:

sha256:a0ee7647e24c8494f1cf6b94f1a3cd127f423268293c25d924fbe18fd82db5a4

Status: Downloaded newer image for ubuntu:latest

성공적으로 해당 단계를 수행하면 다음과 같은 화면이 출력됩니다.

Removing intermediate container b45fd50e5862

Step 11/11 : CMD app.py

---> Running in 4fff4fca5827

---> bae0690c1186

Removing intermediate container 4fff4fca5827

Successfully built bae0690c1186

다음 명령어를 통하여 container 를 실행합니다.

$ docker run -d -p 3000:3000 ecs-lab/web

위의 명령어는 해당 이미지를 데몬 모드에서 실행시키고, docker container 의 3000 포트와

호스트( 현재 실행중인 workstation EC2 )의 3000 포트를 매핑하는 것입니다. 이를 통해, 하나의 호스트에

두개의 microservices 를 port 의 충돌없이 실행시킬수 있습니다.

다음 명령어를 통하여 container 의 실행 상태를 체크합니다.

$ docker ps

Page 13: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 13 of 29

위의 명령어를 통하여, 현재 실행중인 container 들의 리스트를 조회할 수 있습니다. 정상적이라면,

다음과 같이 하나의 container 가 방금 실행된 것을 나타낼 것입니다. ( 약간 상이할 수 있으나, CREATED

결과가 나타나면 됩니다. )

CONTAINER ID IMAGE COMMAND CREATED

STATUS PORTS NAMES

902d8f6bf766 ecs-lab/web "python app.py" About an minute ago Up

About an minute 0.0.0.0:3000->3000/tcp cocky_lumiere

해당 컨테이너는 다음 명령어을 통하여 확인할 수 있습니다.

$ curl localhost:3000/web

결과는 다음과 같이 나타날 것입니다.

<html><head>...</head><body>hi! i'm served via Python +

Flask. i'm a web endpoint. ...</body></html>

“api” microservice 를 위하여, 위에서 했던 다음과 같은 과정[ 1] api 폴더로 이동 ~ [2] api 컨테이너

빌드 및 확인 ]을 반복합니다. 디렉토리는 /api 로 변경하신 후 다음과 같이 하시면 됩니다.

$ cd <path/to/project>/aws-microservices-ecs-

bootcamp/api

$ docker build -t ecs-lab/api .

$ docker run -d -p 8000:8000 ecs-lab/api

$ curl localhost:8000/api

“api” 컨테이너를 curl 로 실행하면 다음과 같은 결과가 나타나게 됩니다.

{ "response": "hi! i'm ALSO served via Python + Flask.

i'm an API."}

이제 ‘web’과 ‘api’ 두개의 microservice container 들이 실행된 상태입니다.

Page 14: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 14 of 29

Lab 6. ECR 을 이용한 container registries 생성

Docker image 들을 build 하고 push 하기 전에, 리포지토리를 먼저 생성 해야 합니다. 이번 랩에서는

Amazon ECR 에 두개의 리포지토리(web, api)를 만들도록 하겠습니다.

리포지토리를 만들기 위해서는 ECS 콘솔로 이동하고, Repositories 를 선택합니다. 이후 Get started 를

선택합니다. 첫번째 리포지토리의 이름은 ecs-lab/web 으로 입력합니다.

리포지토리를 생성하면, 다음과 같이 push 명령어들을 참고 할 수 있는 화면이 나타나게 됩니다. 이것들은

다음 과정에서 사용하게 되기에, 미리 해당 명령어들을 저장해 놓으시기 바랍니다. ( 명령어의 차이는 있을

수 있습니다. )

Page 15: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 15 of 29

ecs-lab-web 을 만들었다면, api 를 위해서, 동일한 과정을 반복합니다. 다만, 리포지토리 이름은 ecs-

lab/api 으로 입력하시면 됩니다. 리포지토리 생성 후 참고할 push 명령어들은 리포지토리 별로 다르기

때문에, 해당 명령어 또한 미리 저장해 놓으시기 바랍니다.

Lab 7. AWS CLI 설정

workstation EC2 로 돌아가서, 만약 AWS CLI 를 설정한 적이 없다면, 다음과 같이 간단히 설정 할 수

있습니다.

$ aws configure

위의 명령어를 통해서, 설정을 마법사 형식으로 편하게 할 수 있습니다. Workstation EC2 인스턴스는

생성시 미리 IAM 역할에 정의되어 있어서, access key ID 를 넣지 않아도 됩니다. 다음과 같이 몇 가지

항목은 default 로 두면 됩니다.

Page 16: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 16 of 29

AWS Access Key ID [None]:

AWS Secret Access Key [None]:

Default region name [None]: us-

east-1

Default output format [None]:

json

IAM 사용자가 올바른 권한을 가지고, ECR 인증 토큰을 얻기 하여 다음 명령을 통하여 CLI 가 AWS 계정에

연결되도록 설정되어 있는지 테스트 할 수 있습니다.

$ aws ecr get-login --region us-east-1

명령 실행결과는 다음과 비슷할 것입니다.

docker login -u AWS –p

AQECAHhwm0YaISJeRtJm5n1G6uqeekXuoXXPe5UFce9Rq8/14wAAAy0wggMpBgkqhkiG9w0BBwaggg

MaMIIDFgIBADCCAw8GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM+76slnFaYrrZwLJyAgEQgIIC

4LJKIDmvEDtJyr7jO661//6sX6cb2jeD/RP0IA03wh62YxFKqwRMk8gjOAc89ICxlNxQ6+cvwjewi+

8/W+9xbv5+PPWfwGSAXQJSHx3IWfrbca4WSLXQf2BDq0CTtDc0+payiDdsXdR8gzvyM7YWIcKzgcRV

jOjjoLJpXemQ9liPWe4HKp+D57zCcBvgUk131xCiwPzbmGTZ+xtE1GPK0tgNH3t9N5+XA2BYYhXQzk

TGISVGGL6Wo1tiERz+WA2aRKE+Sb+FQ7YDDRDtOGj4MwZ3/uMnOZDcwu3uUfrURXdJVddTEdS3jfo3

d7yVWhmXPet+3qwkISstIxG+V6IIzQyhtq3BXW/I7pwZB9ln/mDNlJVRh9Ps2jqoXUXg/j/shZxBPm

33LV+MvUqiEBhkXa9cz3AaqIpc2gXyXYN3xgJUV7OupLVq2wrGQZWPVoBvHPwrt/DKsNs28oJ67L4k

TiRoufye1KjZQAi3FIPtMLcUGjFf+ytxzEPuTvUk4Xfoc4A29qp9v2j98090Qx0CHD4ZKyj7bIL53j

SpeeFDh9EXubeqp6idIwG9SpIL9AJfKxY7essZdk/0i/e4C+481XIM/IjiVkh/ZsJzuAPDIpa8fPRa

5Gc8i9h0bioSHgYIpMlRkVmaAqH/Fmk+K00yG8USOAYtP6BmsFUvkBqmRtCJ/Sj+MHs+BrSP7VqPbO

1ppTWZ6avl43DM0blG6W9uIxKC9SKBAqvPwr/CKz2LrOhyqn1WgtTXzaLFEd3ybilqhrcNtS16I5SF

VI2ihmNbP3RRjmBeA6/QbreQsewQOfSk1u35YmwFxloqH3w/lPQrY1OD+kySrlGvXA3wupq6qlphGL

EWeMC6CEQQKSiWbbQnLdFJazuwRUjSQlRvHDbe7XQTXdMzBZoBcC1Y99Kk4/nKprty2IeBvxPg+NRz

g+1e0lkkqUu31oZ/AgdUcD8Db3qFjhXz4QhIZMGFogiJcmo= -e none

https://<account_id>.dkr.ecr.us-east-1.amazonaws.com

ECR 에 접속하기 위해서, 위의 실행 결과를 copy & paste 하시면, 다음과 같은 실행결과가 나타납니다.

Login succeeded

만약, ECR 에 접속을 할 수 없다면, IAM 권한을 확인하시기 바랍니다.

Page 17: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 17 of 29

Lab 8. 테스트 이미지를 ECR에 Push

이미지들은(web, api)이전 과정에서 테스트 했고, 이 이미지들에 대하여, tag 를 달고, ECR 에 push 해야

합니다. 이 과정은 추후, ECS 클러스터에 배포 할 수있는 Task Definitions 를 사용합니다.

Registry 를 생성 과정을 보기 위해서는 push 명령어들이 필요합니다 (이전에 ECR 생성 시 해당 명령어

확인). 만약, push 명령어를 기존에 저장해 놓지 않았다면, 다음 리포지토리 위치에서 확인 가능합니다.

(ECS Console > Repositories > 생성한 repository 명> View Push Commands )

다음의 명령어를 통해서 Tag 를 생성하고, web 리포지토리에 push 합니다.

$ docker tag ecs-lab/web:latest <account_id>.dkr.ecr. us-east-

1.amazonaws.com/ecs-lab/web:latest

$ docker push <account_id>.dkr.ecr. us-east-1.amazonaws.com/ecs-

lab/web:latest

실행 결과는 다음과 같이 나타납니다.

The push refers to a repository [<account_id>.dkr.ecr.us-east-

1.amazonaws.com/ecs-lab/web]

4acc70385e61: Pushed

….

cb11ba605400: Pushed

latest: digest:

sha256:8cb6d69b1935cffb429ac847897346ff0312ddc514fa81db8394c474a89bb9bf

size: 2200

‘api'또한 다음 명령어를 통하여 Tag 를 생성하고, push 합니다. (이전에 Repository 등록시 Command)

$ docker tag ecs-lab/api:latest <account_id>.dkr.ecr.us-east-

1.amazonaws.com/ecs-lab/api:latest

$ docker push <account_id>.dkr.ecr.us-east-1.amazonaws.com/ecs-lab/api:latest

(참고: 왜 :l astest 를 사용할까요? 대부분의 실제 운영 환경에서는 다른 스키마 이미지에 태그를

지정합니다. 예를 들어 최신 이미지와 같은 컨테이너의 다른 모든 버전에 CI 작업의 커밋 SHA 를 사용하여

태그 할 수 있습니다. 특정 태그없이 이미지를 푸시하면 기본적으로 : latest 로 설정되고 해당 태그로 이전

이미지의 태그를 해제 할 수 있습니다. Docker 태그에 대한 자세한 내용은 Docker 설명서

(https://docs.docker.com/engine/getstarted/step_six/) 를 참고하십시오.

AWS Console 에서 push 된 이미지를 볼수 있고, CLI 를 통해서도, 리포지토리에 push 된 이미지를 알 수

있습니다.

Page 18: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 18 of 29

$ aws ecr list-images --repository-name=ecs-lab/api

{ "imageIds": [{

"imageTag": "latest",

"imageDigest":

"sha256:f0819d27f73c7fa6329644efe8110644e23c248f2f3a9445cbbb6c84a01e108f" }]}

Lab 9. ALB 생성

이제 사용할 이미지를 push 했고, 사용할 endpoint 들에 트래픽을 분산하기 위해서, Application Load

Balancer (ALB)가 필요합니다. 기존에 classic load balacer 와 비교하면, ALB 는 각각의 endpoint 들로 바로

트래픽을 보낼 수 있습니다. 이번 실습에서는 /web 과 /api 두 가지 다른 endpoint 들을 사용합니다.

ALB 를 만들기 위해서는, EC2 Console 에서 왼쪽 메뉴에 Load Balancers 를 선택하고, Create Load

Balancer 를 선택합니다.

Page 19: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 19 of 29

ALB 의 이름은 EcsLabAlb 로 하고, HTTP Listener 에 80 포트를 설정합니다.

참고 : 실제 운영 환경에서는 보안 리스너인 443 포트를 사용해야 합니다. 443 포트를 사용하기 위해서는

SSL 인증서가 필요하며, AWS Certificate Manager 또는 Certificate Authority(CA)에서 발급받은 인증서를

사용할 수 있습니다. 이번 실습에서는 안전하지 않은 HTTP 리스너만 사용합니다. 절대 실제 운영환경에

사용하지 마십시요.

HA (High Availability)를 위해서는 적어도 2 개의 서브넷이 필요로 합니다. 이전에 생성했던 VPC 를

선택하고, Configure Security Settings 를 선택합니다.

Select an existing security group 을 선택하고, sgecslabpublic 을 선택합니다.

“Configure routing” 을 선택합니다. 기본적인 설정을 위해서, 다음과 같이 더미로 healthcheck 를 설정하고

path 에 /를 넣습니다. ALB 에 등록 할 때 서비스 엔드 포인트에 대한 특정 상태 확인을 추가 할 것입니다.

Page 20: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 20 of 29

위와 같이 설정 후 “Register targets”를 클릭하고, 해당 내용(Register target)은 그대로 두고, “Review” 를

클릭합니다. 지금까지의 모든 설정을 확인하고, “Create”를 클릭합니다.

이제 다음과 같은 security group 이 할당 되었습니다.

Page 21: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 21 of 29

Lab 10. Task Definitions 생성

Task Definitions 의 Log 를 남기기 위해서, CloudWatch > Logs > Actions > Create Log Group 을 통하여,

‘ecs-lab’ 이라는 새로운 Log Group 을 생성합니다.

Container 에 서비스를 등록하기 전에, Task Definition 이 필요 합니다. Task Definitions 은 환경 변수들과

같은 것을 정의하고, container 이미지를 사용하고, 서비스의 필요한 리소스(port, memory, CPU)를

할당합니다. Task Definition 을 만들기 위해서, ECS console 메뉴에서 Task Definitions 를 선택하고, Create

a Task Definition 을 클릭합니다.

위와 같이 설정하고, Add Container 를 클릭합니다.

Page 22: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 22 of 29

위와 같이 Container Name 과 image ( 이전에 Repository 로 Push 한 이미지 ), Memory Limits, Port

mappings 를 입력합니다.

포트 매핑에서 컨테이너 포트는 3000 으로 지정했지만 호스트 포트는 0 으로 했습니다. 이것은 동적 포트

할당을 용이하게하기 위해 사용되었으며, 컨테이너 포트를 컨테이너 정의의 특정 호스트 포트에 매핑할

필요 없습니다. 대신, ALB 가 작업 배치 중에 포트를 할당하도록 할 수 있습니다. 포트 할당에 대한 자세한

내용은 ECS 설명서(http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PortMapping.html)

를 확인하십시오.

포트 매핑까지 완료했다면, 스크롤을 내려서, log driver 를 설정하십시요. 몇 가지 옵션이 있지만, 이번

실습에서는 다음과 같이 awslogs 를 선택합니다.

Page 23: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 23 of 29

‘web’ container 를 위해서는, 위와 같이 aws-stream-prefix 의 Value 값에 web 을 넣습니다. Log driver 까지

설정이 완료되었으면, Container Definition 을 Save 하고, Create 버튼을 클릭해서 Task Definition 을

생성합니다.

위의 전 과정( Task Definition 등록 )을 한번 더 해서 ‘api’ container 를 등록합니다. 모든 과정은 거의

동일하지만, 다음과 같은 부분은 수정되어야 합니다. 이름은 ‘ecs-lab-api’로 하고, image 경로는

“<account_id>.dkr.ecr.us-east-1.amazonaws.com/ecs-lab/api:latest”, Container port options 은 Host

port 는 0, Container Port 는 8000 으로 설정하며 awslogs 의 aws-stream-prefix 의 Value 값에 api 를

넣습니다.

Page 24: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 24 of 29

Lab 11. Services 생성

이제, Services 를 생성해야 합니다. Services 란 Task(containers)의 그룹이며, 동시에 실행할 Task 의 수와

해당 수명주기에 대한 몇 가지 구성을 할 수 있습니다.

먼저, 이 Service 를 위하여, IAM 롤을 생성해야 합니다. IAM > Create Role 로 가서 Amazon EC2

Container Service Role 을 선택하고 attach 한 뒤 EcsLabServiceRole 이란 이름으로 생성합니다.

Page 25: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 25 of 29

ECS 콘솔로 돌아가서, 이전에 생성된 cluster(EcsLabPublicCluster)를 선택합니다. 이제 웹 서비스를

생성해야 합니다. Cluster detail page 에서 Services > Create 를 선택합니다.

위와 같이 Task Definition 을 이전에 생성한 ecs-lab-web:1 을 선택합니다. 이번 실습의 데모를 위해서, 각

Task 는 한 카피만 실행합니다. 실제 운영환경에서는 안정성과 가용성을 위해서, 각 Task 는 항상 한 카피

이상이여야 합니다.

Placement templates 는 디폴트 그대로 AZ Balanced Spread 로 둡니다. Task Placement 정책에 대하여 더

많은 정보를 알 고 싶다면, http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-

placement-strategies.html 또는 https://aws.amazon.com/blogs/compute/introducing-amazon-ecs-task-

placement-policies/ 를 보시면 됩니다.

Optional Configuraions 에 Configure ELB 를 선택합니다.

Page 26: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 26 of 29

위와 같이 Default 로 두고, Add to ELB 를 클릭합니다.

마지막으로, container 와 ALB 관련된 설정을 하면됩니다. ALB 를 생성했을 때, 리스너는 HTTP:80 만

추가했습니다. 위의 그림과 같이 Listener port, Target group name, Path pattern, Health check path 들을

설정하고, Save 를 클릭한후 Create Service 를 통하여 Service 를 생성합니다.

Page 27: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 27 of 29

api service 또한 추가를 하기 위하여 위의 설정을 다시 한번 진행합니다.

( Service Name : EcsLabApi, Taget Group name:EcsLabApi, Path pattern: /api*, evalution order : 2 ,

Health check: /api )

Lab 12. Consol과 ALB를 통한 서비스 배포 테스트

ECS 콘솔을 통하여, service level events 정보를 볼 수 있습니다. 이것은 배포 이벤트도 포함하고 있으며,

web, api 서비스들이 배포되었고, ALB 에 등록되었는지를 다음과 같이 Services 의 Events 탭에서 확인할

수 있습니다.

또한, ALB 를 직접이용해서도 테스트 할 수 있습니다. ALB 의 DNS A 레코드를 찾아서 (EC2 콘솔에 Load

Balancers > 생성한 Load Balancer 선택, Description 에 DNS Name 이 나와있습니다.) 웹 브라우저에서,

서비스의 endpoint 를 뒤에 /web 입력한 후 엔터키를 누르면 다음과 같이 ALB 와 ECS Cluster 실행된

화면을 볼 수 있습니다. ( Let’s Call API 또한 눌러서 확인 합니다 )

Page 28: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 28 of 29

ALB 는 컨테이너를 등록 할 때 지정한 경로를 기반으로 트래픽을 적절히 라우팅합니다. / web * 요청은 웹

서비스로 이동하고 / api * 요청은 API 서비스로 이동합니다.

Lab 13. Cloudwatch를 통한 ECS로깅 확인

Container Definition 을 만들었을 때, Cloudwatch 에 로그를 보내는 awslogs 드라이버를 추가했습니다

Cloudwatch 콘솔로 이동해서 ecs-lab 그룹을 선택한 다음 개별 스트림을 선택하여 서비스에 대한 자세한

로그를 볼 수 있습니다.

.

Lab 14. 실습 종료후 삭제할 내용

실습을 종료한 뒤에는 다음과 같은 리소스들을 삭제해서, 비용이 추가적으로 발생하지 않도록 합니다.

1) Cloudformaion 콘솔에 가서 EC2ContainerService-EcsLabPubliCluster 스택 삭제

2) Cloudwatch Console > Logs 에 ecs-lab 로그 그룹 삭제

Page 29: AWS DevDay 실습 가이드 - 콘테이너

AWS DevDay Seoul Container hands on lab workshop

Page 29 of 29

3) ECS Console> Repotitories 에서 2 개의 생성된 repotitory 삭제

4) ECS Console> Task Definition 에서 2 개의 task definition 삭제 (Update Service 를 통하여, Number

of tasks 를 0 으로 수정 이후 Deregister)

5) ECS Console > Cluster 에서 EcsLabPublicCluster 삭제

6) EC2 Conodle 에서 ecs-lab-workstation EC2 인스턴스 삭제

7) Load Balancer (EcsLabAlb) 와 Target Groups (Dummy, EcsLabApi, EcsLabWeb)삭제

8) Security Group (sgecslabpublic, sgecslabworkstation,sgecslabpubliccluster)삭제

9) VPC 삭제 (ECS Lab VPC)

10) IAM Console 에서 Role 삭제 (ecslabworkstationprofile, ecslabinstanceprofile, EcsLabServiceRole)