You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
다른 사용자들이 '인터넷'을 통해서 우리의 서비스(째깍)을 이용할 수 있도록 만들어줘야 합니다.
localhost와 같은 로컬 환경은 다른 사용자가 접근하게 만들려면 복잡하고 보안에 문제가 있어요.
📌 우리는 무료로 사용할 수 있는 AWS(Amazon Web Service) 를 사용해서 진행했습니다.
째깍 백엔드 배포 구성
Github Actions, AWS EC2, AWS ECR, Docker를 사용해서 배포를 진행했어요. 이에 대해서 한 번 정리를 해볼게요!
Github Actions
Github 에서 제공하는 CI/CD 도구
Github Repository에 push / pull request에 따라 자동으로 작업을 수행하도록 만들 수 있습니다.
하나의 컴퓨터라고 생각해도 좋을 것 같아요!
Github Actions를 사용하려면 해당 레포지토리 프로젝트 최상단에 .github/workflows 폴더를 만들어줘야 합니다. 이 폴더 안에 있는 yaml 파일을 Github Actions라는 컴퓨터가 인식을 하는 것입니다. (파일 명은 상관없어요 😃)
우리 프로젝트에 있는 파일의 주석을 유심히 봐주세요! 이해가 안되는 부분이 있으면 말씀해주세요 🙇🏻♂️
중간에 actions/checkout@v4, actiosn/setup-java@v3과 같은 것은 깃허브 마켓플레이스에서 제공하는 Github Actions를 더 편리하게 사용할 수 있도록 해주는 플러그인이라고 생각하면 됩니다.
deploy.yml
name: zzaekkac server deploy# main 브랜치에 push 이벤트가 발생했을 때 이 워크플로우를 실행합니다.on:
push:
branches:
- main# jobs: 이 워크플로우에서 수행할 작업들을 정의합니다.jobs:
build:
# 이 작업을 실행할 환경을 지정합니다. 여기서는 최신 버전의 Ubuntu를 사용합니다.runs-on: ubuntu-latest# steps: 작업 내에서 수행할 명령어들을 순차적으로 정의합니다.steps:
# 첫 번째 단계: Github 레포지토리를 체크아웃합니다. 이는 git clone과 유사하게, 현재 레포지토리의 내용을 가져옵니다.
- name: Github Repository Loaduses: actions/checkout@v4# 두 번째 단계: JDK 17을 설치합니다. 이는 자바 애플리케이션을 빌드하고 실행하기 위한 환경을 설정합니다.
- name: Set up JDK 17uses: actions/setup-java@v3with:
java-version: '17'distribution: 'temurin'# 세 번째 단계: application.properties 파일을 생성합니다. 이는 환경 설정 파일로, 필요한 설정 값을 넣습니다.
- name: application.properties 파일 생성run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.properties# 네 번째 단계: Gradle을 사용하여 애플리케이션을 빌드합니다. 여기에는 테스트도 포함될 수 있습니다.
- name: Build with Gradlerun: ./gradlew clean build# 다섯 번째 단계: AWS 자격 증명을 설정합니다. 이는 AWS와 상호 작용하기 위한 인증 정보를 설정합니다.
- name: AWS Credentialsuses: aws-actions/configure-aws-credentials@v4with:
aws-region: ap-northeast-2aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}# 여섯 번째 단계: AWS ECR에 로그인합니다. ECR은 Docker 이미지를 저장할 수 있는 AWS의 컨테이너 레지스트리 서비스입니다.
- name: Login to AWS ECRid: login-ecruses: aws-actions/amazon-ecr-login@v2# 일곱 번째 단계: Docker 이미지를 빌드합니다. 이는 Dockerfile을 기반으로 애플리케이션의 이미지를 생성합니다.
- name: Docker image buildrun: docker build -t zzaekkac-server .# 여덟 번째 단계: Docker 이미지를 태깅합니다. 이는 이미지를 ECR에 푸시하기 위해 태그를 설정하는 단계입니다.
- name: Docker tagrun: docker tag zzaekkac-server ${{ steps.login-ecr.outputs.registry }}/zzaekkac-server:latest# 아홉 번째 단계: Docker 이미지를 ECR에 푸시합니다. 이는 태그된 이미지를 AWS ECR로 업로드하는 단계입니다.
- name: Docker pushrun: docker push ${{ steps.login-ecr.outputs.registry }}/zzaekkac-server:latest# 열 번째 단계: SSH를 통해 EC2 인스턴스에 접속합니다. 이는 원격 서버에 접근하여 명령을 실행하기 위한 단계입니다.
- name: sshuses: appleboy/ssh-action@masterwith:
host: ${{ secrets.EC2_HOST }}username: ${{ secrets.EC2_USERNAMAE }}key: ${{ secrets.EC2_PRIVATE_KEY }}script_stop: truescript: | # 현재 실행 중인 Docker 컨테이너를 중지합니다. 서버가 중지되어도 오류를 무시하도록 '|| true'를 추가했습니다. docker stop zzaekkac-server || true # 중지된 Docker 컨테이너를 삭제합니다. 이미 컨테이너가 없더라도 오류를 무시하도록 '|| true'를 추가했습니다. docker rm zzaekkac-server || true # ECR로부터 최신 Docker 이미지를 가져옵니다. docker pull ${{ steps.login-ecr.outputs.registry }}/zzaekkac-server:latest # 새로운 Docker 컨테이너를 실행합니다. 8080 포트를 매핑하여 외부에서 접근할 수 있도록 설정했습니다. docker run -d --name zzaekkac-server -p 8080:8080 ${{ steps.login-ecr.outputs.registry }}/zzaekkac-server:latest
EC2 (Elastic Compute Cloud)
쉽게 생각하자면, AWS가 가지고 있는 컴퓨터를 우리는 원격으로 사용한다! 라고 생각하면 될 것 같아요.
서버 배포를 위해서 '컴퓨터를 24시간 동안' 켜놔야 합니다.
또한, 내 컴퓨터(local) 환경일 경우 보안상 문제가 존재하기도 해요.
가장 큰 이유는 현업에서 아주 많이 AWS EC2 를 많이 씁니다! (대충, 채용 공고에 90%는 필수..)
Region
AWS는 각 지역마다 리전(Region)을 가지고 있어요.
서울: ap-northeast-2
우리의 서버는 ‘네트워크’를 통해서 통신하게 되므로, 사용자의 위치와 가까운 리전을 선택해주는게 응답속도가 가장 빠르다고 합니다.
‼️ 주의 각 리전마다 EC2를 관리하기 때문에 다른 리전을 선택했을 때 생성한 EC2가 안보일 수 있어요
인스턴스 시작(생성)
이름: zzaekkac-server
OS: ubuntu
가볍고 성능이 좋은 linux 환경으로 구성합시다.
windows, mac은 기본적으로 깔려야 하는 파일이 많아요..
키 페어: ssh로 접근할 때 사용하는 키(rsa)
windows: pputy 접속 → .ppk
mac: terminal 접속 → .pem
인스턴스: t2.micro
컴퓨터의 성능, 프리티어(무료)
보안그룹: IP와 포트(port)를 설정해줍니다.
http(80) / ssh(22) / 추후에 8080포트로 요청을 받는다면 8080도 추가!
이 때 우리는 Docker를 사용해서 배포를 진행할 것이기 때문에, EC2 내부에 Docker를 설치해줬어요!
그리고, 레포지토리 최상단에 Dockerfile 을 생성해줘야 합니다.
FROM eclipse-temurin:17-jdk-alpine
COPY ./build/libs/*SNAPSHOT.jar zzaekkac.jar
ENTRYPOINT ["java", "-jar", "zzaekkac.jar"]
Ecplise Temurin JDK 17 기반 이미지로 사용합니다.
Github Actions에서 gradle로 build를 진행하였기 때문에, 생성된 jar 파일을 zzaekkac.jar 파일로 이름을 변경합니다.
컨테이너가 시작될 때 실행할 명령을 정의합니다. (Java Application 실행)
IAM (Identity and Access Management)
AWS 서비스에 대한 접근 권한을 관리하는 서비스입니다.
외부 서비스(github actions)와 AWS 서비스(EC2, ECR)에 대한 권한을 설정해줘야 해요.
외부 → 내부 / 내부 → 내부 두 상황 모두 관리해줘야 합니다.
deploy.yml
# 다섯 번째 단계: AWS 자격 증명을 설정합니다. 이는 AWS와 상호 작용하기 위한 인증 정보를 설정합니다.
- name: AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
위쪽 Github Actions 과정에서 aws-access-key-id, aws-secret-access-key를 IAM에서 발급하게 됩니다.
# 여섯 번째 단계: AWS ECR에 로그인합니다. ECR은 Docker 이미지를 저장할 수 있는 AWS의 컨테이너 레지스트리 서비스입니다.
- name: Login to AWS ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
# 일곱 번째 단계: Docker 이미지를 빌드합니다. 이는 Dockerfile을 기반으로 애플리케이션의 이미지를 생성합니다.
- name: Docker image build
run: docker build -t zzaekkac-server .# 여덟 번째 단계: Docker 이미지를 태깅합니다. 이는 이미지를 ECR에 푸시하기 위해 태그를 설정하는 단계입니다.
- name: Docker tag
run: docker tag zzaekkac-server ${{ steps.login-ecr.outputs.registry }}/zzaekkac-server:latest
# 아홉 번째 단계: Docker 이미지를 ECR에 푸시합니다. 이는 태그된 이미지를 AWS ECR로 업로드하는 단계입니다.
- name: Docker push
run: docker push ${{ steps.login-ecr.outputs.registry }}/zzaekkac-server:latest
Github Actions 과정에서 Docker 이미지를 만들고 push하는 과정이 ECR Repository에 올리는 과정이에요!
이러한 방법으로 ECR에 Docker image를 올리게 됩니다!
EC2 - Docker 컨테이너 생성
EC2에 접속을 해서 ECR에 올라온 이미지를 Pull 해서 가져온 후 실행하게 되면, 컨테이너가 생성되어 우리가 만든 애플리케이션이 배포됩니다.
# 열 번째 단계: SSH를 통해 EC2 인스턴스에 접속합니다. 이는 원격 서버에 접근하여 명령을 실행하기 위한 단계입니다.
- name: ssh
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAMAE }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script_stop: true
script: |
# 현재 실행 중인 Docker 컨테이너를 중지합니다. 서버가 중지되어도 오류를 무시하도록 '|| true'를 추가했습니다.
docker stop zzaekkac-server || true
# 중지된 Docker 컨테이너를 삭제합니다. 이미 컨테이너가 없더라도 오류를 무시하도록 '|| true'를 추가했습니다.
docker rm zzaekkac-server || true
# ECR로부터 최신 Docker 이미지를 가져옵니다.
docker pull ${{ steps.login-ecr.outputs.registry }}/zzaekkac-server:latest
# 새로운 Docker 컨테이너를 실행합니다. 8080 포트를 매핑하여 외부에서 접근할 수 있도록 설정했습니다.
docker run -d --name zzaekkac-server -p 8080:8080 ${{ steps.login-ecr.outputs.registry }}/zzaekkac-server:latest
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
배포 (Deployment)
사용자 → 인터넷 → 서버
localhost
와 같은 로컬 환경은 다른 사용자가 접근하게 만들려면 복잡하고 보안에 문제가 있어요.째깍 백엔드 배포 구성
Github Actions
,AWS EC2
,AWS ECR
,Docker
를 사용해서 배포를 진행했어요. 이에 대해서 한 번 정리를 해볼게요!Github Actions
Github Actions를 사용하려면 해당 레포지토리 프로젝트 최상단에
.github/workflows
폴더를 만들어줘야 합니다. 이 폴더 안에 있는yaml
파일을 Github Actions라는 컴퓨터가 인식을 하는 것입니다. (파일 명은 상관없어요 😃)우리 프로젝트에 있는 파일의 주석을 유심히 봐주세요! 이해가 안되는 부분이 있으면 말씀해주세요 🙇🏻♂️
deploy.yml
EC2 (Elastic Compute Cloud)
Region
인스턴스 시작(생성)
☑️ 위와 같은 스펙으로 인스턴스를 생성했어요!
인스턴스 접속
ssh 방식으로 접속을 해봅시다.
24시간동안 돌아갈 수 있는 우리의 컴퓨터를 만들게 되었습니다 🥳
이 때 우리는 Docker를 사용해서 배포를 진행할 것이기 때문에, EC2 내부에 Docker를 설치해줬어요!
그리고, 레포지토리 최상단에
Dockerfile
을 생성해줘야 합니다.IAM (Identity and Access Management)
deploy.yml
위쪽
Github Actions
과정에서 aws-access-key-id, aws-secret-access-key를 IAM에서 발급하게 됩니다.이 과정에서 생성한 키들을 Github Repository에서 관리할 수 있어요!
ECR (Elastic Container Registry)
deploy.yml
Github Actions
과정에서 Docker 이미지를 만들고 push하는 과정이 ECR Repository에 올리는 과정이에요!이러한 방법으로 ECR에 Docker image를 올리게 됩니다!
EC2 - Docker 컨테이너 생성
EC2에 접속을 해서 ECR에 올라온 이미지를 Pull 해서 가져온 후 실행하게 되면, 컨테이너가 생성되어 우리가 만든 애플리케이션이 배포됩니다.
테스트용 컨트롤러 응답
Docker 로그 확인
docker logs -f 'container'
Docker
저도 도커에 대해서는 공부가 필요해서 함께 찾아보면 좋을 것 같아요 🤣
뭔가 글을 작성하고 보니 중구난방으로 막 적은 것 같은데 나중에 디스코드로 한 번 다시 얘기해봅시다!! ㅋㅋㅋㅋㅋ
Beta Was this translation helpful? Give feedback.
All reactions