Google App Engine 환경에 Spring Boot 배포하기

서버|2017. 8. 9. 17:58

까페24에서 서버 호스팅을 받다가 구글 클라우드 플랫폼으로 이전하기 위해 학습한 내용을 정리한다.

Google App Engine에 Spring Boot 애플리케이션을 배포해보자.


배포를 위해 사용한 환경은 다음과 같다.

1
2
3
IDE : IntelliJ
Application : Spring Boot (Java 8)
Platform : Google App Engine Flexible environment and Container Engine
cs


1. 구글 클라우드 플랫폼에서 프로젝트 생성


https://console.cloud.google.com 접속한 후 새로운 프로젝트 생성

구글 클라우드 플랫폼에서 신규 프로젝트를 생성한다.

 > 페이지 상단의 "프로젝트 선택" 클릭

 > 팝업 레이어에서 신규 프로젝트 생성 버튼 클릭

 > 새 프로젝트 이름을 넣은 후 "만들기" 클릭 


구글 앱 엔진을 사용하기 위해서는 프로젝트가 존재해야 한다.

구조화를 해보면 다음과 같이 되어 있다.

Project

 - App Engine

 - Compute Engine

 - Container Engine



2. 구글 클라우드 결제 설정


https://console.cloud.google.com/project/_/settings

결제 가능한 카드를 등록해야 한다.

나는 무료 크레딧 300달러 받아서 사용 중이다. (1년 사용 가능)

참고로 무료 크레딧을 받더라도 결제 가능한 카드는 등록해야 한다.



3. Google Cloud SDK 로컬 머신에 설치


https://cloud.google.com/sdk/ 접속 후 설치 진행

SDK 설치가 완료되면 command 명령창에서 gcloud init 입력하여 다음의 절차 진행

 - 로그인 할거냐고 물어봄

 - 웹 브라우저가 뜨고 구글 로그인 진행하면 됨

 - 프로젝트 선택 리스트 노출. 원하는 번호 선택



4. Java를 위한 SDK 컴퍼넌트 추가 설치


자바로 개발되어진 애플리케이션을 배포하기 위해서는 구글 SDK에 추가 컴퍼넌트가 필요하다.

command 명령창에서 다음의 명령어 실행

# gcloud components update app-engine-java

# gcloud components update



5. 스프링 부트 애플리케이션 준비


이건 알아서 설정하기



6. app.yaml 작성


배포를 위해서는 스프링 부트 프로젝트에 app.yaml 파일이 존재해야 한다.

src/main/appengine/app.yaml 위치에 파일 생성

1
2
3
4
5
6
7
8
9
10
service: default
runtime: java
env: flex
    
manual_scaling:
  instances: 1
  
resources:
  cpu: 1
  memory_gb: 1.5
cs



service: default

앱 앱진 플랫폼에 배포되는 서비스 이름이다. 처음 앱 엔진에 애플리케이션을 배포한다면 default로 되어 있어야 한다. 이후에는 servie: nkServce1 과 같이 설정하여 배포 가능하다.

다음처럼 서비스가 되는 구조이다.

Project

 - Google App Engine

  - 서비스

   - default (필수)

   - nkService1

   - nkService2


runtime : java

자바이용


env: flex

스프링 부트를 배포하기 위해서는 flex 설정으로 되어 있어야 한다.

standard 버전도 존재하지만 servlet spec 2.5까지만 지원해서 flex 버전으로 설정해야 한다.

스프링 부트는 공식적으로 서블릿 2.5를 지원하지 않는다. 

단, 지원을 안할 뿐이지 war 배포 방식으로 사용 가능하다.


서블릿 2.5를 지원하는 스프링 부트 설정에 대해서 설명되어져 있다.

https://github.com/dsyer/spring-boot-legacy


flex 버전에 대한 설명

스프링 부트 애플리케이션이 Google Compute Engine 서비스 위에 Docker 컨테이너로 동작

"Using the App Engine flexible environment means that your application instances run within Docker containers on Google Compute Engine virtual machines (VMs)"


instances: 1

인스턴스 한 개만 띄우겠다는 의미

만약 부하 분산이 필요하다면 여러 대의 인스턴스를 띄우면 된다. 나는 서비스를 위한 목적이 아니므로 1로 셋팅했다.



7. maven 플러그인 추가


메이븐 플러그인을 이용해 구글 앱 엔진에 배포가 가능하다.

1
2
3
4
5
<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>appengine-maven-plugin</artifactId>
    <version>1.3.1</version>
</plugin>
cs



8. 커맨드 명령창에서 다음의 설정 작업을 실행한다.


아까 생성한 프로젝트 이름을 넣어준다.

gcloud config set project {프로젝트ID}

ex) gcloud config set project nklee-project-12121212


지역 설정

https://cloud.google.com/appengine/docs/locations

gcloud app create --region=us-central


GCP 사이트에 접속해서 Google App Engine 서비스 생성 후 리전을 선택하는게 좋을 듯 하다.



9. 배포 및 애플리케이션 페이지 접속


마지막으로 인텔리J의 Maven Projects 윈도우를 통해 플러그인을 실행하면 된다.


빌드 및 배포가 완료되면 다음의 URL로 접속하자.

내가 만든 애플리케이션 페이지를 확인할 수 있다.

https://{프로젝트이름}.appspot.com


구글 클라우드 플랫폼 > project > App Engine > 서비스 메뉴에 접근하면 다음과 같이 default 서비스가 등록되어져 있다.



추가


배포 완료 후 페이지 접속했을 때 502 bad gateway 오류가 발생하면 리소스가 부족해서이다.

아래와 같이 메모리 설정을 늘려서 문제를 해결했다. default 메모리 설정은 600M 이다.

1
2
3
resources:
  cpu: 1
  memory_gb: 1.5
cs



참고


만약 새로운 프로젝트의 앱 엔진에 애플리케이션을 배포하고 싶다면 다음의 명령어들을 이용해서 설정 변경해주면 된다.


내 계정에 생성된 프로젝트 리스트

gcloud projects list


현재 상태의 설정

gcloud config list


프로젝트 변경 설정

gcloud config set project {프로젝트ID}


연결 계정 정보

gcloud auth list


GAE 정보

gcloud app describe



[참고 URL]

https://github.com/GoogleCloudPlatform/getting-started-java/tree/master/helloworld-springboot

https://cloud.google.com/appengine/docs/flexible/java/

https://cloud.google.com/appengine/docs/flexible/java/configuring-your-app-with-app-yaml

'서버' 카테고리의 다른 글

[Elasticsearch] 용어 정리  (0) 2017.11.29
Apache2 설치 (Ubuntu 16.04)  (0) 2017.09.15
[ElasticSearch] 윈도우 설치 및 기본 동작 이해  (4) 2017.08.31
EFK Stack 구축 using Docker compose  (0) 2017.08.24
kubernetes 정리  (2) 2017.01.12
Kubernetes 설치  (6) 2017.01.12
Docker 정리  (2) 2017.01.04
리눅스 컨테이너 (LXC)  (0) 2017.01.04

댓글()