Upload
amazon-web-services-korea
View
540
Download
1
Embed Size (px)
Citation preview
AWS DevDay Seoul Container hands on lab workshop
Page 1 of 29
Amazon EC2 Container
Service Lab Guide
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
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) 리전에서 진행합니다.
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)임을 확인합니다.
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
게이트웨이를 연결해야합니다.
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 을
사용합니다. )
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 클러스터를 만들것이며, 퍼블릭 서브넷에 인스턴스를 생성 할
것입니다.
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
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 을 통하여 접속합니다
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
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 .
위의 명령을 실행하면 다음과 비슷한 화면이 나타나게 됩니다.
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
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 들이 실행된 상태입니다.
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 명령어들을 참고 할 수 있는 화면이 나타나게 됩니다. 이것들은
다음 과정에서 사용하게 되기에, 미리 해당 명령어들을 저장해 놓으시기 바랍니다. ( 명령어의 차이는 있을
수 있습니다. )
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 로 두면 됩니다.
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 권한을 확인하시기 바랍니다.
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 된 이미지를 알 수
있습니다.
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 를 선택합니다.
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 에 등록 할 때 서비스 엔드 포인트에 대한 특정 상태 확인을 추가 할 것입니다.
AWS DevDay Seoul Container hands on lab workshop
Page 20 of 29
위와 같이 설정 후 “Register targets”를 클릭하고, 해당 내용(Register target)은 그대로 두고, “Review” 를
클릭합니다. 지금까지의 모든 설정을 확인하고, “Create”를 클릭합니다.
이제 다음과 같은 security group 이 할당 되었습니다.
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 를 클릭합니다.
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 를 선택합니다.
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 를
넣습니다.
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 이란 이름으로 생성합니다.
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 를 선택합니다.
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 를 생성합니다.
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 또한 눌러서 확인 합니다 )
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 로그 그룹 삭제
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)