DevOps34일차 - 서버 배포 파이프라인

문한성·2023년 4월 24일
0

부트캠프

목록 보기
65/123
post-thumbnail

  • AWS 개발자 도구 서비스를 이용해서 배포 자동화 파이프라인을 구축해야 합니다.
    • CodePipeline을 이용해서 각 단계를 연결하는 파이프라인을 구축합니다.
    • Source 단계에서 소스 코드가 저장된 GitHub 리포지토리를 연결합니다.
    • Deploy 단계에서 CodeDeploy 서비스를 이용하여 EC2 인스턴스에 변경 사항을 실시간으로 반영합니다.
  • 나중에 변경 사항을 GitHub 리포지토리에 반영했을 경우, 배포 과정이 자동으로 진행되어야 합니다.
  • 배포 과정에서 오류가 생길 경우, log 파일을 참조하여 문제점을 확인할 수 있어야 합니다.

대시보드로 이동 후, 인스턴스로 이동

EC2 대시보드로 이동 후, 인스턴스로 이동합니다.

인스턴스 선택 후 [작업] - [인스턴스] - [태그관리] 클릭

태그를 추가하기 위해, 인스턴스를 선택한 후 [ 작업 ] → [ 인스턴스 설정 ] → [ 태그 관리 ] 순서로 클릭해 이동합니다.

태그를 추가하는 이유는 후에 있을 파이프라인 구축 단계에서 인스턴스를 잘 식별하기 위함입니다.

태그추가

[ 태그 추가 ] 버튼을 클릭합니다.
태그 이름은 자유롭게 지어도 좋습니다. 저장 버튼을 누르면 태그 생성이 완료됩니다.


인스턴스 선택후 [작업] - [보안] - [IAM 역할 수정] 클릭

다음으로 IAM 서비스를 이용해서 EC2 인스턴스에 역할을 부여합니다.

인스턴스를 선택 후, [ 작업 ] → [ 보안 ] → [ IAM 역할 수정 ] 순서대로 클릭해 이동합니다.

역할(Role)은 AWS의 개체(서비스, 사용자 등)가 다른 서비스에 접근하게 할 수 있도록 해주는 방법입니다.

EC2 인스턴스에 역할을 부여함으로써 다른 AWS 서비스를 호출할 수 있는 권한을 가집니다.

새 IAM 역할 생성 클릭

우리는 현재 IAM 역할을 생성해둔 것이 없으므로 새로 만들어야 합니다.

[ 새 IAM 역할 생성 ] 을 클릭해 AWS IAM 서비스로 이동합니다.

[역할 만들기] 클릭

AWS 서비스, EC2 선택 후 [다음:권한] 클릭

권한 정책 선택하기

  • 검색창에 s3를 입력하여 AmazonS3FullAccess를 선택합니다.
  • 검색창에 SSM을 입력하여 AmazonSSMFullAccess를 선택합니다.
  • 검색창에 CodeDeploy를 입력하여 AWSCodeDeployRole을 선택합니다.
  • [ 다음: 태그 ] 버튼을 클릭합니다.

  • 해당 화면에서는 아무런 작업 없이 바로 [ 다음: 검토 ] 버튼을 클릭합니다.

역할 이름 입력후, [역할 만들기] 클릭

역할에 임의의 이름을 입력한 후, [ 역할 만들기 ] 버튼을 클릭합니다.


여기까지 진행하면 역할이 생성되지만, 설정할 것이 하나 더 있습니다.

생성한 EC2Role 클릭

메인 화면으로 돌아온 후, 방금 전 생성한 EC2Role을 클릭합니다.

신뢰 관계 탭으로 이동 후, [신뢰 관계 편집] 클릭

신뢰 관계를 편집해 줍니다. 신뢰 관계란, 해당 역할을 취할 수 있는 서비스나 사용자를 명시하는 부분입니다.

앞서 access 정책 부여를 통해 역할을 생성해 주었지만, access 할 수 있는 서비스를 신뢰 관계에서 명시함으로써 역할이 확실히 완성됩니다.

신뢰 정책 업데이트

처음 편집 화면으로 들어가면 "Service"의 값으로 "ec2.amazonaws.com"만 할당되어 있습니다.

이를 화면과 같이 배열로 바꾼 후, "codedeploy.ap-northeast-2.amazonaws.com" 값을 추가합니다. 역할 설정이 끝났습니다.

EC2 수정 페이지로 돌아와서, 생성한 IAM 역할을 선택

EC2 인스턴스에 생성한 역할을 적용해 줍니다.

이제 EC2는 S3, CodeDeploy, SSM 서비스에 접근할 수 있습니다.

보안 그룹으로 이동

다음은 EC2 인스턴스가 적절한 보안 그룹을 갖고 있는지 확인합니다.

EC2 대시 보드에서 보안 그룹으로 이동합니다.

보안 탭을 클릭합니다.

보안 그룹을 클릭해 이동합니다.

인바운드 규칙에 80과 443포트 포함

보안 그룹의 인바운드 규칙에 80과 443 포트가 포함되어 있는지 확인합니다.

만약 하나라도 포함되어 있지 않다면, [ 인바운드 규칙 편집 ] 버튼을 클릭해 수정 화면으로 이동합니다.

80번 포트는 서버 배포를 위해 필요하고, 443 포트는 후에 나올 CodeDeploy-Agent의 정상적인 작동을 위해 필요합니다.

HTTP와 HTTPS 유형을 위치 무관으로 추가한 뒤 [ 규칙 저장 ] 버튼을 클릭합니다.

저장해서 나온 화면에서 22, 80, 443 포트가 포함되어 있는지 확인합니다.

EC2를 활용한 파이프라인 구축

프로젝트 레포 최상위에 appspec.yml 생성

리포지토리 최상위에 appspec.yml 파일을 추가합니다.

appspec.yml은 배포 자동화를 도와주는 CodeDeploy-Agent가 인식하는 파일입니다.

하단의 appspec.yml 코드 스닙펫을 이용해 내용을 채웁니다.

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/sprint-practice-deploy-for04

hooks:
  ApplicationStop:
    - location: scripts/stop.sh
      runas: root
  AfterInstall:
    - location: scripts/initialize.sh
      runas: root
  ApplicationStart:
    - location: scripts/start.sh
      runas: root

scripts 디렉토리를 생성 후, 그안에 3개의 shell script 파일 생성

다음으로 최상위에 scripts 디렉토리를 생성한 후 그 안에 initialize.sh, start.sh, stop.sh 파일 3개를 생성합니다.

각 파일은 appspec.yml 파일이 구성하고 있는 배포 수명 주기에 따라서 실행될 예정입니다.

먼저 scripts 디렉토리를 생성 후 initialize.sh 파일을 만들어 내용을 채웁니다.

하단의 코드 스닙펫을 활용하세요.

scripts/initialize.sh

#!/bin/bash
cd /home/ubuntu/sprint-practice-deploy-for04/server
npm install
npm install pm2@latest -g
sudo apt-get update
sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown ubuntu /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80

scripts/start.sh

#!/bin/bash
cd /home/ubuntu/sprint-practice-deploy-for04/server
authbind --deep pm2 start app.js

scripts/stop.sh

#!/bin/bash
cd /home/ubuntu/sprint-practice-deploy-for04/server
pm2 stop app.js 2> /dev/null || true
pm2 delete app.js 2> /dev/null || true

애플리케이션 생성으로 이동

  • AWS CodeDeploy 대시보드로 이동해 애플리케이션으로 이동합니다.

  • [ 애플리케이션 생성 ] 버튼을 클릭합니다.

애플리케이션 생성

애플리케이션의 이름을 임의로 입력하고, 컴퓨팅 플랫폼을 'EC2/온프레미스'로 선택한 뒤, [ 애플리케이션 생성 ] 버튼을 클릭합니다.

생성한 애플리케이션 배포 그룹에서 [배포그룹 생성] 클릭

애플리케이션이 생성되면, 생성한 애플리케이션의 배포 그룹 탭을 클릭하여 [ 배포 그룹 생성 ] 버튼을 클릭합니다.

배포 그룹 이름 입력, IAM role 선택

배포 그룹의 이름을 임의로 입력하고, 서비스 역할 영역을 클릭한 후 전에 생성했던 'EC2Role'을 선택합니다.

환경구성

환경 구성 중 'Amazon EC2 인스턴스'를 선택하고, 태그 그룹에 EC2 인스턴스에 설정해놓았던 태그 키와 값을 선택합니다.

배포 그룹 생성

로드 밸런싱 활성화 체크 해제 후, [ 배포 그룹 생성 ] 버튼을 클릭합니다.

파이프 라인 생성 클릭

이제 AWS CodePipeline 을 이용해 서버 배포 자동화 파이프라인을 구축하겠습니다.

CodePipeline 대시보드로 이동 후, [ 파이프라인 생성 ] 버튼을 클릭합니다.

파이프라인 이름 입력

파이프라인 이름을 임의로 입력 후, [ 다음 ] 버튼을 클릭합니다.

소스 스테이지 추가

소스 코드로 사용할 리포지토리가 GitHub에 저장되어 있고 소스 스테이지에서 GitHub를 사용할 수 있으므로, GitHub(버전 2)를 소스 공급자로 선택한 후 [ 다음 ] 버튼을 클릭합니다.

[ GitHub에 연결 ] 버튼을 클릭합니다.

연결 이름을 임의로 입력 후, [ GitHub에 연결 ] 버튼을 클릭합니다.

[ 새 앱 설치 ] 버튼을 클릭합니다.

자신의 GitHub 계정을 클릭합니다.

로그인 된 후 나타나는 GitHub 화면에서 'Only select repositories'를 선택한 후, 소스 코드로 이용할 리포지토리를 선택하고 [ Save ] 버튼을 클릭합니다.

[ 연결 ] 버튼을 클릭합니다.

리포지토리 이름을 조금 전 연결한 리포지토리 명과 같이 지정합니다.

브랜치 이름은 master로 지정합니다.

출력 아티팩트 형식은 'CodePipeline 기본값'으로 지정한 후, [ 다음 ] 버튼을 클릭합니다.

빌드 스테이지

우리가 이용하는 서버 코드(애플리케이션)는 코드의 컴파일과 빌드 과정이 필요 없고 테스트 코드도 없으므로, [ 빌드 스테이지 건너뛰기 ] 버튼을 눌러 빌드 단계를 생략합니다.

배포 스테이지

배포 스테이지 입니다.

배포 공급자는 'AWS CodeDeploy'를 선택합니다.

리전은 '아시아 태평양(서울)'을 선택합니다.

애플리케이션 이름은 생성해 둔 애플리케이션의 이름을 선택합니다.

배포 그룹은 생성해 둔 배포 그룹으로 선택합니다.

[ 파이프라인 생성 ] 클릭

모든 단계의 설정을 잘 확인한 뒤, 오른쪽 하단의 [ 파이프라인 생성 ] 버튼을 클릭합니다.

이로써 파이프라인이 생성되었습니다.

결과 학인

파이프라인 생성과 동시에 소스 코드의 배포가 자동으로 실행됩니다.
ec2에 서버가 실행중이여야한다.

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글