-
[Azure] Spring Boot 프로젝트를 App Service에 배포하기스터디 & 프로젝트/Init Cloud 팀 프로젝트 2023. 2. 15. 18:09
개요
프로젝트를 진행하면서 외부에 인가 서버를 하나 노출시켜야 할 일이 생겼다.
서비스 로직을 위한 API 서버는 DB와 함께 도커라이징 되어 로컬호스트 환경이던 SaaS로 서비스 되던 배포 예정이었다.
다만, 일부 비즈니스 로직이 요구하는 기능이 인가를 받아서 해당 외부 Github API에서 데이터를 긁어온 후 처리해야 했다.
여기서 고민한 점이 있다.
기존에 Docker-compose로 관리하던 솔루션에 함께 묶어 배포할 것인가?
아니라면 클라우드에 SaaS 형태로 배포할 것인가?
전자의 경우, 인가에 필요한 클라이언트 비밀 값을 함께 묶어서 배포해야 했다. 이 부분이 제일 맘에 들지 않았다.
후자의 경우, 무조건 아웃바운드로 외부망을 타야 했다.
선택
여기서 후자를 선택하게 되었는데 그 이유는 다음과 같다.
1. Github API 접근 자체가 아웃바운드를 탄다.
지금 노출시키려는 인가 서버는 무조건 인터넷 상의 원격 저장소에 접근한다.
어차피 원격 저장소를 타는 것 자체가 내부망에서 해결할 수 없다는 것이다.
2. 로컬 저장소를 사용하는 경우에만 내부 인가서버를 포함시키면 된다.
현재 기능 상으로 로컬 저장소를 지원하지 않는다.
하지만 Gitlab 오픈 소스 같이 사용처 내부망의 저장소를 활용할 경우도 있겠다 싶었다.
이런 경우에는 자체적으로 인가서버를 넣어 클라이언트 비밀 값을 활용해도 사용처 자체의 비밀 값이기에 내가 관리할 필요가 없었다.
3. 고민하는 것보다 제일 쉬운 접근부터 하자.
위 두 가지는 그냥 이런 저런 핑계라고도 볼 수 있는데 그냥 개발 제약 사항이 적고 익숙한 API라서 그냥 후딱 만들었다.
Azure 활용 하기
사실 나는 클라우드를 써본 경험이 적다.
아주 없지는 않지만 그냥 안쓰는 컴퓨터 하나 가져다가 리눅스 올려놓고 쓰려니 혼자 공부하고 개발하기에는 돈도 안들고 좋더라.
더군다나 AWS 프리티어가 살아있을 때에는 진짜 IDE 세팅 하나 제대로 못하는 답 없는 상태였다.
지금도 밥벌이 제대로 못하는건 똑같지만 그래도 그때보단 이것 저것 해봐서 그런지 이런 것도 고려할 수 있었다.
이제 마지막 남은 Azure 무료체험을 쓸 때가 됐다.
3가지 고민이 나왔다.
VM을 올릴 것인가? 앱 서비스를 활용할 것인가? Function을 활용할 것인가?
VM은 빠르게 포기했다. 후에 SaaS로 배포할 때 사용하기 위해서다.
앱 서비스 vs Function은 좀 선택하기 힘들었다.
앱 서비스의 경우 F1 무료 플랜이 존재하나 하루 가동 시간이 한 시간이라는 큰 제약이 있었다.
Function의 경우 지금 도커로 빌드해놓은 인가API를 스프링 클라우드 의존성 넣고 Function 환경 맞게 포팅하려니까 코드를 다시 짜야했다.
이런저런 고민 끝에 앱 서비스를 활용하기로 했다.
어차피 무료 크레딧도 조금 주니까 나중에 업스케일링 하면 되겠다 싶었지.
App Service
아까 말한 것처럼 나는 클라우드 인프라를 제대로 활용해본 경험이 적다.
앱 서비스 하나 올리는데 뭐 이렇게까지 글을 쓰냐 싶은데 그냥 하나 둘 적으면서 VPC 설정하고 뭐 하고 하는거 좀 기억하고 배우고 싶어서다.
1. 앱 서비스 만들자.
위 콘솔에서 "만들기"를 클릭하면 아래 창으로 넘어간다.
기본 설정 해보자.
학생 무료체험 구독에 묶인 리소스 그룹을 하나 생성하고 앱 서비스가 제공하는 URL을 사용하기 위해 인스턴스 명을 적는다.
나는 코드를 직접 배포할게 아니고 도커 이미지를 묶을거니까 이 옵션도 설정해주고 리전까지 설정한다.
마지막으로 리눅스 플랜에서 무료플랜인 F1을 선택했다.
2. 도커 배포하기
나는 도커 컨테이너로 배포한다고 Docker 탭으로 넘어왔다.
먼저 단일 컨테이너로 배포할 것인지 Docker-compose로 멀티 컨테이너로 배포할 것인지 선택해야 한다.
어차피 앱 서비스 자체적으로 NGINX 세팅해주고, DB나 캐시도 필요 없으니까 단일 컨테이너로 선택했다.
이미지 소스는 어디 레지스트리에서 이미지를 끌고 올 것인지 결정한다.
뭐 Azure 레지스트리도 안쓰고 하니 도커 허브에서 끌고오자.
끌고올 이미지는 프라이빗 레지스트리가 아니라서 "공개"로 선택했고 이미지, 태그 선택한다.
환경 변수도 넘겨주려고 시작 명령에서 쉘 커맨드로 환경변수 넣었다가 나중에 뺐다.
위 설정 후에 검토 + 만들기 탭에서 서비스를 배포할 수 있다.
3. 설정하기
앞선 단계에서 환경 변수를 세팅하면 더 좋았겠지만 오타 이슈도 있었고 콘솔 창에서 이를 수정하는 방법을 찾질 못했다.
CLI로 배포하려고 az cli 설치도 했는데 결국 콘솔 쓰는 컴맹이 되어 버렸다.
좌측 메뉴에서 구성 -> 애플리케이션 탭을 누르면 위 사진 같이 설정 값을 세팅해줄 수 있다.
내 서비스에 필요한 설정 값과 "WEBSITES_PORT"를 함께 설정했다.
HTTP, HTTPS가 80, 443으로 돌다보니 이를 포트포워딩 해줘야한다.
나의 경우 스프링부트 프로젝트였고 톰캣 기본 포트를 변경하기는 했으나 톰캣으로 포워딩 해주지는 못했다.
그래서 이 설정을 추가해서 인바운드를 설정해주었다.
배포
위 설정까지 마친 후에 위 URL로 접근하면 이제 내가 원하는 앱 서비스를 활용할 수 있다.
'스터디 & 프로젝트 > Init Cloud 팀 프로젝트' 카테고리의 다른 글
[Spring Boot] 어떻게 DTO를 재구성할까? (0) 2023.03.20 [MariaDB] 인덱스로 성능 향상 체감하기 (0) 2023.03.03 [Swagger] NullPointerException 잡기 (0) 2023.02.23 [Spring Boot] Github OAuth 적용하기 (0) 2023.01.31