사실 카테캠에서는 배포가 내 담당이 아니어서, 그리고 거기서는 다른 환경이기 때문에 사실상 내 첫 배포에 도전하는 과정이다! 가상머신 요금이 부담스럽기 때문에... 일단은 aws ec2 무료 버전을 사용했다. t2 micro, 30GB 라는 아주 소소한 시작으로! 해보는 첫 배포 일기
저 자그마한 ec2에서 자바 프로젝트를 빌드하고.. 배포하려면.. 너무 오래 걸린다!!! 실제로 해보니, m2 맥북이 얼마나 강력한지... 느낄 수 있었다. 맥북에서는 빌드 시간이 5초?도 안걸리던 반면, ec2에서는 1시간이 지나도 완료되지 않았다.
실제 1시간이 넘어도... 완료되지 않던 작업이 맥북에서는 단 5초도 안걸리는 마법... 아마 가장 기본 모델은 vCPU 1개와 1GB 램으로 구성되어 있는데, 아마 램이 부족해서 그런 것 같다. 이 문제는 추후에 Spring Boot Application을 실행할 때 작동을 하지 않아 swap 메모리를 늘리니 해결되었다.
아무튼!그래서 맥북에서 빌드 후 Docker(도커)를 통해 이미지를 업로드, ec2에서는 이미지를 pull 후에 컨테이너를 띄우는 것만 했다. 이걸 통해 도커가 얼마나 강력한지... 느낄 수 있었다. 그리고 Apple Silicon 칩셋이 얼마나 강력한지도!!
아무튼,
맥북에서 빌드 후
$ docker buildx build --push --platform linux/amd64 -t seokjun0915/see-realview-backend:1.0 .
를 통해 빌드를 진행했다. 이때, --platform linux/amd64를 꼭 넣어야 한다!! 애플 실리콘 칩셋에서 빌드를 하고 실행은 ec2에서 진행하기 때문에 빌드 옵션을 무조건 추가해야 다른 플랫폼에서 실행할 수 있다.
이후 docker-compose.yml 파일을 작성해보자.
version: "3.7"
services:
see-realview-backend:
container_name: see-realview-backend
ports:
- "8080:8080"
image: seokjun0915/see-realview-backend:1.0
volumes:
- see-realview-images:/app/see-realview/images
networks:
- see-realview-net
links:
- see-realview-db
- see-realview-redis
depends_on:
see-realview-db:
condition: service_healthy
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://see-realview-db:3306/see-realview?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useLegacyDatetimeCode=false
SPRING_DATASOURCE_USERNAME: {유저!!}
SPRING_DATASOURCE_PASSWORD: {비밀번호!!}
{여기에 추가로 필요한 환경변수들}
see-realview-db:
container_name: see-realview-db
image: mysql:8.0.33
restart: always
volumes:
- mysql_volume:/app/mysql
environment:
- MYSQL_ROOT_PASSWORD=ms38559851!
- MYSQL_DATABASE=see-realview
ports:
- "3306:3306"
networks:
- see-realview-net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
see-realview-redis:
container_name: see-realview-redis
image: redis:latest
hostname: redis
expose:
- 6379
ports:
- "6379:6379"
labels:
- "name=radis"
- "mode=standalone"
extra_hosts:
- host.docker.internal:host-gateway
networks:
- see-realview-net
networks:
see-realview-net:
driver: bridge
volumes:
mysql_volume:
driver: local
see-realview-images:
driver: local
이렇게 작성했다. db, application, redis를 묶어주기 위한 네트워크를 추가하고, 볼륨을 별도로 설정해주고, 환경변수를 주입해주었다. 사실 하나하나 자세히 찾아보고 작성한 내용이 아니라 .. 추후 도커 공부를 더 해야겠다!
그리고 ec2에 접속하여
$ docker-compose up
를 실행하면 끝!!! 여러 오류가 진짜 많았다... redis 호스트 문제, mysql 연결 문제, api 경로 설정 문제 등등 .... 처음엔 로그가 없어서 정말 불편했는데, 왜 로그를 많이 남기라고 하는지 알 수 있었다 ㅠㅠㅠㅠ 없으면 ..... 버그 픽스가 불가능 ....
그리고 ec2 아이피로 접속을 해보자
정상적으로 작동한다!!!
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon -s
$ sudo vim /etc/fstab
$ /swapfile swap swap defaults 0 0
host.docker.internal
로 설정해야 한다.spring.jpa.databse: mysql
를 추가해야 한다.WebClient
를 사용해보자WebClient
configuration을 할 때, 아래처럼 버퍼 재설정 코드를 추가해보자public WebClient imageWebClient() {
return WebClient.builder()
.exchangeStrategies(ExchangeStrategies.builder()
.codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(100 * 1024 * 1024))
.build())
.build();
}