ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CodePipeline 을 이용한 Nodejs 서버 앱 배포
    AWS 2020. 5. 26. 16:47

     

     

    현재 auto scaling group + application load balancer 를 통해 서버를 운영하고 있습니다.

    하지만 CI/CD에 대한 기술 부채로 인해 매번 배포할때마다 auto scaling group를 편집해야하는 말도안되는(?) 일을 해야했고 이제서야 해결하기로 마음을 먹었습니다.
    CodeDeploy를 통해 auto scaling group을 통해 다수의 인스턴스들을 일괄적으로 업데이트할수 있다는것을 발견하고 CodePipeline을 도입하게 되었습니다.

     

    전반적인 과정

    이번 게시글에서는 아래와 같은 AWS 기술 스택을 사용합니다.

    IAM + CodePipeline + EC2 + S3 + Application Load Balancer +  Auto Scaling Group + AMI 

     

    소스는 제 깃허브 https://github.com/dontbesatisfied/CodePipelineInNodejs에 있습니다.

     

    - 사전조건

    Github

    Node.js application

    AWS 계정

     

    - 스텝

    1. 나의 AMI 생성 (Nodejs, pm2, CodeDeploy Agent)

    2. policy(역할) 생성

    3. auto scaling group 생성

    4. CodePipeline 

    5. ALB 적용

     

     

     

     

    1. 나의 AMI 생성

     

    트래픽에따라 다이나믹하게 서버가 증설될때 기본환경이 제대로 구축이되지 않는다면 앱이 정상작동하지 않는것은 당연한 일입니다.

    때문에 붕어빵틀을 만들어 빠르게 서버를 찍어내기 위해 Amazon Machine Image (AMI)를 생성합니다.

     

    저는 Amazon Linux 2 AMI를 이용하여 Nodejs 12.16, CodeDeploy Agent, pm2를 구성하겠습니다.

    (나의 AMI 생성하는법은 간단하므로 생략하겠습니다.)

     

    * 설치 명령어 확인하기

    더보기
    1. Nodejs 12 설치
      sudo yum install -y gcc-c++ make curl -sL https://rpm.nodesourece.com/setup12.x | sudo -E bash -
      sudo yum install -y nodejs

      curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
      sudo yum install yarn

    2. pm2 설치
      yarn global add pm2

    3. CodeDeploy Agent 설치
      sudo yum -y update

      sudo yum install -y ruby

      cd /home/ec2-user

      curl -O https://s3-ap-northeast-2.amazonaws.com/aws-codedeploy-ap-northeast-2/latest/install
      sudo chmod +x ./install
      sudo ./install auto

     

    CodeDeploy Agent는 Auto Scaling에서 시작 구성의 User Data 부분에서 스크립트로 추가해주어도 됩니다.

    https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/tutorials-auto-scaling-group-create-auto-scaling-group.html 의 Amazon EC2 Auto Scaling 그룹을 만들어 구성하려면(콘솔) 참고

     

     

    2. policy(역할) 생성

     

    AWS에서 서비스 역할은 AWS 리소스에 액세스할 수 있는 권한을 AWS 서비스에 부여하는 데 사용됩니다.

     

    2-1. code deploy의 역할 생성

     

    code deploy에서 ec2, autoscaling, elb에 대해 접근 할수 있도록 하기 위해서입니다.

     

     

    IAM -> 역할 -> 역할만들기 -> 아래 그림과 같이 사용사례 선택 후 다음 -> AWSCodeDeployRole 정책이 연결되있는것을 확인 후 다음 -> 태그추가 (선택사항) 후 다음 -> 이름 및 설명 입력 후 역할 만들기

     

    * 스크린샷 확인하기

    더보기
    사용사례 선택 
    AWSCodeDeployRole 정책이 연결되있는것을 확인
    이름 및 설명 입력

     

     

    2-2. ec2의 역할 생성

     

    ec2에서 s3에 접근할수 있도록 하기 위해서입니다.

     

     IAM -> 역할 -> 역할만들기 -> 아래 그림과 같이 사용사례 선택 후 다음 -> AWSCodeDeployRoleAmazonEC2RoleforAWSCodeDeploy 정책 연결 후 다음 -> 태그추가 (선택사항) 후 다음 -> 이름 및 설명 입력 후 역할 만들기

     

     

    * 스크린샷 확인하기

    더보기
    사용사례 선택 
    AWSCodeDeployRole AmazonEC2RoleforAWSCodeDeploy 정책 연결
    이름 및 설명 입력

     

     

    3. auto scaling

     

    3-1. auto scaling 시작 구성

     

    ec2 -> AUTO SCALING 탭 시작구성 -> 시작 구성 생성 -> 내 AMI 에서 1번에서 만든 나의 AMI 선택 -> 인스턴스 유형 선택 -> 세부 정보 구성에서 이름과 2-2에서 설정한 IAM역할 ->  보안 그룹 구성 -> 검토 -> 생성

     

    * 스크린샷 확인하기

    더보기
    세부 정보 구성
    보안그룹 구성

     

    

     

    3-2. auto scaling group 생성

    1. Auto Scaling 그룹생성
      3-1에서 생성한 시작구성 연결해줍니다.
    2. 세부정보 구성
      다수의 인스턴스에 일괄적으로 CodePipeline에 의해 업데이트가 이뤄지는지 알아보기위해 2개의 인스턴스 실행합니다.

    3. 조정정책 구성
      1분간  cpu사용률이 평균 10%가 넘어가면 인스턴스를 증가 시키고 5%이하면 인스턴스를 감소시킵니다.

    4. 검토

    5. 생성

     

    * 스크린샷 확인하기

    더보기
    3-1 에서 생성한 시작구성 연결
    세부 정보 구성
    조정정책 구성

     

    4. Codepipeline 생성

     

    1. 파이프라인 생성

    2. 파이프라인 설정 선택

    3. 소스 스테이지 추가 (CodeCommit 단계) 설정 후 다음

    4. 빌드 스테이지 추가 (CodeBuild 단계) 프로젝트 생성 후 다음
      buildspec.yml이 중요합니다. 소스에 해당파일이 없거나 잘못되면 정상적으로 빌드가되지 않습니다.
      자세한 사항은 aws 설명서제 깃허브를 참고하세요.

    5. 배포 스테이지 추가 (CodeDeploy 단계) 설정 후 다음
      현재 페이지에서 바로 생성할수 없으므로 새로운 탭에서 CodeDeploy의 애플리케이션 과 배포그룹을 생성후 연결을 진행합니다.
      CodeDeploy가 동작할때 appspec.yml파일이 소스에 없거나 잘못되어있으면 정상적으로 배포가 진행되지않습니다.
      자세한 사항은 aws 설명서제 깃허브를 참고하세요.

    6. 파이프라인 생성

    7. 설정하신 저장소의 설정하신 브랜치에 push를 해보고 파이프라인이 정상적으로 동작하는지 확인합니다.
      파이프라인이 반응을 하는지 , 파이프라인이 정상적으로 마무리되는지, S3에 소스 및 빌드 결과물이 잘 생기는지, 인스턴스에 잘 반영이되는지 등을 확인하겠습니다.

     

    * 스크린샷 확인하기

    더보기
    파이프라인 설정
    CodeCommit

     

    CodeBuild 프로젝트 생성
    프로젝트 생성-1
    프로젝트 생성-2

     

    프로젝트 생성-3
    프로젝트 생성-4
    CodeDeploy 어플리케이션 생성
    CodeDeploy 배포 그룹 생성-1
    CodeDeploy 배포그룹 생성-2
    CodePipeline에 CodeBuild 연결
    코드 push 후 진행 확인
    코드 push 후 정상작동 확인
    코드 push 후 정상작동 확인-2
    코드 push 후 정상작동 확인-3

     

    5. ALB (Application Load Balancer) 적용

     

    현재 오토스케일리 그룹을 적용하고 최소 인스턴스를 2개로 잡아놓았기 때문에 2개의 서버가 떠있습니다.

    다수의 서버를 LB를 통해서 하나의 주소로 접근할수 있도록 묶어주며 부하를 분산하겠습니다.

     

    1. 로드밸런서 생성
      로드밸런서 유형선택에서 Application Load Balancer을 선택합니다.

    2. 로드밸런서 구성
      http의 접근만 허용해주겠습니다.

    3. 보안 설정 구성
      https를 적용하지 않았기때문에 설정사항이 없습니다.

    4. 보안 그룹 구성
      http 를 위한 80포트만 설정해주시면됩니다.

    5. 라우팅 구성
      제 앱은 3000번으로 리슨하기때문에 로드밸런서로 요청이 들어오면  http의 3000번으로 요청을 토스하도록 설정합니다.

    6. 대상 등록
      LB로 묶어줄 인스턴스를 선택합니다. auto scaling group으로 묶어준 2개의 인스턴스를 선택 후 추가해줍니다.

    7. 생성
      생성 후 상태가 active가 될때 까지 기다린 후 DNS로 접속해서 잘 작동하는지 확인해봅니다.

    8. LB 확인
      DNS로 여러번 요청을해보면 각기 다른 서버로 들어가는것을 확인해봅니다. 저는 서버의 pid를 응답에 남겨두어 확인했습니다.

    9. auto scaling 확인
      3-2에서 설정한 조정정책에 따라 제대로 인스턴스가 증감되는지 확인합니다. 저는 jmeter라는 툴을 이용하여 테스트를 하였습니다.
      해당 자료를 참고하였습니다

     

     

    * 스크린샷 확인하기

     

    더보기
    로드밸런서 구성
    라우팅 구성
    대상등록
    LB 정상작동 확인
    cpu 사용률
    인스턴스 증가 확인
    인스턴스 감소 확인

     

     

    위 과정을 문제없이 따라오셨다면 
    CodePipelin을 이용하여 프로젝트 배포의 번거로움과 사람의 실수를 예방할수 있으며
    많은 트래픽에도 대응할수 있는 유연한 앱를 만들수 있는 지식의 확장을 하셨습니다.

    이 글은 초보자가 쉽게 따라올수 있도록 프로세스에 대한 대략적 이해를 목적으로 작성하였습니다.

    auto scaling group의 조정정책, buildspec.yml, appspec.yml 등 디테일한 설정은 따로 시간을 내셔서 바꿔보면서 다양하게 테스트하는 시간을 가져보신다면 큰 도움이 될것입니다.

     

    수정 및 피드백은 언제나 환영입니다 :)

    'AWS' 카테고리의 다른 글

    VPC와 Public/Private subnet 간단 개념 정리  (0) 2021.07.03
    lambda + cloudwatch 를 이용한 EC2 스케줄링  (4) 2020.03.22
Designed by Tistory.