AWS CodeCommit - CodeBuild - CodeDeploy
AWS CodeCommit - CodeBuild - CodeDeploy — #AWSCodepipeline #AWSCodeCommit #AWSCodeBuild #AWSCodeDeploy #개발자의도구들 서버...
#AWSCodepipeline #AWSCodeCommit #AWSCodeBuild #AWSCodeDeploy #개발자의도구들
서버 클라우드 아키텍처
개발중인 플랫폼 아키텍처는 다음과 같습니다. 현재 MSA서버는 총 8개가 운영되고 있습니다. 각 서버를 EC2 환경에 배포해서 운영되도록 만들어야 합니다.
AWS CloudPipeline
클라우드 배포 자동화를 위해서 AWS CodePipeline을 사용하기로 하였습니다.
가장 정석적인 패턴인 CodeCommit → CodeBuild → CodeDeploy을 사용하여 빌드/배포를 진행합니다.
Client → AWS CodeCommit
- Client(현재 Window)는 직접 CodeCommit으로 파일을 Push 할 수 없습니다.
- IAM에 새로운 유저를 생성(혹은 기존 유저) - Credential 정보를 얻습니다.
- Credential을 Cleint가 사용할 수 있도록 합니다.
- Credential을 사용하여 Commit/Push 작업을 수행합니다.
이제 로컬 환경에서 CodeCommit Repository로 프로젝트 파일을 업로드할 수 있게 되었습니다.
Hands-On
CodeCommit Repository 만들기
AWS CodeCommit - Create Repository - naming
Repository 주소 복사: [CloneURL] - HTTPS URL
IAM User Credential
Users - 기존 유저 혹은 생성 - Security Credentials
[HTTPS Git credentials for AWS CodeCommit] - Generate credential
User name: ...
Password: xxx
안전하게 저장 save
Windows와 CodeCommit 연결
git remote add aws [CodeCommit Repo URL
push 명령어 사용시 로그인 화면이 나옵니다.
성공적으로 push 완료!
AWS CodeCommit → AWS CodeBuild
- CodeCommit에 새로운 파일이 Push됩니다.
- CodeCommit Event → Event Brdige → CodeBuild가 실행됩니다.
- Event를 받은 CodeBuild는 CodeCommit에서 빌드할 패키지 파일과 buildspec.yaml을 읽어 빌드를 준비합니다
- 빌드에 사용될 리소스는 AWS ECR혹은 AWS Managed 컨테이너 이미지를 사용합니다.
- AWS가 내부적으로 관리하는 Docker 환경에서 빌드를 시작합니다.
- 빌드 완료 후 MyApp.zip 파일을 만들어 S3 버킷에 저장합니다. 이는 CodeDeploy에서 사용됩니다.
- MyApp.zip은 다음 파일들을 포함함
- appspec.yml
- scripts
- start.sh
- stop.sh
- cleanup.sh
- validate.sh
- \*.jar
Hands-On
CodeBuild
// build 생성
AWS Console - CodeBuild - Create build project - naming project
// source
[Source]: AWS Code Commit
[Repository]: [your Code Repository]
[Branch]: [your branch]
// Env (빌드 환경 - 이미지)
Environment Image = Managed Image
OS = Amazon Linux 2
Runtime = Standard
Image = aws/codebuild/amazonlinux2-x86_64-standard:5.0
// BuildSpec
Use a buildspec file - Buildspec name(default: buildspec.yaml)
// Artifect
Amazon S3 - [your build bucket]
EventBridge등록
AWS Console - EventBridge - Create Rule - naming
[Events] - AWS events or EventBridge default
[Event Pattern]:
[EventSource] - AWS Services
[AWS Service] - CodeCommit
[Event Type]: CodeCommit Repository State Change
[Target]:
[TargetTypes]: AWS Service
[select a target]: codebuild project
[project ARN]: CodeBuild project에서 ARN copy and paste
[Role] - 자동생성
Create Rule
buildspec.yml (가장 기본형)
ComdeCommit repo의 root direcotry에 저장
version: 0.2
phases:
install:
runtime-versions:
java: corretto17
commands:
- echo "Install phase - Java 17 set."
pre_build:
commands:
- echo "Pre-build phase - Grant execute permission to Gradle wrapper"
- chmod +x gradlew
build:
commands:
- echo "Build phase - Building Spring Boot application"
- ./gradlew clean build -x test
- echo "Build Completed"
artifacts:
files:
- build/libs/*.jar
- appspec.yml
- scripts/**/*
discard-path: yes
git push 시 CodeBuild 실행되어 완료
Bucket에 정상적으로 업로드 완료
AWS CodeBuild → AWS CodeDeploy
- MyApp.zip이 저장된 위치를 파악합니다.
- Agent에게 MyApp.zip 다운로드 및 배포 지시합니다.
- appspec.yml에 기록된 단계대로 스크립트 실행 계획합니다.
- 순차적으로 스크립트를 실행합니다.
EC2에 위치한 Agent가 사실상 모든 배포를 진행합니다. (CodeDeploy는 커맨드 센터 느낌)
Hands-On
CodeDeploy 생성
AWS Console - CodeDeploy - Create applications - naming
- [Compute Platform: EC2] - create application
Create deployment group
appspec.yml
- 총 7단계로 구성되어있습니다
- ApplicationStop
- DownloadBundle
- BeforeInstall
- Install
- AfterInstall
- ApplicationStart
- ValidateService
- 모든 단계를 포함시킬 필요 없습니다.
- appspec.yml에 정의시에는 순서를 지키지 않아도 상관 없습니다. (map이라는 말)
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/app
hooks:
BeforeInstall:
- location: scripts/cleanup.sh
timeout: 20
ApplicationStop:
- location: scripts/stop.sh
timeout: 20
ApplicationStart:
- location: scripts/start.sh
timeout: 60
ValidateService:
- location: scripts/validate.sh
timeout: 20
Scripts(example)
// Clean Up
#!/bin/bash
echo "Cleaning up old files..."
rm -rf /home/ec2-user/app/*
// Start
#!/bin/bash
echo "Starting application..."
cd /home/ec2-user/app
JAR_FILE=$(ls *.jar | head -n 1)
nohup java -jar $JAR_FILE > app.log 2>&1 &
echo "Application started."
// Stop
#!/bin/bash
echo "Stopping existing application..."
PID=$(pgrep -f ".jar")
if [ -n "$PID" ]; then
echo "Killing process $PID"
kill -9 $PID
echo "Application stopped."
else
echo "No application found running."
fi
// validate
echo "Validating service..."
sleep 5
STATUS=$(curl -s http://localhost:8080/actuator/health | grep '"status":"UP"')
if [ -n "$STATUS" ]; then
echo "Validation succeeded."
exit 0
else
echo "Validation failed."
exit 1
fi
S3 → EC2 접근권한 설정
- 현재 생성된 EC2는 S3Bucket에 접근할 권한이 없어서 Build Artifect를 가져올 수 없습니다.
- Build Artifect가 저장된 S3 접근 IAM Role을 생성합니다.
- 생성된 IAM Role을 EC2에 붙입니다.
- 이제 EC2는 S3로 부터 Build Artifect를 가져올 수 있습니다.
이를 위해서 아래와 같은 작업이 필요합니다.
Hands-On
EC2 만들기
EC2 console -> Create -> AMI 선택 (Amazon Linux.)
설치전에 UserData를 등록 해두면 자동으로 배포환경을 만들 수 있습니다. (GPT 생성)
#!/bin/bash
# ---------- 기본 업데이트 ----------
yum update -y
# ---------- Java 설치 (Corretto 17) ----------
yum install -y java-17-amazon-corretto
amazon-linux-extras install java-openjdk11 -y
# ---------- 애플리케이션 실행 디렉토리 ----------
mkdir -p /home/ec2-user/app
chown ec2-user:ec2-user /home/ec2-user/app
# ---------- CodeDeploy Agent 설치 ----------
yum install -y ruby wget
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
systemctl enable codedeploy-agent
systemctl start codedeploy-agent
# ---------- 로그 디렉토리 ----------
mkdir -p /var/log/spring
chmod 777 /var/log/spring
S3 Bucket 생성
S3 - Create Bucket - BucketName 입력
IAM Role추가
IAM - ROLE - CreateRole
[Trusted entity]: Service: EC2
[Permission Policy]: AmazonS3ReadOnlyAccess (xx.. 보안에는 좋지 않다)
Rolename: front-ec2-build-artifect-access-role
\[Optional\] 보안을 고려해서 설계
Roles - 새로만든 Role - Add Permissions - Create Inline Policy - Json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::your-deployment-bucket", // 자신의 bucket ARN
"arn:aws:s3:::your-deployment-bucket/*"
]
}
]
}
Next - Naming - Create Policy
EC2에 IAM Role 붙이기
EC2 - Instance - Build 대상 Instance - Actions - Security - Modify IAM Role
[Choose IAM role] - 위에서 생성한 Role 선택 - update












