데이터를 수집, 분석, 사용하여 프로그램의 목표 달성을 향한 진행 상황을 추적하고 관리 결정을 안내하는 프로세스
특정 지표를 감시하는 데 중점
Monitoring의 한계
Monitoring은 사전에 정의한 지표 외의 정보를 제공하지 않기 때문에 예상하지 못한 문제에 대한 원인 분석이 어렵다.
복잡한 시스템에서 발생하는 예외 상황에 대한 근본적인 이해를 돕기에는 한계가 있다.
Observability
로그, 메트릭, 추적과 같은 시스템에서 생성되는 데이터를 분석하여 시스템의 내부 상태를 이해하는 능력
단순한 지표 감시에 그치지 않고, 시스템의 입력과 출력 데이터를 통해 내부 동작을 추론
문제가 발생했을 때 단순히 "무엇이 잘못되었는가"를 밝히는 것을 넘어 "왜 잘못되었는가"까지 설명 가능
Monitoring과 Observability의 상호 보완성
Monitoring과 Observability는 상호 배타적인 개념이 아니라, 서로를 보완하여 보다 나은 시스템 안정성을 제공
Monitoring은 기본적인 상태 감시와 알림을 통해 신속한 대응을 가능하게 하고, Observability는 보다 깊이 있는 분석을 통해 문제의 근본 원인을 해결하는 데 도움을 준다.
예를 들어, 특정 시간대에 시스템 응답 속도가 느려졌다는 알림을 Monitoring을 통해 받았다면, 그 원인을 파악하는 과정에서 Observability가 필요하다. 로그와 분산 추적 데이터를 분석하여 어느 서비스에서 병목이 발생했는지, 어떤 요청이 문제를 일으켰는지를 추적할 수 있다.
Monitoring을 통해 기본적인 운영 지표를 관리하고, Observability를 통해 복잡한 문제의 근본 원인을 분석함으로써, 더욱 견고한 시스템을 구축
이전 포스팅에서 수동으로 배포하는 방법에 대해 알아보았다면, 이번 포스팅에선 해당 수동 배포를 자동화하는 방법에 대해 알아보겠습니다.
* github, github action, codedeploy 활용
Github Action 설정 (CI)
yaml 파일로 설정하기 위해 해당 네모 부분 클릭해 들어갑니다.
# workflow의 이름
name: CI
# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
push:
branches: [ master ] # main branch로 push 될 때 실행됩니다.
pull_request:
branches: [ master ] # main branch로 pull request될 때 실행됩니다.
# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있습니다.
jobs:
build:
name: CI
# 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정합니다.
runs-on: ubuntu-latest
steps:
# 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃합니다.
- uses: actions/checkout@v2
- name: Set up JDK 21
uses: actions/setup-java@v2
with:
java-version: '21'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: sudo chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
위 코드를 넣어 줍니다.
이후 로컬 프로젝트에서 git pull 로 가져와야합니다!!
AWS IAM User 생성(액세스 키 발급)
S3FullAccess, CodeDeployFullAccess 관련 정책을 넣은 사용자를 생성합니다.
.github/workflows 폴더 안에 cd.yaml 파일을 생성하고 아래 코드를 넣어주세요.
# workflow의 이름
name: CD
# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
push:
branches: [ master ] # master branch로 push 될 때 실행됩니다.
# 해당 yml 내에서 사용할 key - value
env:
S3_BUCKET_NAME: realyun-cicd-test
PROJECT_NAME: cicd-test
# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있습니다.
jobs:
build:
name: CD
# 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정합니다.
runs-on: ubuntu-latest
steps:
# 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃합니다.
- uses: actions/checkout@v2
- name: Set up JDK 21
uses: actions/setup-java@v2
with:
java-version: '21'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: sudo chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make zip file
run: zip -r ./$GITHUB_SHA.zip .
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
# script files 복사
- name: Copy script
run: cp ./scripts/*.sh ./deploy
# S3에 업로드
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
성공하면 버킷에 zip 파일이 담긴 것을 확인할 수 있습니다.
EC2 역할 추가
EC2에 적용할 CodeDeploy role을 만들어 줍니다.
IAM 역할 수정을 클릭해 위에서 생성했던 role을 적용합니다. (인스턴스 재부팅 해야 적용됨!)
EC2에 CodeDeploy agent 설치
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status
# ruby 에러 시
sudo yum install ruby
위 이미지처럼 running 메시지를 확인하면 잘 돌아가고 있음을 알 수 있습니다.
CodeDeploy 권한 추가 및 애플리케이션 생성
EC2에 권한을 추가한 것 처럼 CodeDeploy에도 EC2에 접근할 수 있는 권한을 생성합니다.
위에서 CodeDeploy를 위해 생성했던 역할을 선택한 뒤 EC2 인스턴스로 구성해주면 됩니다.
(로드밸런싱은 비활성화로 진행)
version: 0.0
os: linux
# S3에 있는 zip 파일이 EC2에 배포될 위치를 지정
files:
- source: / # CodeDeploy에서 전달해 준 파일 중 destination으로 이동시킬 대상을 루트로 지정(전체파일)
destination: /home/ec2-user/action/ # source에서 지정된 파일을 받을 위치, 이후 jar를 실행하는 등은 destination에서 옮긴 파일들로 진행
overwrite: yes
permissions: # CodeDeploy에서 EC2서버로 넘겨준 파일들을 모두 ec2-user권한을 갖도록 합니다.
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
# ApplicationStart 단계에서 deploy.sh를 실행시키도록 합
hooks: # CodeDeploy배포 단계에서 실행할 명령어를 지정합니다.
ApplicationStart: # deploy.sh를 ec2-user권한으로 실행합니다.
- location: scripts/deploy.sh
timeout: 60 # 스크립트 실행 60초 이상 수행되면 실패가 됩니다.
runas: ec2-user