수동적이고 반복적인 배포 과정을 자동화함으로써 시간이 절약
전체 배포 과정을 매번 일관되게 진행하는 구조를 설계하여 휴먼 에러 발생 가능성을 낮출 수 있습니다.
휴먼에러 : 수동적으로 배포 과정을 진행하는 중에 생기는 실수
AWS 프리티어 계정 사용 시 한 계정에 두 개 이상의 파이프라인을 생성하면 추가 요금이 부여될 수 있습니다.
$ 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의 설치 여부를 확인
$ 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
서비스가 실행중인지 확인
에러발생시, 로그를 지운 뒤 다시 설치를 진행
/tmp/codedeploy-agent.update.log
/tmp/logfile
- 인스턴스를 검색하여 선택한 후 [ 태그 ] 를 확인
- 파이프라인 구축 단계에서 인스턴스를 잘 식별하기 위함
- IAM 역할에 AmazonEC2RoleforAWSCodeDeploy 추가, AmazonS3FullAccess 추가, AWSCodeDeployRole 추가, AmazonSSMFullAccess 추가
- 신뢰 관계를 편집
- 신뢰 관계란, 해당 역할을 취할 수 있는 서비스나 사용자를 명시하는 부분
- access 할 수 있는 서비스를 신뢰 관계에서 명시함으로써 역할이 확실히 완성
- "Service"의 값에 "codedeploy.ap-northeast-2.amazonaws.com" 값을 추가
appspec.yml은 배포 자동화를 도와주는 CodeDeploy-Agent가 인식하는 파일
CodeDeploy에서 지정한 각 단계에 맞춰 어떤 셸 스크립트를 실행하는지 지정
appspec.yml
ersion: 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
배포 자동화에서 빌드를 담당하는 CodeBuild-Agent가 인식하는 파일
buildspec.yml
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
**scripts/initialize.sh**
- 빌드 결과물을 실행할 수 있도록 실행 권한을 추가
#!/usr/bin/env bash
chmod +x /home/ubuntu/build/**
**scripts/server_clear.sh**
빌드 결과물이 저장되어있는 build
디렉토리를 제거합니다.
#!/usr/bin/env bash
rm -rf /home/ubuntu/build
**scripts/server_start.sh**
DeployServer-0.0.1-SNAPSHOT.jar
라는 빌드 결과물을 실행
#!/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 &
**scripts/server_stop.sh**
- 실행중인 Spring Boot 프로젝트를 종료
#!/usr/bin/env bash
sudo pkill -f 'java -jar'
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-aws-parameter-store-config' // 추가
}
dependencyManagement { // 블록 추가
imports {
mavenBom "org.springframework.cloud:spring-cloud-starter-parent:Hoxton.SR12"
}
}
파라미터 스토어에 저장된 변수를 조회하는 파일
aws:
paramstore:
enabled:trueprefix: /spring-boot-aws
name: # 리소스 이름을 작성합니다.
profileSeparator: _
server.port=80 #포트 변경은 선택입니다.
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#spring.datasource.url=jdbc:mysql://{AWS RDS Endpoint}/test?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
#spring.datasource.username={RDS Mysql Admin id}
#spring.datasource.password={RDS Mysql Admin password}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#config.domain={AWS S3 Endpoint}
유용한 자료 감사합니다!