본문 바로가기

경험

[AWS] ubuntu ec2에 springboot&docker 배포

https://innovation123.tistory.com/191

 

[AWS EC2 / 배포] SpringBoot Project 배포, EC2 ubuntu, docker

들어가기 전에.. 배포를 하는 중에 워낙 여러 번 막히기도 했고, 그 과정이 모두 기억나지 않는다. 이 글을 쓰는 이유는 순전히 기록용이다. 중간중간에 빠지는 내용도 많을 것이고, 틀린 부분도

innovation123.tistory.com

 

위 블로그에서 잘 알려주고 있지만 내 환경에서 막힌 부분들이 있어 보충하기 위해 작성한다.

 

java 및 git 설치

sudo apt-get update

sudo apt-get install openjdk-17-jdk
java -version

sudo apt-get install git
git --version

 

SSH key 등록

cd ~/.ssh
ssh-keygen -t rsa -C (github 계정 이메일)

cat id_rsa.pub

 

복사된 key를 github > setting > SSH and GPG keys > New SSH key로 해당 값을 등록

 

Docker 설치

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
# key 등록 불가 에러 발생
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

기존 방식으로 키 추가 시 추가할 수 없다는 에러가 발생해 docker docs 최신 방식 사용

# docker docs 방식
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

 

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

출처 : https://docs.docker.com/engine/install/ubuntu/

 

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

도커 관련 패키지 모두 설치

 

설치 이후 docker ps 명령어 작성 시 오류 발생

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:

 

docker user 설정 부분의 오류로 확인되어 이 글을 통해 해결

$ sudo groupadd docker

$ getent group docker
#docker:x:999:

$ awk -F':' '/docker/{print $4}' /etc/group

우선 docker socket이 필요로 하는 엑세스 권한이 있는 docker group을 생성

 

sudo usermod -aG docker ubuntu

필요에 따라 user를 생성하거나 aws ubuntu ec2 최초 생성 user인 ubuntu를 사용하여 user를 부여

 

getent group docker
docker:x:999:ubuntu

awk -F':' '/docker/{print $4}' /etc/group
ubuntu

반드시 ec2를 중지한 후, 다시 실행하여 user가 추가되었는지 확인

재부팅 또는 exit 후 재접속만으로는 바뀌지 않는 것 같다.

 

sudo systemctl restart docker.service
sudo systemctl status docker.service

이후 docker를 재시작하여 잘 작동하는지 확인

 

 

git clone {github url}

cd {project}
chmod +x gradlew
./gradlew build

gradlew에 권한을 부여한 뒤 build 진행

 

build 진행 과정에서 ec2 강제 접근 종료 발생

이후 다시 접속하기 위해선 중지 이후 접속 가능

다시 빌드 진행해도 강제 종료가 발생

원인이 메모리 부족임을 확인

 

swap영역 생성을 통해 해결(요약)

// 128 * 16 약 2G 정도의 공간 확보
sudo dd if=/dev/zero of=/swapfile bs=128M count=16

// 읽기, 쓰기 권한 부여
sudo chmod 600 /swapfile

// Linux 스왑 영역 설정
sudo mkswap /swapfile

// 스왑 파일을 바로 사용할 수 있도록 스왑 공간에 스왑 파일을 추가
sudo swapon /swapfile

// 절차 성공 여부 확인
sudo swapon -s

// /etc/fstab 을 편집하여 부팅 시 스왑 파일 활성화
sudo vim /etc/fstab
-> /swapfile swap swap defaults 0 0

 

이후에도 build 실패가 계속 되었는데 아마 test 코드 부분을 수정하지 않아서 발생하는 문제라 생각된다.

#build.grable

tasks.named('test') {
    useJUnitPlatform()
}

build.grable에서 위 부분을 제거하면 정상적으로 build 되었다.

이후 database를 생성하지 않고 실행했다가 막힌 것 외에는 잘 배포되는 것을 확인

 

다음날 접속을 위해 vscode remote-ssh를 실행했는데 오류와 함께 연결할 수 없었다.

scp: failed to upload file vscode-cli-f1e16e1e6214d7c44d078b1f0607b2388f29d729.tar.gz.done to /home/ubuntu/.vscode-server

 

위 오류가 원인이라 생각하고 검색을 통해 해결방안을 조사했다.

그러던 중 mac openssh를 통해서는 잘 접속되는 것을 보고 디스크 용량 부족이 원인일 수 있다는 것을 알게 되었다.

 

df -h

위 명령어를 통해 확인해보니

 

EBS 용량 부족으로 인한 remote-ssh 연결 실패가 확인되었다.

해결을 위해 ec2 대시보드에서 볼륨에 들어가 EBS 용량을 8 -> 16으로 변경했다.

 

이후 인스턴스 중지, 재시작 하니

용량이 늘어난 것을 확인할 수 있었다.

 

vscode remote-ssh 또한 잘 작동한다.