brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Aug 02. 2021

(1시간 공부) ECS 퀵하게 구축해보기


EC2 기반의 ECS를 퀵하게 구축해보자.

ECS 애플리케이션을 업데이트해보자.


<1> ECS 개요

<2> ECS 구축 순서

<3> role 참고

<4> 애플리케이션 내용 업데이트

<5> 서비스  Task 수 늘리기  - 사용자가 늘떄

<6> ECS  삭제 순서



<1> ECS 개요


2 종류로  서비스할 수 있다.

ECS - EC2 ( EC2는  사용자가 관리한다.)

ECS- Fargate ( Fargate는  AWS에서 관리한다)




<2> ECS 구축 순서


ECS 클러스터를 구축한다.

작업 정의를 한다. Task Definition  = contailer 정의 = 샘플 이미지 정의  =  JASON 파일

서비스를 만든다.- LB도 만들어 추가한다.  

접속 확인한다.

애플리케이션 업데이트하여 반영해 본다.



1

ECS 클러스터를 구축한다.

EC2 기반의 ECS를 구축한다.

ECS > Clusers > Create Cluster 

cluster name  

Cluser instance IAM role이 필요하다.  > ecsinstanceRole을 사용한다.

2분 걸림

참고 사이트

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


2

작업 정의를 한다.

EC2 기반으로 한다.

contailer1

Task Definition  = 샘플 이미지 정의  =  JASON 파일

https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/getting-started-ecs-ec2.html


Configure task and container definitions  > Task Role이 필요하다. > ecsTaskExecution Role

인증된 AWS 서비스에 API 요청을 할 때 작업이 사용할 수 있는 IAM 역할 옵션입니다

//admin 계정으로 사용하면 role 새로 생성으로 사용하면 된다.

// 개발자 계정이면 관리자를 통해 role을 생성 받아 사용해야 한다.


Task execution IAM role = 작업 실행 IAM 역할

작업에서 컨테이너 이미지를 가져오고 사용자를 대신하여 Amazon CloudWatch에 컨테이너 로그를 게시하려면 이 역할이 필요합니다. 

ecsTaskExecutionRole이 아직 없는 경우 AWS가 생성할 수 있습니다. 




3

서비스를 만든다.- LB도 만들어 추가한다.  

클러스터 > 서비스 > 생성 >  seo-web01

LB 사용 시  ecsServiceRole 이 필요함

AWS ServiceRoleForECS role 이 필요함.

미리 LB를 만들어 놓아도 된다.  EC2    로드 밸런서

LB생성 시 대상그룹에 EC2를  추가해야 한다. 정상 상태까지 확인 필요 (20분 걸림)


참고 사이트

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


4

접속 확인한다.

LB DNS로 접속 확인한다.

Amazon ECS Sample App

Congratulations!

Your application is now running on a container in Amazon ECS.




<3> role 참고

admin권한으로 작업하면 상관 없다.

하지만 운영자와 개발자 계정이 분리되어 있는 계정이면 role 생성과 사용이 필요하다.



1

Cluser instance IAM role이 필요하다.  > ecsinstanceRole을 사용한다.

AWS Service: ec2

클러스터 생성하는데 필요한 권한

EC2 , ECS , ECR , Logs 필요



{

    "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

Configure task and container definitions  > Task Role이 필요하다. > ecsTaskExecution Role

AWS Service: ecs-tasks

Task 작업하는데 필요한 권한

우선은 ECR과 logs만 있으면 된다.

task role은 다이나모 DB , SSM 등 추가 서비스를 사용하는 경우 권한을 추가 해야 한다.



{

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

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "ecr:GetAuthorizationToken",

                "ecr:BatchCheckLayerAvailability",

                "ecr:GetDownloadUrlForLayer",

                "ecr:BatchGetImage",

                "logs:CreateLogStream",

                "logs:PutLogEvents"

            ],

            "Resource": "*"

        }

    ]

}



3

LB 사용 시   AWS ServiceRoleForECS role 이 필요함. 

AWS Service: ecs (Service-Linked Role

서비스를 올린다는 건 ELB로 외부에서 서버로 접속해 사용하도록 한다는 것으로 권한 필요

EC2 , ELB , route53 , 서비스 디스커버리 , loggs 권한이 필요함. auto scaling , cloudwatch, ssm 필요



{

    "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

기타

LB 사용 시  ecsServiceRole 이 필요함

AWS Service: ecs

서비스를 올린다는 건 ELB로 외부에서 서버로 접속해 사용하도록 한다는 것으로 권한 필요

EC2 권한과 ELB 권한 필요.


{

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

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "ec2:AuthorizeSecurityGroupIngress",

                "ec2:Describe*",

                "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",

                "elasticloadbalancing:DeregisterTargets",

                "elasticloadbalancing:Describe*",

                "elasticloadbalancing:RegisterInstancesWithLoadBalancer",

                "elasticloadbalancing:RegisterTargets"

            ],

            "Resource": "*"

        }

    ]

}






<4>   애플리케이션 내용 업데이트


1

애플리케이션 새로 작업 정의하여,  서비스 업데이트하여 반영해 본다.


ECS > 작업 정의  >  사용 중인 컨테이너 클릭 >  해당 컨터이너 클릭 > 새  버전   >   JSON내용 수정  2222

또는 새    수정 내용 JSON 반영


2

클러스터 > 서비스 > 업데이트   > 새 버전으로 변경  > 업데이트   (10분 소요)




<5>   서비스  Task 수 늘리기  - 사용자가 늘떄


클러스터

서비스 선택

업데이트

Task 수 2

업데이트

배포 탭 보기




<5> 정리


1

생성 순서는?

클러스터 

Task  정의 

서비스 생성


2

롤이 필요하다.


3

업데이트 순서는?

Task  정의에서  컨테이너 수정   

클러스터의 서비스  업데이트 


4

서비스  Task 수 늘리기  - 사용자가 늘떄

서비스 가서 Task를  늘린다.




<6> ECS  삭제 순서


1

서비스 지우기


2

클러스터 지우기 (10분)


3

작업 정의 지우기


4

LB 지우기

작업 정의 지우기



감사합니다.

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