brunch

10탄-ECS 시작

실습

by Master Seo

목표

ECS 만들어 보자.

Amazon Elastic Container Service(ECS)는 완전관리형 컨테이너 오케스트레이션 서비스


10 ecs.png



<0> 일반 계정으로 ECS사용시 할당 해야 할 권한

<1> ecs 샘플 이미지로 작업정의 등록

<2> 클러스터 생성과 서비스 생성

<3> 새 버전 서비스 = ECS 내용 수정해 다시 배포하기

<4> ECS란?




<0> 일반 계정으로 ECS사용시 할당 해야 할 권한


https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_managed_policies.html


1

생성 프로세스 확인 하세요.


https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/docker-basics.html





<1> ecs 샘플 이미지로 작업 정의


1

Service > ECS > 작업 정의 > 새 작업 정의 > EC2 > 다음 >

화면 맨아래 Json을 통해 구성

// JSON 코드입력

// 컨테이너 정의등 내용 확인

> 생성


// IAM > Elastic Container Service가 ecsTaskExecutionRole을(를) 생성하고 사용할 수 있는 권한을 부여하고 있습니다


2

ECS > 작업 정의 > 컨테이너 생성 확인

10 394.png



<2> 클러스터 생성과 서비스 생성


1

ECS 클러스터를 생성한다.

ECS > 클러스터 > 클러스터 생성 > EC2 Linux + 네트워킹 > ECSCluster1

t3.small

ecsinstanceRole 사용

ec2


role

서비스 : ec2

ecsInstanceRole


policy

AmazonEC2ContainerServiceforEC2Role

{

"Version": "2012-10-17",

"Statement": [

{

"Effect": "Allow",

"Action": [

"ec2:DescribeTags",

"ecs:CreateCluster",

"ecs:DeregisterContainerInstance",

"ecs:DiscoverPollEndpoint",

"ecs:Poll",

"ecs:RegisterContainerInstance",

"ecs:StartTelemetrySession",

"ecs:UpdateContainerInstancesState",

"ecs:Submit*",

"ecr:GetAuthorizationToken",

"ecr:BatchCheckLayerAvailability",

"ecr:GetDownloadUrlForLayer",

"ecr:BatchGetImage",

"logs:CreateLogStream",

"logs:PutLogEvents"

],

"Resource": "*"

}

]

}




2

ecs > 클러스터 > ECSCluster 클릭 > 서비스 > 생성 > EC2 선택

서비스이름

seo-service1

작업 개수

2

다음


3

로드 밸런싱 > Network Load Balancer

IAM 역할 awsserviceroleforecs

{

"Version": "2012-10-17",

"Statement": [

{

"Sid": "ECSTaskManagement",

"Effect": "Allow",

"Action": [

"ec2:AttachNetworkInterface",

"ec2:CreateNetworkInterface",

"ec2:CreateNetworkInterfacePermission",

"ec2:DeleteNetworkInterface",

"ec2:DeleteNetworkInterfacePermission",

"ec2:Describe*",

"ec2:DetachNetworkInterface",

"elasticloadbalancing:DeregisterInstancesFromLoadBalancer",

"elasticloadbalancing:DeregisterTargets",

"elasticloadbalancing:Describe*",

"elasticloadbalancing:RegisterInstancesWithLoadBalancer",

"elasticloadbalancing:RegisterTargets",

"route53:ChangeResourceRecordSets",

"route53:CreateHealthCheck",

"route53:DeleteHealthCheck",

"route53:Get*",

"route53:List*",

"route53:UpdateHealthCheck",

"servicediscovery:DeregisterInstance",

"servicediscovery:Get*",

"servicediscovery:List*",

"servicediscovery:RegisterInstance",

"servicediscovery:UpdateInstanceCustomHealthStatus"

],

"Resource": "*"

},

{

"Sid": "AutoScaling",

"Effect": "Allow",

"Action": [

"autoscaling:Describe*"

],

"Resource": "*"

},

{

"Sid": "AutoScalingManagement",

"Effect": "Allow",

"Action": [

"autoscaling:DeletePolicy",

"autoscaling:PutScalingPolicy",

"autoscaling:SetInstanceProtection",

"autoscaling:UpdateAutoScalingGroup"

],

"Resource": "*",

"Condition": {

"Null": {

"autoscaling:ResourceTag/AmazonECSManaged": "false"

}

}

},

{

"Sid": "AutoScalingPlanManagement",

"Effect": "Allow",

"Action": [

"autoscaling-plans:CreateScalingPlan",

"autoscaling-plans:DeleteScalingPlan",

"autoscaling-plans:DescribeScalingPlans"

],

"Resource": "*"

},

{

"Sid": "CWAlarmManagement",

"Effect": "Allow",

"Action": [

"cloudwatch:DeleteAlarms",

"cloudwatch:DescribeAlarms",

"cloudwatch:PutMetricAlarm"

],

"Resource": "arn:aws:cloudwatch:*:*:alarm:*"

},

{

"Sid": "ECSTagging",

"Effect": "Allow",

"Action": [

"ec2:CreateTags"

],

"Resource": "arn:aws:ec2:*:*:network-interface/*"

},

{

"Sid": "CWLogGroupManagement",

"Effect": "Allow",

"Action": [

"logs:CreateLogGroup",

"logs:DescribeLogGroups",

"logs:PutRetentionPolicy"

],

"Resource": "arn:aws:logs:*:*:log-group:/aws/ecs/*"

},

{

"Sid": "CWLogStreamManagement",

"Effect": "Allow",

"Action": [

"logs:CreateLogStream",

"logs:DescribeLogStreams",

"logs:PutLogEvents"

],

"Resource": "arn:aws:logs:*:*:log-group:/aws/ecs/*:log-stream:*"

},

{

"Sid": "ExecuteCommandSessionManagement",

"Effect": "Allow",

"Action": [

"ssm:DescribeSessions"

],

"Resource": "*"

},

{

"Sid": "ExecuteCommand",

"Effect": "Allow",

"Action": [

"ssm:StartSession"

],

"Resource": [

"arn:aws:ecs:*:*:task/*",

"arn:aws:ssm:*:*:document/AmazonECS-ExecuteInteractiveCommand"

]

}

]

}


4

로드 밸런서 생성하기

Network Load Balancer > Create

ecs-nlb1

public subnet에 lb를 위치해야 한다.


80 tcp > mytargetGroup

Create Target group > ecs-tg

서버 선택


다음단계 > 다음 단계 > 서비스 생성




5

서비스 보기


ECS > Clousters > ECSCluster 클릭 >


20 service.png




6

이벤트 > 새로 고침

대상 그룹 이름 확인

세부 정보 > 대상 그룹 이름 > 로드밸런서 클릭 > DNS 이름 복사


// 로드밸런서 DNS로 사이트가 안뜨면 개별 EC2 public IP를 브라우저로 접속해보라.



7

사이트 확인

시간이 10분 정도 걸린다.

좀 기다린후 확인하라.

대상 그룹에서 NLB에 연결된 서버 상태 확인하라.



30 site.png





<3> 새 버전 서비스 = ECS 내용 수정해 다시 배포하기


1

작업 정의 > JSON 에서 내용 수정


2

ECSCluster > myservice 체크 > 업데이트 > Revision 을 latest로 변경하자!!




1

ECS > 작업 정의 > 생생되어 있는 작업정의 mycontainer 체크 >

새 계정 생성 (Create new revison) > 맨아래 JSON을 통해 구성

// 화면 내용 수정

Congratulations ! => sssss 로 변경

Your application is now running xxxxxxxx 을 sssssssss 로 변경

> 생성


작업 정의 mycontainer:2 의 새버전 생성이 완료 된다!!!



2

ECS > Cluster > ECSCluster > myservice 체크 > 업데이트 클릭 > 다음 > 다음 > 다음

> 서비스 업데이트 > 서비스 보기


3

배포 탭 > 갱신 클릭 > 10분 소요



4

웹브라우저로 다시 접속

> 새버전으로 사이트가 변경 되었다.





<4> ECS란?


https://brunch.co.kr/@topasvga/1291


https://aws.amazon.com/ko/ecs/


감사합니다.

keyword
매거진의 이전글393. CodeCommit 레파지토리 사용하기