개인적으로 개발자로 성장하기 가장 좋은 방법중에 하나는 사이프로젝트를 진행하는 것이라고 생각한다.
내가 만들고 싶은것을 내 마음데로 만들 수 있다는 장점이 있으며 (팀원들과 협의하에)
회사에서 업무 내용과 맞지 않아서 써보지 못했던 기술이라던가, 궁금했던 기술들에 과감하게 시도해볼 수 있기 때문이다.
그리고 이러한 프로젝트 과정에서 많은 문제들을 만나고 해결하면서 많은 성장을 이루어 낼 수 있다고 생각한다.
대학생때 대외활동을 하면서 미완성으로 끝났던 프로젝트가 있었는데
올해 새해 목표로 당시에 함께했던 팀원과함께 그 당시에 못끝냈던 프로젝트를 마무리 해보려한다.
프로젝트를 진행하는 과정중에서 기본적으로 셋팅이 필요한 부분들에 대해서는
다른 누군가가 도움을 받을 수 있도록 기본적인 셋팅 내용에 대해 간단하게 정리를 해보려고 한다.
프로젝트 기본 개발 환경 준비 (백엔드 개발자 관점)
- github 저장소 만들기
- aws 활용하는법
- git action으로 배포 파이프라인 만들기
1. github 저장소 만들기
프로젝트를 진행하면서 가장 기본적인것 중에 하나는 소스코드를 저장하고 버전을 관리하면서
같이 프로젝트를 진행하는 동료들과 내용을 공유 할 수 있는 저장소를 만드는 것이다.
github를 기준으로 설명하면 아래와 같은 순서로 프로젝트를 진해하면 된다.
- http://github.com/ 회원 가입
- Home 화면에서 New 버튼을 클릭하여 신규 repository생성
- repository 화면에서 녹색 Code 버튼을 클릭해서 repository clone에 필요한 url 저장
- 이후 로컬 환경에서 신규 프로젝트를(ex, spring boot 프로젝트) 생성한뒤 아래의 명령어 수행
git init
git remote add origin "복사했던 repository url"
git add .
git commit -m "first init"
git push --set-upstream origin main
2. AWS 활용하기
프로젝트를 진행하면서 만들어진 결과물을 내 피씨에만 보관하고 싶은 사람은 없을 것이다.
만들어진 기능을 외부 사용자가 사용할 수 있도록하려면 서버가 필요하다.
유료로 돈을 쓰면서 사이드 프로젝트를 진행하고 싶은 사람은 많지 않을것이라고 생각하는데
요즘에는 그래도 작은 사양의 경우는 무료로 서비스를 할 수 있도록 해주는 사이트도 여러곳이 있는것 같다.
하지만 그 중에서도 많은 회사에서 사용하고 또한 많은 후기가 있는 AWS가 사용하기에는 가장 편하다고 생각한다.
신규로 가입을하면 1년간 프리티어로 다양한 서비스들을 이용할 수 있는데 (ec2, ecr, s3 등등)
물론 특정 사용량을 넘어가면 유로로 비용이 청구 될 수 있기 때문에 조심해야한다.
기본적으로 내가 사이드 프로젝트를 위해서 사용했던 프리티어 aws resource들은 아래와 같다
프리티어 기준은 정확하지 않고 대략적으로 적어두었다 .
- ec2 (일년에 750 시간정도는 무료, 메모리 1g 정도의 t2.micro 서버)
- ecr (500mb 까지 사용가능, 생각보다 용량이작아서 latest 태그 하나로 덮어쓰기로 사용)
- s3 (5g까지 사용가능)
- rds (750시간 동안 db.t2.micro 사용가능 20GB의 범용스토리지)
3. Git action으로 배포 파이프라인 만들기
개발된 코드를 서버로 자동으로 배포해주는 배포 파이프라인을 설정해두면 내가 수정한 사항을 github에 push 만 하면 알아서 빌드 하고
도커 이미지를 생성하고 서버로 배포시켜주는 처리를 할 수 있다.
git action 을 사용하면 이러한 과정을 정말 빠르고 쉽게 만들 수 있다 (github repository를 사용하는 사람이면 쓸 수 있다.)
해당 기능을 만들기 위해서 내가 했던 프로세스는 아래와 같으며 완성된 git action yml은 주석을 달아서 첨부해 두었다.
- 프로젝트에 이미지를 생성할 수 있도록 Dockerfile 생성
- 이미지를 저장하기 위한 ecr 생성
- 생성한 ec2 서버에 docker 설치
sudo yum install docker -y #도커설치
sudo service docker start #도커실행
sudo usermod -aG docker ec2-user #도커그룹에 인스턴스 기본 유저 추가, 접속후 바로 도커 제어 가능하도록
- 생성한 ec2 서버에 aws cli 설치
- aws user 생성 (ecr 과 s3에 대한 권한 부여), 해당 유저의 acces key, secret access key 생성 후 저장
- ec2 서버의 public ip, 서버 생성시 사용한 pem 키의 내용 확인 (pem 파일을 열어보면 내용 읽을 수 있음 )
Git action yml 예시
- 소스 build
- 생성된 api 문서 artifact에 저장
- docker image파일 ecr push
- ec2 서버에 접속
- ecr에서 업로드된 image pull
- image 실행
- artifact에 저장된 html api 명세서 s3에 저장
name: side project CICD
on:
push:
branches: # main branch에 push가 발생하면 아래의 job이 실행한다
- main
jobs:
push_to_registry:
name: push image to ecr
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3 # 소스를 가져오는 부분으로 알고 있음
- name: Set up JDK 21
uses: actions/setup-java@v3 # 프로젝트에서 사용하는 jdk 버전을 가져온다
with:
java-version: '21'
distribution: 'corretto'
- name: Grant execute permission for gradlew # 빌드 명령을 실행할 수 있도록 실행 권한 부여
run: chmod +x gradlew
- name: Setup Gradle
uses: gradle/gradle-build-action@v2 # build 진행
with:
arguments: clean build
cache-read-only: ${{ github.ref != 'refs/heads/master' }}
- name: save docs file
uses: actions/upload-artifact@v3 # 빌드과정에서 생성된 결과물 artifact저장
with:
name: api-docs
path: build/docs/asciidoc # 해당 경로에 있는 파일이 api-docs라는 이름으로 저장됨
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1 # aws cli에서 사용할 계정의 정보 입력
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1 #ecr로그인
- name: docker build and push
uses: docker/build-push-action@v3
with:
context: .
file: ./Dockerfile #기본 루크 경로의 dockerfile 실행시킴
push: true
tags: ${{ secrets.ECR_REPOSITORY }}/sideproject:latest
cache-from: type=registry,ref=${{ secrets.ECR_REPOSITORY }}/sideproject:latest
cache-to: type=inline
pull_from_registry:
name: Connect server ssh and pull from container registry
needs: push_to_registry
runs-on: ubuntu-latest
steps:
- name: connect ssh to run image
uses: appleboy/ssh-action@master #ssh 접속없이 run 명령어만 사용하면 제대로 명령어 수행이 안되서 사용
with:
host: ${{ secrets.AWS_SSH_HOST }} #ec2의 public ip
username: ${{ secrets.AWS_SSH_USERNAME }} # 기본 유저 ec2-user
key: ${{ secrets.AWS_SSH_KEY }} # pem키 읽어서 해당 내용 넣기
port: ${{ secrets.AWS_SSH_PORT }} # 기본 ssh 접근이 22 포트
script: |
# 이렇게 하면 docker 명령어를 통해서 ecr에 접근해서 이미지를 가져올 수 있게 하는거 (aws 문서보면 가이드 나옴)
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ${{ secrets.ECR_REPOSITORY }}
# ecr 에서 이미지 땡겨오기
docker pull ${{ secrets.ECR_REPOSITORY }}/sideproject:latest
# 이미 해당 서버가 실행되어있다면 종료하기
docker stop sideproject && docker rm sideproject
# 다운받은 이미지를 통해서 애플리케이션 run
docker run -d --name bevvy -p 80:8081 --restart unless-stopped ${{ secrets.ECR_REPOSITORY }}/sideproject:latest
# 다운받은 이미지 중에서 사용안하는 이미지는 제거
docker image prune -f
upload_docs:
name: upload api docs
needs: pull_from_registry
runs-on: ubuntu-latest
steps:
- name: Download Artifact
uses: actions/download-artifact@v3 # 위쪽에서 artifact에서 저장했던 파일 가져오기 위함
with:
name: api-docs # 저장한 Artifact파일 이름
path: artifact
- name: Upload Files to S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ap-northeast-2
run: |
aws s3 cp artifact/index.html s3://sideproject-docs #artifact에 저장된 파일을 앞에 뒤쪽에는 저장하는 s3폴더 입력
'Side Project' 카테고리의 다른 글
| 맥주 추천 서비스 애플리케이션 (16) | 2024.10.17 |
|---|