1. 파이프라인 구축(환경 설정)

  1) EC2 인스턴스에 태그 생성

  • EC2 대시보드로 이동한다
  • 인스턴스로 이동한다

 

  •  파이프라인 구축 단계에서 인스턴스를 잘 식별하기 위하여 태그를 추가한다
    - 인스턴스를 선택한다
    - 작업 → 인스턴스 설정 → 태그 관리 순서로 클릭해 이동한다

  • 새로운 태그 추가를 클릭한다
  • 태그의 키 와 값은 자유롭게 작성한다
  • 저장 버튼을 눌러 태그를 생성한다
    - 현재는 권한이 없어서 생성이 안되지만 나중에 개인 코드로 해 본다

 


 2)  IAM 서비스를 이용해서 EC2 인스턴스에 역할 부여

  • 역할(Role)은 AWS의 개체(서비스, 사용자 등)가 다른 서비스에 접근하게 할 수 있도록 해 준다
    - EC2 인스턴스에 역할을 부여하면 다른 AWS 서비스를 호출할 수 있는 권한을 가진다
  • 인스턴스를 선택한다
  • 작업 → 보안 → IAM 역할 수정 순서대로 클릭해 이동한다

  • IAM 역할을 생성해둔 것이 없으면 새로 생성한다
    - '새 IAM 역할 생성'을 클릭해 AWS IAM 서비스로 이동한다

  • AWS 서비스, EC2를 선택 후 '다음' 버튼을 클릭한다
  • '다음'을 클릭한다

  • 검색창에 권한을 검색 후  선택한다
    - S3를 입력하여 AmazonS3FullAccess를 선택한다
    - EC2Role을 입력하여 AmazonEC2RoleforAWSCodeDeploy를 선택한다
    - SSM을 입력하여 AmazonSSMFullAccess를 선택한다
  • '다음'을 클릭한다

  • 역할에 이름을 입력한다

  • 태그 추가를 클릭한다
  • 키에 "Name"을, 값(선택 사항)에 "EC2forCodeDeploy"를 입력한다
  • '다음: 검토'를 클릭한다

  • '역할 만들기'를 클릭한다
  • 역할이 생성된다

 

  • IAM 메인 화면으로 이동한다
  • 역활 -> EC2를 검색한다
  • EC2forCodeDeploy 자체를 선택한다

  • 신뢰 관계를 편집한다
    - 해당 역할을 취할 수 있는 서비스나 사용자를 명시한다
    - 역활에서 생성한 access 할 수 있는 서비스를 신뢰 관계에서 명시함으로써 역할이 명확하게 완성된는 것이다

  • 처음 편집 화면으로 들어가면 "Service"의 값으로 "ec2.amazonaws.com"만 할당되어 있다
    - 화면과 같이 대괄호를 작성하고 내부에 "codedeploy.ap-northeast-2.amazonaws.com" 값을 추가한다
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "ec2.amazonaws.com",
                    "codedeploy.ap-northeast-2.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  • EC2 인스턴스 화면으로 돌아와서 IAM에 생성한 역할을 저장한다
    - 이제 EC2는 S3, CodeDeploy에 접근할 수 있다

 


  • EC2 인스턴스가 적절한 보안 그룹을 갖고 있는지 확인한다
  • EC2 대시 보드에서 인스턴스로 이동한다
  • 보안 탭을 클릭한다
  • 보안 그룹을 클릭해 이동한다

 

  • 보안그룹의 인바운드 규칙에 8080과 443 포트가 포함되어 있는지 확인한다
    - 포함되어있지 않다면, [ 인바운드 규칙 편집 ] 버튼을 클릭해 수정 화면으로 이동하여 추가한다
    - 8080번 포트는 서버 배포를 위해 필요한다
    - 443 포트는 CodeDeploy-Agent의 정상적인 작동을 위해 필요하다

  • 사용자 지정 TCP에
    - 포트범위를 8080으로
    - 소스를 위치 무관으로 추가한다
  • HTTPS 유형에서
    - 소스를 위치 무관으로 추가한다
  • '규칙 저장' 을 클릭한다

  • 저장 후 22, 8080, 443 포트가 포함되어 있는지 확인한다
  • EC2 인스턴스의 세팅이 완료되었다

 

 


2. 부여받은 IAM User 권한과 리소스를 활용하여 파이프라인 구축

1) 배포 자동화를 위한 EC2 인스턴스의 역할(IAM Role) 확인

  • EC2 인스턴스에는 태그와 IAM Role이 설정되어 있다

  • 역할이 가지고 있는 권한은 아래와 같다
    - EC2 인스턴스의 Name은 해당 인스턴스에 Name을 키로 갖는 태그 값과 동일하다
    - 별도의 태그를 추가하지 않고, 이후에도 이 인스턴스의 Name 태그 값을 이용해 검색한다

  • EC2 인스턴스에 연결되어있는 IAM 역할은 아래 이미지와 같은 권한을 가지고 있다
    - 추가되어있는 권한과 신뢰관계가 'EC2 인스턴스에 태그와 역할 부여'에서 진행한 내용과 동일한지 확인한다

  • 발급받은 EC2 인스턴스를 통해 연결되어있는 보안 그룹을 클릭해 이동한다
  • 모든 인스턴스에 동일한 보안그룹이 적용되어 있다
    - 보안그룹 인바운드 규칙이 'EC2 인스턴스에 태그와 역할 부여'에서 진행한 내용과 동일한지 확인한다

 

 


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

 1) Local 환경 설정

  • 구축에 활용할 로컬 환경의 'be-sprint-deployment/DeployServer' 경로에 appspec.yml 파일을 추가한다
    - appspec.yml은 배포 자동화를 도와주는 CodeDeploy-Agent가 인식하는 파일이다
version: 0.0
os: linux

files:
  - source: /
    destination: /home/ubuntu/build

hooks:
  BeforeInstall:
    - location: server_clear.sh
      timeout: 3000
      runas: root
  AfterInstall:
    - location: initialize.sh
      timeout: 3000
      runas: root
  ApplicationStart:
    - location: server_start.sh
      timeout: 3000
      runas: root
  ApplicationStop:
    - location: server_stop.sh
      timeout: 3000
      runas: root

  • 로컬 환경의 'be-sprint-deployment/DeployServer' 경로에 buildspec.yml 파일을 추가한다
    - buildspec.yml은 배포 자동화에서 빌드를 담당하는 CodeBuild-Agent가 인식하는 파일이다
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  build:
    commands:
      - echo Build Starting on `date`
      - cd DeployServer
      - chmod +x ./gradlew
      - ./gradlew build
  post_build:
    commands:
      - echo $(basename ./DeployServer/build/libs/*.jar)
artifacts:
  files:
    - DeployServer/build/libs/*.jar
    - DeployServer/scripts/**
    - DeployServer/appspec.yml
  discard-paths: yes

 
  • be-sprint-deployment > DeployServer 아래에 scripts 디렉토리를 생성한다
    - 4개의 파일을 scripts 아래에 생성한다
     :  각 파일은 appspec.yml 파일이 구성하고 있는 배포 수명 주기에 따라서 실행될 예정이다

    - initialize.sh 파일을 생성한다
#!/usr/bin/env bash
chmod +x /home/ubuntu/build/**

 

       - server_clear.sh 파일을 생성한다

#!/usr/bin/env bash
rm -rf /home/ubuntu/build

 

      - server_start.sh 파일을 생성한다

#!/usr/bin/env bash
cd /home/ubuntu/build
sudo nohup java -jar DeployServer-0.0.1-SNAPSHOT.jar > /dev/null 2> /dev/null < /dev/null &

 

      - server_stop.sh 파일을 생성한다

#!/usr/bin/env bash
sudo pkill -f 'java -jar'

 


 2) AWS CodeDeploy 설정

  • AWS CodeDeploy 대시보드로 이동한다
    - 애플리케이션으로 이동한다 
  • 애플리케이션 생성 버튼을 클릭한다

 

  • 애플리케이션의 이름을 규칙에 맞게 입력한다
  • 컴퓨팅 플랫폼을 'EC2/온프레미스'로 선택한다
  • 애플리케이션 생성 버튼을 클릭한다

 

  • 애플리케이션이 생성된다
    - 애플리케이션은 배포그룹을 생성해야 한다
    - 애플리케이션의 배포 그룹 > 배포 그룹 생성 버튼을 클릭한다 

 

  • 배포 그룹의 이름을 규칙에 맞게 입력한다
  • 서비스 역할을 클릭하여 EC2 인스턴스에 연결되어있는 'BE_EC2RoleForSSM'을 선택한다 

 

  • 환경 구성은 'Amazon EC2 인스턴스'를 선택한다
  • 태그 그룹에는 EC2 인스턴스의 이름인 Name 태그 키와 값을 선택한다

 

  • 로드 밸런서에서 '로드 밸런싱 활성화' 체크를 해제한다
  • 배포 그룹 생성 버튼을 클릭한다
  • AWS CodeDeploy 세팅이 완료되었다

 


 3) AWS CodePipeline을 이용한 서버 배포 자동화 파이프라인 구축

  • CodePipeline 대시보드로 이동한다
  • 파이프라인 생성 버튼을 클릭한다
  • 파이프라인 이름을 규칙에 맞게 입력한다
  • 다음 버튼을 클릭한다
  • 소스 스테이지를 추가한다
    - 소스 코드로 사용할 'be-sprint-pratice-deploy' 레포지토리가 GitHub에 저장되어 있다
    - 소스 스테이지에서 GitHub를 사용할 수 있으므로, GitHub(버전 2)를 소스 공급자로 선택한다
  • 추가 옵션이 나온다
  • GitHub에 연결 버튼을 클릭한다
  • 별도의 팝업창이 나타난다
  • 연결 이름을 임의로 입력한다
  • GitHub에 연결 버튼을 클릭한다
  • 'Amazon Web Services 의 GitHub용 AWS 커넥터는 다음 권한을 요청합니다.'의 팝업창이 나타난다
    - 상황에 맞게 선택한다
  • 승인을 하면 GiHub 연결 창이 나타난다
  • 새 앱 설치 버튼을 클릭한다
  • 자신의 GitHub 계정을 클릭한다
  • 자신의 계정으로 로그인 된 GitHub 창이 나타난다
  • GitHub 화면에서 'Only select repositories(저장소만 선택)'를 선택한다
  • 소스 코드로 이용할 'be-sprint-deployment' 리포지토리를 선택하고 Save(설치) 버튼을 클릭합니다.
  • 자신 계정의 암호를 입력한다
  • 링크가 생성되었다
  • 연결 버튼을 클릭한다
 
  • 리포지토리 이름을 조금 전 연결한 'be-sprint-deployment'로 지정한다
  • 브랜치 이름은 main로 지정한다
  • 출력 아티팩트 형식은 'CodePipeline 기본값'으로 지정한다
  • 다음 버튼을 클릭한다
 
  • 빌드 스테이지 추가 창으로 이동된다
  • 빌드 공급자에서 AWS CodeBuild를 클릭한다
    - 추가 옵션이 아래에 나타난다
  • 프로젝트 생성 버튼을 클릭한다
 
 
 
  • 빌드 프로젝트 생성 창이 생긴다
  • 프로젝트 이름을 규칙에 맞게 입력한다
  • 운영체제는 Amazon Linux 2를 선택한다
  • 런타임은 Standart를 선택한다
  • 이미지는 aws/codebuild/amazonlinux2-x86_64-standart:3.0을 선택한다
 
  • Buildspec 이름에 "DeployServer/buildspec.yml"을 작성한다
  • CodePipeline으로 계속 버튼을 클릭한다
 
 
  • 'CodeBuild에서 be-pair-18을(를) 생성했습니다.'는 문구가 표시된다
  • 다음 버튼을 클릭한다
  • 배포 스테이지 화면으로 이동한다
  • 배포 공급자는 'AWS CodeDeploy'를 선택한다
  • 리전은 '아시아 태평양(서울)'을 선택한다
  • 애플리케이션 이름은 생성해 둔 애플리케이션의 이름을 선택한다
  • 배포 그룹은 생성해 둔 배포 그룹으로 선택한다
  • 모든 단계의 설정을 잘 확인한다
  • 오른쪽 하단의 파이프라인 생성 버튼을 클릭한다
 
  • 파이프라인이 생성되었다
  • 파이프라인 생성과 동시에 소스 코드의 배포가 자동으로 실행된다
 
 
 
  • 구축한 파이프라인 중 deploy 스테이지에서 실패가 발생하는 경우에는 관련 로그를 확인한다
  • CodeDeploy-Agent는 파이프라인 실행 때마다 로그를 해당 EC2 instance에 저장한다
  • 터미널에 'cd /opt/codedeploy-agent/deployment-root/deployment-logs' 명령어를 입력한다
    - 로그 파일이 저장된 경로로 이동한다
  • ls 명령어를 입력하여 어떤 파일이 존재하고 있는지 확인한다
  • codedeploy-agent-deployments.log 라는 파일이 존재하는 것을 확인할 수 있다
  • nano를 이용해 해당 파일을 열어본다
  • lifecycle을 돌면서 sh 파일을 실행시킨 로그를 확인할 수 있다
    - stderr는 standard error 이며
    - stdout은 standard output 이다
  • 프로세스가 실행중인지 확인하려면, sudo lsof -i :(실행한 포트번호) 명령어로 확인이 가능하다

 

※ 참조 링크


- linux의 standard stream : https://www.putorius.net/linux-io-file-descriptors-and-redirection.html 

 

Linux Fundamentals - I/O, Standard Streams, and Redirection.

An introduction to Linux IO, standard streams, file descriptors, and redirection. Learn the basic operators and how to control stdin, stdout, and stderr.

www.putorius.net

      - Bash의 표준 스트림 : https://www.delftstack.com/howto/linux/standard-streams-in-bash/  

 

Standard Streams in Bash

This tutorial explains the standard streams and redirecting output and input to and from a file, respectively.

www.delftstack.com

  • 프로세스가 실행중인지 확인하려면, sudo lsof -i :(실행한 포트번호) 명령어로 확인이 가능합니다.
 
 

 

'클라우드' 카테고리의 다른 글

Cloud - AWS(4) - RDS  (0) 2022.09.27
Cloud - AWS(2) - EC2 인스턴스 생성  (0) 2022.09.27
Cloud - AWS(1) - 계정 생성  (0) 2022.09.27
Cloud - 배포자동화(Automated Deployment)  (0) 2022.08.07
Cloud - 배포 컨테이너 - Docker Image  (0) 2022.08.07

+ Recent posts