배포 자동화
- 간단한 작업을 통해 전체 배포 과정을 진행할 수 있게 하는 것
- 매번 수동으로 하는 배포 과정을 자동화함으로써 시간 절약 가능
- Human Error 방지(수동 배포 중 특정 과정을 생략해서 오류가 발생하는 등의 문제)
배포 자동화 Pipeline
Stages: 파이프라인의 전체 과정을 여러 단계로 분리한 것
Actions: 파이프라인 안에서 순차적으로 실행되는 stage에서 수행하는 주어진 작업들
Pipeline을 여러 단계(stage)로 분리할 때 대표적으로 위의 그림과 같이 세 단계로 나눌 수 있다.
(꼭 세 단계로 나누어지는 것이 아닌, 상황과 필요에 따라 세분화되거나 간소화될 수 있음)
Source stage
원격 저장소에 관리되고 있는 소스코드에 변경사항이 일어날 경우, 이를 감지하고 다음 단계로 전달
Build stage
Source stage에서 전달받은 코드를 컴파일/빌드/테스트 등을 통해 가공, 가공된 결과물을 다음단계로 전달
Deploy stage
Build stage에서 전달받은 결과물을 실제 서비스에 반영
배포 자동화를 위한 AWS 개발자 도구
CodeCommit
- Source stage를 구성할 때 이용하는 서비스
- Github과 비슷한 서비스를 제공하지만, 보안 관련 기능에 대한 강점을 가진다.
CodeBuild
- Build stage를 구성할 때 이용하는 서비스
- Unit test/Compile/Build 같은 단계에서 필수적으로 실행되어야 할 작업들을 명령어로 실행 가능
Build: 코드 파일을 실행가능한 소프트웨어 산출물로 만드는 과정
Build Tool: 빌드과정을 도와주는 도구(gradle => ./gradlew build)
Codebuild Phase(buildspec.yml)
1. install : 런타임 설치
2. pre-build : 종속성 설치 및 테스트 진행
3. build : 실질적인 빌드 실행
4. post-build : 빌드 후 추가적인 작업이 필요한 경우 진행
모든 과정을 필수로 추가하는 것이 아닌, 필요에 따라 추가
CodeDeploy
- Deploy stage를 구성할 때 이용하는 서비스
- 실행 중인 서버 애플리케이션에 실시간으로 변경사항 전달 가능
- S3를 이용할 경우 S3 버킷을 통해 업로드 된 정적 웹사이트에 변경사항 전달/반영 가능
배포 과정
- 실행중인 서버가 있으면 서버 중단
- 새 버전의 서버 다운로드(빌드 결과물(.jar))
- 실행 관련 dependency 설치
- 새 버전 서버 실행
==> CodeDeploy로 자동화
CodePipeline
- 각 단계를 연결하는 파이프라인을 구축할 때 사용하는 서비스
- AWS 프리티어 계정은 두 개 이상의 파이프라인 생성 시 추가 요금 발생..!
실습 진행!
목표
- AWS 개발자 도구를 이용해 배포 자동화 파이프라인 구축
- CodePipeline으로 각 단계를 연결하는 파이프라인 구축
- Source stage에서 소스가 저장된 GitHub Repository 연결
- Build stage에서 CodeBuild 서비스를 이용하여 빌드된 파일 전달
- Deploy stage에서 EC2 인스턴스에다가 변경 사항 실시간 반영
- GitHub 코드가 갱신될 경우, 배포 자동으로 진행
- 배포 시 오류 발생할 경우 log 파일을 참조해서 문제점 파악 가능
- 배포한 프로젝트의 View가 없어도 Postman으로 확인가능 >> 서버만 배포 자동화 해도 됨
개발 환경 구축 - 튜토리얼
❗EC2 인스턴스에서 진행
AWS CLI 공식문서
최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface
이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이
docs.aws.amazon.com
CodeDeploy Agent 공식문서
Ubuntu Server용 CodeDeploy 에이전트 설치 - AWS CodeDeploy
출력을 임시 로그 파일에 쓰는 것은 Ubuntu 20.04에서 install 스크립트를 사용하여 알려진 버그를 해결하는 동안 사용해야 하는 해결 방법입니다.
docs.aws.amazon.com
Java 설치 & 확인
$ sudo apt update
$ sudo apt install openjdk-11-jre-headless
$ java -version
AWS CLI 설치 & 확인
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ sudo apt install unzip
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
# 이런식으로 뜨면 성공
# aws-cli/2.1.39 Python/3.8.8 Darwin/20.4.0 exe/x86_64 prompt/off
CodeDeploy Agent 설치 & 확인
$ sudo apt update
$ sudo apt install ruby-full # [Y / n] 선택시 Y 입력
$ sudo apt install wget
$ cd /home/ubuntu
$ sudo wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ sudo chmod +x ./install
$ sudo ./install auto > /tmp/logfile
$ sudo service codedeploy-agent status
#정상설치 됐으면 active(running) 문구 확인 가능
EC2 인스턴스 역할 부여 - 튜토리얼
- Amazon EC2 > 인스턴스 > 사용할 인스턴스 클릭
- '태그' 클릭
- 태그 설정(Key-Value 쌍의 값) - 파이프라인 구축에서 인스턴스를 잘 식별하기 위함
- '보안' 클릭 > 'IAM 역할' 링크 클릭
- 권한 > 권한 정책의 '권한 추가' 클릭 > '정책 연결' 클릭
- AmazonS3FullAccess, AmazonEC2RoleForAWSCodeDeploy, AWSCodeDeployRole, AmazonSSMFullAccess 추가(AmazonEC2RoleForSSM은 미리 추가되어있었음)
(수동 배포 때는 안해줘도 배포가 가능했었음) - 정책 연결이 됐다는 메시지 확인, 추가된 권한 정책 목록 확인
- AmazonS3FullAccess, AmazonEC2RoleForAWSCodeDeploy, AWSCodeDeployRole, AmazonSSMFullAccess 추가(AmazonEC2RoleForSSM은 미리 추가되어있었음)
- '신뢰 관계 편집' 클릭
- "Service"에 "codedeploy.ap-northeast-2.amazonaws.com" 추가
(ec2.amazonaws.com이랑 []로 묶어주기)
- "Service"에 "codedeploy.ap-northeast-2.amazonaws.com" 추가
- 권한 > 권한 정책의 '권한 추가' 클릭 > '정책 연결' 클릭
- '태그' 클릭
AWS IAM(Identity and Access Management)
- 사용자 입장에서 루트 사용자/일반 사용자로 구분 가능
IAM User = 사용자x 서비스 o
=> 일반 사용자는 결제 불가능, 루트 사용자는 결제 가능 & AWS 모든 서비스 사용 가능
=> 루트 사용자 쓰면 실습 시 만났던 region 문제, 이름 다르면 안되는 문제 등이 발생 안함
=> 루트 사용자가 IAM User에게 필요한 만큼의 권한(Policy)만 부여해서 사용하길 권장
Policy
- 권한 정의 객체(JSON 형태)
- policy를 IAM User에게 넣으면 딱 그만큼의 권한만 행사 가능
Role
- Policy의 조합
- 코드로 role을 생성할 때 policy가 적어도 하나는 있어야 함
- 여러 IAM User에게 할당 가능
+ 여러명의 IAM User는 IAM Group으로 관리 가능
+ 그룹에도 policy 적용 가능
EC2를 활용한 파이프라인 구축
❗예제를 위해 clone한 폴더에서 진행
- 최상위 폴더에 appspec.yml, buildspec.yml 생성
- 최상위 폴더에 scprits 폴더 만든 후 필요한 스크립트들 생성
=> 파이프라인에 올릴 소스 코드 - commit & push
- AWS CodeDeploy > 애플리케이션 > '애플리케이션 생성' 클릭
- '애플리케이션 구성' 설정
- 생성된 애플리케이션의 '배포 그룹' > '배포 그룹 생성' 클릭
- 필요에 맞게 설정
(배포 그룹 생성 후 뜨는 에러는, 사전에 CodeDeploy-Agent를 수동으로 생성해서 상관 x)
- 필요에 맞게 설정
- AWS CodePipeline > 파이프라인 > '파이프라인 생성' 클릭
- 설정 후 다음으로!
- 소스 공급자는, 소스 코드로 사용할 git repository는 github에 저장되어 있고, source stage에서 github을 사용하기에 github(버전 2) 선택
- github 연결 > 새 앱 설치 > 소스 코드로 사용할 repository 선택 > save > 연결 완료
- repo 이름, 브랜치 이름 지정 > 완료
- 빌드 공급자 - AWS CodeBuild
- 프로젝트 생성 > 정보 입력 > 운영체제: Amazon Linux2, 런타임: Standard,
이미지: aws/codebuild/amazonlinux2-x86_64-standard:3.0 - Buildspec 이름에 1에서 만든 buildspec.yml 적어주기
- 이것저것 설정 끝나면 '배포'로 넘어감
- 배포 공급자 'AWS CodeDeploy', 리전 '서울', 애플리케이션 이름, 배포그룹 적어주고 다음으로
- 파이프라인 생성
- 자동 배포되는지 확인하기
buildspec.yml => code build
appspec.yml => code deploy
서비스에서 제공하는 규칙에 맞게 작성 필요
서버에 환경 변수 설정하기
노출되지 않아야 하는 값들을 보호하기 위해 환경변수를 설정한다.
1. AWS Parameter Store > '파라미터 생성' 클릭
2. 이름에 환경 변수 명을 적어주고, 값에는 할당되어야 할 값 입력
(이름은 prefix/name/key 형태로 들어가야 함)
3. build.gradle에 아래의 코드 추가
dependencies {
...
implementation 'org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config'
...
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-starter-parent:Hoxton.SR12"
}
}
4. src/main/resources/bootstrap.yml 생성
aws:
paramstore:
enabled: true
prefix: /spring-boot-aws
name: # 리소스 이름
profileSeparator: _
5. src/main/resources/application.properties 파일 수정
환경변수로 설정하려고 하는 값은 여기에다가 적어주면 안됨. 적혀있으면 지우거나 주석처리!
6. 수정 다 됐으면 다시 commit & push 해서 결과 확인
'🌩️Cloud' 카테고리의 다른 글
Scale up & Scale out (0) | 2022.12.09 |
---|---|
Forward Proxy & Reverse Proxy (0) | 2022.12.09 |
Docker 基本 (0) | 2022.12.06 |
AWS를 통한 애플리케이션 배포 - 튜토리얼 (0) | 2022.12.05 |
AWS 학습을 위한 기본 학습 (0) | 2022.12.02 |