AWS 실습AWS 허브발행일 2025. 12. 11.원본 https://blog.naver.com/jword_/224105892662 ↗

AWS CodeCommit - CodeBuild - CodeDeploy

AWS CodeCommit - CodeBuild - CodeDeploy — #AWSCodepipeline #AWSCodeCommit #AWSCodeBuild #AWSCodeDeploy #개발자의도구들 서버...

#DevOps/cloudOps#Naver Blog

#AWSCodepipeline #AWSCodeCommit #AWSCodeBuild #AWSCodeDeploy #개발자의도구들

​

서버 클라우드 아키텍처

​

이미지

개발중인 플랫폼 아키텍처는 다음과 같습니다. 현재 MSA서버는 총 8개가 운영되고 있습니다. 각 서버를 EC2 환경에 배포해서 운영되도록 만들어야 합니다.

​

AWS CloudPipeline

클라우드 배포 자동화를 위해서 AWS CodePipeline을 사용하기로 하였습니다.

이미지

가장 정석적인 패턴인 CodeCommit → CodeBuild → CodeDeploy을 사용하여 빌드/배포를 진행합니다.

​

Client → AWS CodeCommit

이미지

  1. Client(현재 Window)는 직접 CodeCommit으로 파일을 Push 할 수 없습니다.
  2. IAM에 새로운 유저를 생성(혹은 기존 유저) - Credential 정보를 얻습니다.
  3. Credential을 Cleint가 사용할 수 있도록 합니다.
  4. Credential을 사용하여 Commit/Push 작업을 수행합니다.

​

이제 로컬 환경에서 CodeCommit Repository로 프로젝트 파일을 업로드할 수 있게 되었습니다.

​


Hands-On

CodeCommit Repository 만들기

text 코드 예제
                                    AWS CodeCommit - Create Repository - naming

Repository 주소 복사: [CloneURL] - HTTPS URL

IAM User Credential

text 코드 예제
                                    Users - 기존 유저 혹은 생성 - Security Credentials

[HTTPS Git credentials for AWS CodeCommit] - Generate credential
User name: ...
Password: xxx

안전하게 저장 save

Windows와 CodeCommit 연결

bash 코드 예제
                                    git remote add aws [CodeCommit Repo URL

이미지

push 명령어 사용시 로그인 화면이 나옵니다.

이미지

성공적으로 push 완료!

​

AWS CodeCommit → AWS CodeBuild

이미지

  1. CodeCommit에 새로운 파일이 Push됩니다.
  2. CodeCommit Event → Event Brdige → CodeBuild가 실행됩니다.
  3. Event를 받은 CodeBuild는 CodeCommit에서 빌드할 패키지 파일과 buildspec.yaml을 읽어 빌드를 준비합니다
  4. 빌드에 사용될 리소스는 AWS ECR혹은 AWS Managed 컨테이너 이미지를 사용합니다.
  5. AWS가 내부적으로 관리하는 Docker 환경에서 빌드를 시작합니다.
  6. 빌드 완료 후 MyApp.zip 파일을 만들어 S3 버킷에 저장합니다. 이는 CodeDeploy에서 사용됩니다.
  • MyApp.zip은 다음 파일들을 포함함
  • appspec.yml
  • scripts
  • start.sh
  • stop.sh
  • cleanup.sh
  • validate.sh
  • \*.jar

Hands-On

CodeBuild

text 코드 예제
                                    // 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등록

text 코드 예제
                                    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에 저장

yaml 코드 예제
                                    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

이미지

  1. MyApp.zip이 저장된 위치를 파악합니다.
  2. Agent에게 MyApp.zip 다운로드 및 배포 지시합니다.
  3. appspec.yml에 기록된 단계대로 스크립트 실행 계획합니다.
  4. 순차적으로 스크립트를 실행합니다.

​

EC2에 위치한 Agent가 사실상 모든 배포를 진행합니다. (CodeDeploy는 커맨드 센터 느낌)

​


​

Hands-On

CodeDeploy 생성

text 코드 예제
                                    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이라는 말)
yaml 코드 예제
                                    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)

text 코드 예제
                                    // Clean Up
#!/bin/bash
echo "Cleaning up old files..."
rm -rf /home/ec2-user/app/*
bash 코드 예제
                                    // 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."
text 코드 예제
                                    // 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
text 코드 예제
                                    // 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 접근권한 설정

​

​

이미지

  1. 현재 생성된 EC2는 S3Bucket에 접근할 권한이 없어서 Build Artifect를 가져올 수 없습니다.
  2. Build Artifect가 저장된 S3 접근 IAM Role을 생성합니다.
  3. 생성된 IAM Role을 EC2에 붙입니다.
  4. 이제 EC2는 S3로 부터 Build Artifect를 가져올 수 있습니다.

​

이를 위해서 아래와 같은 작업이 필요합니다.


Hands-On

EC2 만들기

text 코드 예제
                                    EC2 console -> Create -> AMI 선택 (Amazon Linux.)

설치전에 UserData를 등록 해두면 자동으로 배포환경을 만들 수 있습니다. (GPT 생성)

bash 코드 예제
                                    #!/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 생성

text 코드 예제
                                    S3 - Create Bucket - BucketName 입력

IAM Role추가

text 코드 예제
                                    IAM - ROLE - CreateRole

[Trusted entity]: Service: EC2
[Permission Policy]: AmazonS3ReadOnlyAccess (xx.. 보안에는 좋지 않다)

Rolename: front-ec2-build-artifect-access-role

\[Optional\] 보안을 고려해서 설계

text 코드 예제
                                    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 붙이기

text 코드 예제
                                    EC2 - Instance - Build 대상 Instance - Actions - Security - Modify IAM Role

[Choose IAM role] - 위에서 생성한 Role 선택 - update

​

​