본문 바로가기
AWS

AWS CodeDeploy를 이용한 현위치 배포

by 장중앙 2021. 8. 19.

AWS CodeDeploy는 Amazon EC2, AWS Fargate, AWS Lambda 및 온프레미스 서버와 같은 다양한 컴퓨팅 서비스에 대한 소프트웨어 배포를 자동화하는 완전관리형 배포 서비스

 

현위치 배포=롤링배포

  • 애플리케이션의 이전 버전(파란색)을 점차적으로 새 버전(초록색)으로 교체

기본  VPC 생성

EC2 인스턴스 생성

기본 VPC로 설정

보안 그룹 SSH, HTTP 접속이 가능하도록 설치

웹 서비스에 필요한 프로그램 설치 및 환경 설정을 위해 인스턴스로 연결

sudo yum install -y httpd php mysql php-mysql #웹서버 php, mysql, php-mysql 연동 모듈 설치
sudo chkconfig httpd on # 웹 서버 데몬을 서비스로 등록
sudo systemctl start httpd # 웹 서버 시작

# 웹 루트 디렉토리에서 index.html파일 생성
cd /car/www/html 
echo 'Hello EC2 !!!' | sudo tee -a index.html 
yum -y update # 패키지를 최신 상태로 업데이트

웹서비스 정상 동작 확인

 

CodeDeploy를 이용하여 소스코드를 자동 배포할 수 있도록 해당 인스턴스에 CodeDeploy Agent를 설치

sudo yum install -y ruby #루비 설치 CodeDeploy Agent 설치 파일 실행에 사용
# 설치 파일 다운로드
#(https://docs.aws.amazon.com/codedeploy/latest/userguide/resource-kit.html#resource-kit-bucket-names)참고
wget https://"bucket-name".s3."region-identifier".amazonaws.com/latest/install
chmod +x ./install # 실행 권한 부여
sudo ./install auto # CodeDeploy Agent 설치
sudo service codedeploy-agent status #실행 상태 확인

CodeDeploy Agent 정상 실행 확인

 

AMI 생성

인스턴스 중지 후 이미지 생성

 

CodeDeploy 서비스에 적용할 역할 생성

역할 생성 확인

 

EC2 정책 생성

CodeDeploy Agent가 S3에서 업로드 된 파일을 가져올 경우 S3읽기 권한이 필요

생성한 정책 확인

정책을 적용할 역할 생성

생성한 역할 확인

 

대상 그룹 생성

로드 밸런싱 대상 그룹을 생성

이전에 생성한 기본 VPC를 선택, 나머지는 기본 설정

 

시작 템플릿 생성

앞에서 생성한 AMI, EC2의 키페어, 기본 VPC, 보안 그룹을 선택 

고급 세부 정보에서 S3읽기 권한을 부여한 인스턴스 정책(skuser68-codedeploy-ec2-role)를 선택

시작 템플릿 생성 확인

 

Auto Scaling 그룹 생성

생성한 시작 템플릿을 선택

기본 VPC와 가용가능한 모든 서브넷 선택

만들어둔 로드벨런서가 없기 때문에 새 로드 밸런서에 연결을 선택

외부에서 로드밸런서로 요청을 전달할 수 있어야하므로 Internet-facing을 선택

라우팅 대상으로 앞에서 생성한 대상 그룹을 선택

실습에서는 대상 그룹을 2개로 설정

생성된 Auto Scaling과 그룹에서 생성한 인스턴스를 확인
로드밸런싱 접근 확인

 

CodeDeploy 애플리케이션 생성

배포 그룹 생성

AWS CodeDeploy Role 정책을 반영한 skuser68-codedeploy-role선택

배포할 환경으로 Amazon EC2 Auto Scaling 그룹을 선택 앞서 생성한 그룹을 선택

배포 구성으로 한번에 하나씩 배포를 진행하는 CodeDeployDefault.OneAtATime을 선택 로드밸런싱 활성화

앞서 생성한 대상그룹을 선택

배포 생성

github 레포지토리에 개정할 index.html 개정절차를 기술한 appspec.yml파일, 웹 루트 디렉토리에서 이전의 index.html을 삭제하는 쉘 스크립트 파일을 추가

<!--index.html-->
<html>
<head>
<title>Title of the document</title>
<script>
var text = "I told you so!";
</script>
</head>

<body>

<math xmlns="http://www.w3.org/1998/Math/MathML">
      <mrow>
        <msup><mi>a</mi><mn>2</mn></msup>
        <mo>+</mo>
        <msup><mi>b</mi><mn>2</mn></msup>
        <mo>=</mo>
        <msup><mi>c</mi><mn>2</mn></msup>
      </mrow>
</math>

<!-- embed svg elements directly in HTML5 -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190">
  <polygon points="100,10 40,180 190,60 10,60 160,180"
  style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;">
</svg>

<script>
document.write("<p>"+text+"</p>");
document.write("<p>"+text+"</p>");
document.write("<p>"+text+"</p>");
</script>
</body>

</html>
#appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html
hooks:
  BeforeInstall:
    - location: ./scripts/before-install.sh
      timeout: 60
      runas: root
# /scripts/before-install.sh

#!/bin/bash
cd /var/www/html
rm index.html

커밋 ID : 배포할 서비스의 commit을 담고 있는 커밋아이디로 진행

배포 실행

CodeDeployDefault.OneAtATime로 배포 구성했기 때문에 한번에 하나의 인스턴스만 배포가 진행됨

 

배포가 진행되는 동안 개별인스턴스에 직접 접속하면 이전 버전의 서비스가 실행됨

로드벨런스로 접속시 새버전의 서비스만 출력됨(배포가 진행되는 동안에 로드밸런서는 배포가 완료되어 서비스중인 인스턴스만 라운팅하는 것을 확인 가능)

배포가 완료된 인스턴스의 동작 확인
성공적으로 배포가 완료됨

댓글