https://github.com/mr-won/aws_ec2_docker
AWS EC2, Docker로 백엔드 서버 배포 정리
https://github.com/mr-won/aws_ec2_docker
aws-ec2 docker git-runner gitlab-ci
Last synced: 11 months ago
JSON representation
AWS EC2, Docker로 백엔드 서버 배포 정리
- Host: GitHub
- URL: https://github.com/mr-won/aws_ec2_docker
- Owner: mr-won
- Created: 2024-03-02T05:44:43.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-03-05T08:22:50.000Z (almost 2 years ago)
- Last Synced: 2025-03-18T02:27:03.053Z (11 months ago)
- Topics: aws-ec2, docker, git-runner, gitlab-ci
- Homepage:
- Size: 43 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## EC2 생성

```
솔루션 탭의 가상 머신 시작을 눌러서 EC2 서비스로 들어간다.
```


```
키 페어 파일을 생성하고 바탕화면에 키를 다운로드한다.
```

```
Ubuntu Server 20.04 LTS (HVM), SSD Volumn Type을 선택한다.
```

```
인스턴스는 t2.micro 인스턴스를 선택한다.
```

```
스토리지는 30GiB의 범용 SSD(gp2)를 사용한다.
```

```
키 페어는 아까 생성한 fullstack-recommender-key를 넣어준다.
```

```
AMI 선택, 인스턴스 유형 선택, 스토리지 선택, 키 페어 선택등을 마치고 인스턴스 시작을 누른다.
```

```
생성한 EC2 인스턴스가 정상적으로 실행 중인 것을 확인할 수 있다.
```
## EC2 환경 설정 및 배포 환경 설정
## EC2 연결

```
인스턴스 ID에 오른쪽 클릭하여 연결이라는 메뉴를 클릭한다.
```

```
연결 정보를 확인하고 오른쪽 아래의 연결을 클릭한다.
```

```
연결이 되면 검정색 화면이 나타나고 이제 docker와 gitlab-runner 프로그램을 우분투 환경에 설치한다.
```
## Docker 설치 방법

```
curl 명령어를 이용해서 설치용 스크립트를 다운로드받아서 설치한다음 sudo 명령어로 스크립트를 실행한다.
```

```
관리자 권한 없이 docker 명령어를 실행할 수 있도록하는 명령어를 실행한다.
```

```
현재 실행되고 있는 docker 컨테이너를 확인할 수 있는 명령어를 실행한다.
```

```
다음과 같이 나오면 정상적으로 docker가 설치된 것이다.
```
## gitlab-runner 설치 방법

```
gitlab-runner 공식 문서에서 안내하는 방식으로 설치한다.
Gitlab 리포지토리를 우분투에 등록하는 과정으로 다음 명령어를 실행한다.
```

```
You can now install packages라는 메시지가 나오면 Gitlab 리포지토리를 우분투에 등록이 완료된 것이다.
```

```
이제 다음 명령어를 실행하여 gitlab-runner를 설치한다.
```


```
설치가 완료되고 다음 명령어로 설치가 제대로 되었는지 확인할 수 있다.
gitlab-runner: Service is running 이라는 메시지가 출력되면 성공이다.
```
## GitLab deploy branch 분리

```
VS Code에서 지금까지 변경한 모든 내용을 stage 상태로 업로드한다.
```

```
stage 상태가 되면 commit을 할 준비가 된 것이다. git commit을 입력하여 stage에 있는 내용을 모두 커밋한다.
```

```
git push를 하여 지금까지 했던 내용을 GitLab에 모두 업로드한다.
```


```
git create를 입력하고 브랜치 이름을 deploy로 생성한다. 이렇게 하면 로컬, 즉 내 컴퓨터에만 있는 브랜치인 deploy가 생성된다.
```

```
deploy 브랜치를 푸시 과정을 통해서 GitLab에 업로드한다. upstream branch 경고는 무시하고 ok를 누른다.
브랜치만 따로 푸시하는 경우에는 stage -commit 과정을 따로 해줄 필요가 없다. 안에 들어 있는 내용은 바뀐 게 없기 때문이다.
```


```
deploy 브랜치가 GitLab에 업로드 된 것을 확인할 수 있다.
```
## GitLab runner로 배포 자동화
1. gitlab-runner를 AWS EC2에 등록한다.
2. gitlab-runner를 실행할 .gitlab-ci.yml파일을 만든다.
3. 만든 백엔드 서버를 dockerize 하여 배포한다.
#### gitlab-runner 등록

```
GitLab-Settings-CI/CD 메뉴에서 Runners 메뉴의 Expand를 눌러 확장하면 Registration Token을 확인할 수 있다.
토큰 값을 복사해준다.
```

```
EC2에 연결해서 다음 명령어로 gitlab-runner 등록을 시작한다.
Enter the GitLab instance URL에 https://gitlab.com/을 입력한다.
```

```
토큰을 입력하는 프롬프트에서 아까 Gitlab runner에서 복사해 두었던 토큰을 입력한다.
```

```
runner가 어떤 역할을 하는지 알아보기 쉽도록 지정하는 description 항목이다.
원하는 설명을 적으면 되는데 여기서 fullstack-api라고 작성한다.
```

```
다음으로 tag를 입력하는 프롬프트가 나온다. 이 tags는 중요하다. 나중에 gitlab-runner의 tags를 이용해서
어떤 runner에 CI를 실행시킬 것인지 결정하기 때문이다.
통일된 코드를 가지기 위해서 fullstack-api라고 입력한다.
```

```
Enter optional maintenance note for runner 프롬프트는 빈칸으로 넘기고 다음에 나오는 executor를 선택하는 프롬프트에
shell을 입력한다.
```


```
등록 완료 메시지가 나타나고 GitLab-Setting-CI/CD 메뉴의 하단에 fullstack-api라는 이름의 runner가 등록된 것을
확인할 수 있다.
```
#### .gitlab-ci.yml 파일 코드에 추가
```
코드에 .gitlab-ci.yml을 추가해서 deploy 브랜치에 배포했을 때 자동으로 GitLab에서 배포가 진행되도록 만든다.
```
```yml
image: python:3.9
variables:
IMAGE_VERSION: v1.0.0
WORK_DIR: .
NODE_ENV: development
DOCKER_DRIVER: overlay2
DOCKER_FILE: Dockerfile
DOCKER_BUILD_CONTEXT: .
DOCKER_IMAGE: fullstack-recommender:${IMAGE_VERSION}
cache:
key: "$CI_COMMIT_REF_SLUG"
stages:
- deploy
Deploy:
stage: deploy
only:
- deploy
tags:
- fullstack-api
script:
- docker stop $(docker ps -aq) || true
- docker build -t ${DOCKER_IMAGE} .
- docker run -it -d -p 8080:80 --restart=unless-stopped ${DOCKER_IMAGE}
```
```
GitLab에서 runner를 사용하는 리포지토리인지 아닌지를 감지하기 위해서는 .gitlab-ci.yml 라는 이름의 파일이 필요하다.
프로젝트 가장 상단의 폴더에 .gitlab-ci.yml 파일을 만들어준다.(파일 이름의 가장 앞에 마침표를 확인한다)
only:라는 부분이 언제 .gitlab-ci.yml이 작동할지 정해주는 역할이다. deploy로 정의했으므로 deploy branch에 푸시할 때만
이 파일이 작동한다는 뜻이다.
tags:라는 부분은 gitlab-runner 중 어떤 tag를 가진 gitlab-runner를 사용할 것인지 지정하는 것이다. 위에서 fullstack-api로
설정했다.
script: docker 명령어들이 포함되어 있는 것을 볼 수 있는데, 기존에 동작하던 docker를 멈추고 새로운 docker의 이미지를 만든 후
웹 서버가 실행되도록 하는 명령어이다. 아직 dockerfile을 만들어주지 않아서 deploy 브랜치에 푸시해도 제대로 작동하지 않는다.
```
## docker 컨테이너를 EC2에 배포
```
docker 컨테이너로 만들어주는 것을 dockerize라고 하는데, 일종의 가상 머신이다.
dockerize를 하게 되면 서버를 이전하거나 다른 컴퓨터에서 작업할 때 별다른 환경설정 없이 docker image 하나로 실행까지 가능하다.
```
#### Dockerfile
```dockerfile
FROM python:3.9
EXPOSE 80
COPY ./app /app
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN python3 -m pip install --no-cache-dir --upgrade \
setuptools \
wheel \
&& \
python3 -m pip install --trusted-host pypi.python.org -r requirements.txt
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
```
```
Dockerfile이라는 이름으로 파일을 추가한다.(첫 문자를 대문자 D로 사용하는 것에 유의한다)
Python 3.9 환경을 불러온다. Python, Node, Go 등 필요할 만의 언어를 docker image는 docker hub에 등록이 되어 제공한다.
```
#### requirements.txt


```
requirements.txt는 지금까지 설치했던 파이썬 패키지들의 목록인데,
docker가 환경설정을 할 때 패키지 하나하나 따로 설치해주기는 어려워서 목록으로 만들어주는 것이다.
```

```
docker를 이용한 배포가 모두 완료되고 실제로 동작하고 있는지 확인한다.
```


```
AWS EC2 인스턴스 대시보드로 이동한다. 인스턴스 - Detail - Public IPv4 address가 접근해야 할 주소다.
이 주소를 복사하거나 따로 저장해두고 security group을 편집한다. 22번 포트는 SSH, 즉 터미널로 접근할 수 있는 포트번호다.
웹 서버가 작동하고 있는 8080번 포트를 inbound rules에 추가해야 한다.
```

```
인바인드 규칙 편집을 클릭하고 기존 SSH 인바운드 규칙 밑의 규칙 추가를 눌러서 새로운 인바운드 규칙을 추가한다.
-Port Range : 8080
-Source type : Anywhere-IPv4
규칙을 입력하고 규칙 저장을 누른다.
```

```
복사해둔 EC2 인스턴스의 퍼블릭 public IPv4 address 주소를 http://복사해둔주소:8080 으로 접속하면 개발한 백엔드의
내용을 볼 수 있습니다.
gitlab-ci를 이용해서 백엔드 서버를 배포하는 방법을 알게 되었습니다.
```