본문 바로가기
프로젝트 (Project)

[AWS] Cats and Dogs Workshop - Using ECS with CI/CD [1]

by moveho 2023. 5. 13.

 

https://catalog.us-east-1.prod.workshops.aws/workshops/8c9036a7-7564-434c-b558-3588754e21f5/en-US

 

Workshop Studio

 

catalog.us-east-1.prod.workshops.aws

해당 글은 AWS workshop studio를 참조하며 진행했습니다.

 

워크숍에서는 고양이와 강아지 사진을 임의로 표시하는 Container /autoscaling application build & deploy 합니다. 또한 컨테이너 monitoring tool 구현하고 application에서 LB 테스트를 수행하고 결과를 모니터링 합니다.

 

[Architecture]

AWS CloudFormation 사용합니다. 또한 AWS Cloud9 사용해서 Docker image 구축합니다. FireLens 사용하여 배포 스크립트를 수정하거나 추가 소프트웨어 설치 코드를 작성하지 않아도 컨테이너 log들을 스토리지 or 분석 도구로 보낼 있습니다. 또한 ALB 사용해 리소스 확장 처리를하게 구성할 것입니다.

 

[OverView]

Cats and Dogs Application Web, Cats, Dogs 페이지 세가지 서비스로 구성됩니다. Web Cats AWS EC2 시작 유형을 사용하고 Dogs 단일 클러스터에서 AWS Fargate 시작 유형을 사용합니다.

웹은 ALB DNS 이름으로 액세스 가능한 기본 웹페이지입니다. WEB에서 I♥Cats or I♥Dogs 클릭하면 ECS 서비스 (Dogs Or Cats) redirection 됩니다.

EC2,Fargate 작업인 Cats,dogs 페이지를 새로고침 마다 무작위로 고양이 사진을 출력합니다.

워크숍에서는 고양이와 강아지 사진을 임의로 표시하는 Container /autoscaling application build & deploy 합니다. 또한 컨테이너 monitoring tool 구현하고 application에서 LB 테스트를 수행하고 결과를 모니터링 합니다.

 

[Architecture]

AWS CloudFormation 사용합니다. 또한 AWS Cloud9 사용해서 Docker image 구축합니다. FireLens 사용하여 배포 스크립트를 수정하거나 추가 소프트웨어 설치 코드를 작성하지 않아도 컨테이너 log들을 스토리지 or 분석 도구로 보낼 있습니다. 또한 ALB 사용해 리소스 확장 처리를하게 구성할 것입니다.

 

[OverView]

Cats and Dogs Application Web, Cats, Dogs 페이지 세가지 서비스로 구성됩니다. Web Cats AWS EC2 시작 유형을 사용하고 Dogs 단일 클러스터에서 AWS Fargate 시작 유형을 사용합니다.

웹은 ALB DNS 이름으로 액세스 가능한 기본 웹페이지입니다. WEB에서 I♥Cats or I♥Dogs 클릭하면 ECS 서비스 (Dogs Or Cats) redirection 됩니다.

EC2,Fargate 작업인 Cats,dogs 페이지를 새로고침 마다 무작위로 고양이 사진을 출력합니다.

 

[필수 체크 사항]

워크숍은 AWS Region 체크해야 합니다. us-east-1(버지니아 북부) , us-east-2(오하이오) , us-west-2(오레곤) , eu-west-1(아일랜드) , ap-northeast-1(도쿄), ap-northeast-2(서울)  ap-south-1(뭄바이) 호환성을 위해 설계되었습니다

워크숍을 시작하기 전에 귀하의 지역이 귀하의 계정에 적절하게 설정되어 있는지 확인하십시오.

1.Stack Deployment

1. Stack 별도의 설정이 없으면 us-east-1 (버지니아 북부) 배포 됩니다.

따로, ap-northeast-2 (서울) 설정해 줍니다.

별도 설정 없이 기본값을 그대로 다음을 클릭합니다.

 

2. 스택이름이 ecs-demogo 인지 확인 하고 다음을 클릭합니다.

[필수 체크 사항]

워크숍은 AWS Region 체크해야 합니다. us-east-1(버지니아 북부) , us-east-2(오하이오) , us-west-2(오레곤) , eu-west-1(아일랜드) , ap-northeast-1(도쿄), ap-northeast-2(서울)  ap-south-1(뭄바이) 호환성을 위해 설계되었습니다

워크숍을 시작하기 전에 귀하의 지역이 귀하의 계정에 적절하게 설정되어 있는지 확인하십시오.

1.Stack Deployment

1. Stack 별도의 설정이 없으면 us-east-1 (버지니아 북부) 배포 됩니다.

따로, ap-northeast-2 (서울) 설정해 줍니다.

별도 설정 없이 기본값을 그대로 다음을 클릭합니다.

 

2. 스택이름이 ecs-demogo 인지 확인 하고 다음을 클릭합니다.

3. 스택 옵션 구성은 건너뛰고 다음을 클릭합니다.

4. 검토 생성 - AWS CloudFormation IAM 리소스를 생성할 있음을 확인 하고 전송을 클릭.

 

5. 스택 상태가 CREATE_COMPLETE 바뀔 때까지 기다립니다.

 

 

 

3. 스택 옵션 구성은 건너뛰고 다음을 클릭합니다.

4. 검토 생성 - AWS CloudFormation IAM 리소스를 생성할 있음을 확인 하고 전송을 클릭.

5. 스택 상태가 CREATE_COMPLETE 바뀔 때까지 기다립니다.

[Stack Deployment 결과]

 

워크숍을 위해서 상단 그림의 구성요소 기본 리소스를 배포했습니다.

 

2.AWS ECR

 

Workshop에서는 다음의 AWS ECR 구성 요소를 사용합니다.

3개의 ECR repository 사용합니다. (Web,cats,dogs) 3개의 repository 생성 AWS C9 사용해서 repository 대한 Docker image build & tag 하고 Docker image push 합니다.

 

3.IAM Role EC2 인스턴스 Profile 업데이트

 

2. WorkstationRole 입력하여 역할을 검색합니다. 역할의 이름을 클릭합니다.스크롤 해서  AmazonEC2ContainerRegistryFullAccess  AmazonS3FullAcces 정책이 역할에 연결되어 있는지 확인합니다.

만약 정책이 연결되어 있지 않다면 권한추가에 정책연결을 클릭 역할에 추가합니다.

 

4.AWS Cloud9 인스턴스 IAM Role 수정 (EC2)

1. AWS EC2 콘솔로 이동 해당 인스턴스를 선택합니다. aws-cloud9-ecsworkshop 인스턴스입니다.

2. 인스턴스를 선택 Actions 클릭 Security 선택한 Modify IAM Role 클릭합니다.

3. 이전에 확인/업데이트한 WorkstationProfile 역할을 선택 IAM 역할 업데이트를 클릭합니다.

 

5.AWS Cloud9 설정

 

1. C9으로 이동합니다.

C9 콘솔에서 Open IDE 클릭합니다.

2. 오른쪽 상단 톱니바퀴 모양을 클릭 AWS SETTINGS 클릭합니다.

3. AWS Credentials aws managed temporary credentials off 해줍니다.

4. C9 터미널에서 다음 명령을 실행하여 임시 자격 증명을 제거합니다.

moveho:~/environment $ rm -vf ${HOME}/.aws/credentials

5. GetCalleridentity 명령을 실행하여 Cloud9 IDE C9 인스턴스에 대한 IAM 역할로 설정한 WorkstationRole 사용하고 있는지 확인합니다.

moveho:~/environment $ aws sts get-caller-identity --query Arn | grep Workstation
"arn:aws:sts::594682333406:assumed-role/ecs-demogo-WorkstationRole-M****B9/i-029fa13dfe7de3290"

6. CLI 도구를 업데이트 하고 설치합니다.

moveho:~/environment $ sudo yum install -y jq
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

 

7. 아래의 명령을 실행하여 현재 지역을 기본값으로 자동 구성합니다.

echo "export AWS_DEFAULT_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region)" >> ~/.bashrc
echo "export AWS_REGION=\$AWS_DEFAULT_REGION" >> ~/.bashrc
echo "export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)" >> ~/.bashrc
source ~/.bashrc

 

8. 기본 리전이 예상한 리전인지 확인합니다. (ap-northeast-2)

moveho:~/environment $ test -n "$AWS_REGION" && echo AWS_REGION is "$AWS_REGION" || echo AWS_REGION is not set
AWS_REGION is ap-northeast-2
echo "export AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID}" | tee -a ~/.bash_profile
echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile
aws configure set default.region ${AWS_REGION}
aws configure get default.region

6.AWS ECR 생성

섹션에서는 3개의 ECR repository (web, cats, dogs) 생성합니다. repository 각각 하나의 docker image 가질 있습니다.

좌측 배너의 Repository 클릭합니다.

1. repository 생성을 클릭하고 이름을 cats라고 입력하고 나머지 설정은 기본값으로 생성합니다.

2.web, dogs 저장소 이름으로도 repo 생성해줍니다.

3.repository 이름이 각각 web, cats, dogs 생성 되었는지 확인 합니다..

7.도커 이미지 Build

1. AWS C9 으로 이동 후 인스턴스 용 IDE를 클릭해서 열어줍니다.

2. 다음으로 web, cats, dogs 도커 이미지를 빌드하는 데 사용되는 dockerfile의 세부정보를 확인합니다. dockerfile의 정보는 다음과 같아야합니다.

moveho:~/environment $ cd ecsworkshop/cats/
moveho:~/environment/ecsworkshop/cats (main) $ cat Dockerfile 
FROM nginx
EXPOSE 80
RUN apt-get update -y && \
  apt-get upgrade -y && \
  apt-get install -y curl && \
  cd /tmp && \
  apt-get install awscli -y && \
  rm -rf /tmp/* && \
  rm -rf /var/lib/apt/lists/*
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./index.html /usr/share/nginx/html/index.html
CMD nginx -g "daemon off;

 

3. 다음 명령을 실행해서 cats docker images build 합니다.

moveho:~/environment/ecsworkshop/cats (main) $ docker build -t cats .

4. 디렉토리를 dogs 변경하고 dockerfile 검토 dogs docker images 생성해 줍니다.

moveho:~/environment/ecsworkshop/cats (main) $ cd ..
moveho:~/environment/ecsworkshop (main) $ cd dogs
moveho:~/environment/ecsworkshop/dogs (main) $ cat Dockerfile 
FROM nginx
EXPOSE 80
RUN apt-get update -y && \
  apt-get upgrade -y && \
  apt-get install -y curl && \
  cd /tmp && \
  apt-get install awscli -y && \
  rm -rf /tmp/* && \
  rm -rf /var/lib/apt/lists/*
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./index.html /usr/share/nginx/html/index.html
CMD nginx -g "daemon off;"

5. dogs 이미지를 build 해줍니다.

moveho:~/environment/ecsworkshop/dogs (main) $ docker build -t dogs .

6. 디렉토리를 web으로 변경하고 dockerfile 검토 web 이지미를 build 해줍니다.

moveho:~/environment/ecsworkshop/dogs (main) $ cd ..
moveho:~/environment/ecsworkshop (main) $ cd web/
moveho:~/environment/ecsworkshop/web (main) $ cat Dockerfile 
FROM nginx
EXPOSE 80
RUN apt-get update -y && \
  apt-get upgrade -y && \
  apt-get install -y curl && \
  cd /tmp && \
  apt-get install awscli -y && \
  rm -rf /tmp/* && \
  rm -rf /var/lib/apt/lists/*
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./index.html /usr/share/nginx/html/index.html
CMD nginx -g "daemon off;"
moveho:~/environment/ecsworkshop/web (main) $ docker build -t web .

모두 정상적으로 build docker iamges 명령어로 이미지를 확인합니다.

 

8.AWS ECR Image tag & push

1. AWS ECR 이동합니다. 각각의 repo에서 push 명령확인을 클릭합니다.

 

다음 Push명령을 순서대로 진행해서 이미지를 ECR PUSH 합니다.

moveho:~/environment/ecsworkshop/web (main) $ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com
moveho:~/environment/ecsworkshop/web (main) $ docker tag cats:latest 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/cats:latest
moveho:~/environment/ecsworkshop/web (main) $ docker push 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/cats:latest

 

2. 동일한 방식으로 dogs, web 대해서도 tag 지정과 push 진행해줍니다.

[dogs tag & push]

moveho:~/environment/ecsworkshop/web (main) $ docker tag dogs:latest 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/dogs:latest
moveho:~/environment/ecsworkshop/web (main) $ docker push 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/dogs:latest

[web tag & push]

moveho:~/environment/ecsworkshop/web (main) $ docker tag web:latest 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/web:latest
moveho:~/environment/ecsworkshop/web (main) $ docker push 594682333406.dkr.ecr.ap-northeast-2.amazonaws.com/web:latest

3. ECR 접속해 다음의 cats,dogs,web 이미지가 정상적으로 push 되었는지 확인합니다.

9.AWS ECS

섹션에서는 고가용성을 위해 여러 AZ 영역에 DEMOGO-ECS 클러스터를 배포합니다. 모니터링 섹션에 사용할 추가 IAM 정책을 첨부합니다.

[클러스터 생성]

 

1.ECS 콘솔로 이동 왼쪽 탐색 배너에서 클러스터를 클릭 클러스터 생성을 클릭합니다.

2.클러스터 이름을 DEMOGO-ECS 지정 네트워킹은 다음과 같이 설정합니다.

다음을 참조해서 설정해줍니다. DEMOGO VPC 선택하고, 서브넷은 Private subnet1,2 선택합니다.

 

3. 인프라는 Amazon EC2 인스턴스를 선택합니다. 인스턴스 유형은 m5.large 선택합니다. AutoScaling 그룹도 구성을 합니다. ( asg 생성) 원하는 욜량은 최소:2 최대:2 선택합니다.

 

4. 마지막으로 모니터링을 dropdown 하여 Container Insights 활성화 합니다.

5. 클러스터를 생성합니다. 클러스터 생성을 확인합니다.

 

[클러스터 보안그룹 변경]

1.EC2 이동 왼쪽 탐색 모음에서 Auto Scaling Groups 클릭합니다.

2. DEMOGO-ECS AutoScaling 그룹에 대한 시작  ECSLaunchTemplate_XXXXX 템플릿을 클릭 합니다.

3. 작업 드롭다운을 클릭 템플릿 수정을 선택합니다.

다음 템플릿 수정을 클릭합니다.

4. 네트워크 설정에서  ecs-demogo-ECSInstanceSG-XXXXX 보안 그룹을 선택합니다. 템플릿 버전 생성을 클릭합니다.

5. autoscaling 그룹 메뉴로 돌아가서  Infra-ECS-Cluster-DEMOGO-ECS-XXXX 를 선택 하고 편집을 클릭합니다.

6. 시작템플릿 섹션에서 버전 2를 선택합니다. 아래로 스크롤 하고 업데이트를 클릭합니다.

7. ECS 클러스터의 Auto Scaling 그룹과 연결된 보안 그룹을 성공적으로 업데이트했지만 이미 시작된 인스턴스에서는 업데이트 되지 않았습니다.

 

8. 인스턴스 새로고침 탭으로 이동하여 인스턴스 새로고침 시작 버튼을 클릭합니다.

9. EC2로 이동해서 대시보드에서 인스턴스들이 순차적으로 변경되는 것을 확인할 수 있습니다.

10. 변경된 인스턴스에 보안그룹이 잘 적용되었는지 확인합니다.

10.AWS ECS TASK 정의

이 섹션에서는 web, cats dogs 서비스에 대한 작업정의를 구성합니다.

[web 작업정의 만들기]

1.ECS 콘솔로 이동하여 왼쪽 탐색 메뉴에서 테스크 정의를 클릭한 다음 태스크 정의 생성을 클릭.

2, TASK 정의 패밀리 이름을 webdef로 설정합니다.

3. web 컨테이너를 구성합니다. 컨테이너 이름은 web으로 설정합니다. 이미지 URIECR에서 복사.

4. 포트 매핑 섹션에서 컨테이너 포트를 80, 프로토콜을 TCP로 설정합니다.

5. Amazon EC2 인스턴스를 선택 하고 앱 환경에 대한 AWS Fargate를 제거합니다.

6. 운영체제를 Linux/X86_64, CPU0.5 Vcpu, 메모리를 1 GB로 설정합니다.

7. 태스크 실행 역할을 새 역할 생성으로 변경하고 나머지는 그대로 둡니다.

8. 모니터링 및 로깅 섹션을 열고 로그 수집 사용을 선택합니다. Cloud Watch를 선택합니다.

나머지 값들은 기본값으로 둡니다.

9. 구성을 검토하고 생성을 클릭합니다.

[cats 작업정의 만들기]

1.ECS 콘솔로 이동 후 새 작업 정의 생성을 클릭합니다.

2. 작업 정의 패밀리 이름을 catsdef로 설정합니다.

3. cats 컨테이너를 구성합니다. ECRcats 이미지의 URI 값을 복사합니다.

4. 포트 매핑 섹션에서 컨테이너 포트를 80, 프로토콜을 TCP로 설정하고 포트 이름을 삭제하고 앱 프로토콜을 None으로 설정합니다.

5. 다른 섹션 구성을 건너뛰고 다음을 클릭합니다.

6. EC2 인스턴스를 선택하고 Fargate를 제거합니다. 운영체제를 Linux/X86_64, CPU0.5 Vcpu 메모리는 1GB로 설정합니다.

7. Task rolenone으로 설정하고 태스크 실행 역할은 ecsTaskExecutionRole, Network Modebridge

7. 모니터링 및 로깅 섹션을 열고 로그 수집을 사용을 선택합니다. aws cloudwatch를 선택합니다.

8. 구성을 검토하고 하단에서 만들기를 클릭합니다.

 

 

[dogs 작업정의 만들기]

dogs 작업정의는 json 파일로 생성해보겠습니다. json을 사용하여 새 태스크 정의 생성을 클릭합니다.

{
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "family": "dogsdef",
    "containerDefinitions": [
        {
            "name": "dogs",
            "image": "<YOUR DOGS ECR IMAGE URI>",
            "portMappings": [
                {
                    "name": "dogs-80-tcp",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "/ecs/dogsdef",
                    "awslogs-region": "<YOUR REGION>",
                    "awslogs-stream-prefix": "ecs"
                }
            }
        }
    ],
    "volumes": [],
    "networkMode": "awsvpc",
    "memory": "1024",
    "cpu": "512",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "executionRoleArn": "arn:aws:iam::<YOUR ACCOUNT ID>:role/ecsTaskExecutionRole"
}

11.AWS ECS IAM Role 수정

1. IAM 콘솔로 이동 왼쪽의 역할 메뉴로 이동합니다. ECS검색 후 ecsTaskExecutionRole 역할을 선택.

2. 권한 탭 오른쪽에 권한 추가를 선택한 다음에 정책 연결을 클릭합니다.

3. 검색창에 cloudwatchfull을 입력후 CloudWatchFullAccess 정책을 선택 합니다. 권한 추가를 클릭.

4. 정책이 성공적으로 추가되었는지 확인합니다.

12.AWS ECS Service

이전 섹션에서 정의한 TASK 를 기반으로 세가지 서비스를 생성합니다. 또한 ALB를 구성합니다.

  • web target group - path pattern /
  • cats target group - path pattern /cats
  • dogs target group - path pattern /dogs

 

[ALB 생성] - DEMOGO-ALB 만들기

1.EC2 로드밸런서로 이동합니다.

2.로드밸런서 생성을 클릭하고 Application Load Balancer를 선택합니다.

 

3. 다음 설정으로 로드 밸런서를 구성합니다.

4. 네트워크 mappingVPC 설정을 DEMOGO로 합니다. 또한 Subnet 설정은 publicsubnet 1,2로 합니다

5. 보안그룹 설정은 ALBSG 로 설정해 줍니다.

6. 리스너 및 라우팅

인스턴스를 클릭합니다.

타겟그룹 이름을 web으로 설정해줍니다. 다음을 누르고 대상 등록을 건너 뜁니다.

 

7. 리스너 및 라우팅 로드밸런서 브라우저 탭으로 돌아가서 웹을 http:80 리스너로 선택합니다.

 

8. 구성을 검토하고 로드밸런서를 생성합니다.

[Service 만들기] - web-service만들기

1.ECS로 이동후 DEMOGO-ECS 클러스터를 선택합니다. 서비스 탭으로 이동하여 생성을 클릭합니다.

 

2. 서비스 환경 구성

3. 로드밸런싱 구성

5. 작업 배치 구성

작업 배치는 AZ 균형 분산으로 설정해줍니다. 그 후 생성을 클릭합니다.

7. 웹 서비스 및 TASK를 확인 합니다.

생성을 확인합니다.

 

[Service 만들기] - cats-service만들기

1.다시 DEMOGO-ECS Service 탭에서 Create를 클릭합니다.

2. 서비스 환경구성

3. 서비스 배포 구성

다음과 같이 설정 후 배포 실패 감지 회로 차단기 체크를 해제해 줍니다.

 

 

4. 로드밸런싱 구성

 

다음과 같이 설정합니다. 경로 패턴에 유의합니다. 생성을 클릭해 cats 서비스를 생성합니다.

[Service 만들기] - dogs-service만들기

1.다시 DEMOGO-ECS Services 탭에서 create를 클릭합니다.

2. 서비스 배포구성

4. 서비스 네트워킹 구성

5. 로드 밸런싱 구성

다른 옵션은 변경하지 않고 그대로 두고 생성하기를 클릭합니다.

[Service 체크]

[TASK 체크]

[Web 체크]

1.AWS 로드 밸런서로 이동합니다. ALBDNS 이름을 복사하여 웹 브라우져로 접속합니다.

CATS 그리고 DOGS를 클릭해 봅니다. 정상적으로 CATSDOGS 둘 다 정상 작동하는 모습을 확인.

다음글에 이어서 autoscaling 구성부터 cicd 구성까지 완료하는 내용에 대해 다뤄보겠습니다.

댓글