brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jun 07. 2020

 10탄-ECS 시작

실습

목표

ECS  만들어 보자.

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




<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 > 작업 정의  >  컨테이너 생성 확인



<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

작업 개수

다음


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 클릭 > 





6

이벤트 >  새로 고침

대상 그룹 이름  확인 

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


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



7

사이트 확인

시간이  10분 정도 걸린다. 

좀 기다린후 확인하라.

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







<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/


감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari