GCP 가상머신으로 웹 서버 만들기 (협업을 위한 환경)

2021. 2. 17. 23:16IT 공부/GCP

 

 

1. 회원가입 및 시작

 

(1) https://cloud.google.com/ 에서 회원가입 후 로그인한다. (새 구글계정 만들어도 됨)

   300달러의 크레딧이 제공되며 일정 한도까지는 무료로 사용할 수 있는 서비스가 있다. 

   [참고] https://cloud.google.com/free?hl=ko

   직접 유료 계정으로 전환하지 않는 한 300달러 소진 후에도 과금되지 않기 때문에 가입시 카드 정보 입력해도 괜찮다.

   상단에 가끔 나타나는 "활성화" 버튼을 절대 클릭하지 않도록 조심한다. 

 

(2) https://console.cloud.google.com/ 에서 로그인하면 대쉬보드가 보이는 콘솔로 접속된다. 

    https://cloud.google.com/ 에서는 우측 상단의 "콘솔" 을 클릭하면 된다. 

 

(3) 상단의 "Google Cloud Platform" 글씨 옆을 클릭하여 새 프로젝트를 만든다

    프로젝트명에 따라 자동생성되는 프로젝트ID는 전세계적으로 유일해야 하므로 중복일 경우 숫자가 붙기도 한다. 

    (별 상관 없음)

 

(4) 프로젝트 생성에 약간의 시간이 소요된다. 

 

 

(5) 상단의 "Google Cloud Platform" 글씨 옆을 클릭하여 새로 생성한 프로젝트로 변경한다. 

 


2. 서버로 사용할 가상머신 만들기

 

(1) 좌측 상단 햄버거 메뉴를 통해 모든 서비스를 오갈 수 있다. 

 

(2) 가상머신을 생성하기 위해 "Compute Engine" 을 선택한다. 

 

(3) "만들기"를 클릭하여 가상 컴퓨터의 옵션을 설정하고 가상머신을 생성한다. 

<리전>   속도 개선을 위해 서울 리전 선택 (영역은 아무거나 상관없음)
<머신구성>
  서버를 상시 구동하기 위해 가장 저렴한 모델인 N1 시리즈의 f1-micro 유형 선택
<부팅 디스크>   환경설정이 용이한 Ubuntu 16.04 LTS 로 OS 선택
<ID 및 API 액세스>   모든 Cloud API에 대한 전체 액세스 허용
<방화벽>   HTTP, HTTPS 트래픽 허용
<관리,보안,디스크,
네트워킹,단독임대>
-  <네트워킹>
  네트워크 인터페이스의 default 클릭 - 외부IP - IP 주소 만들기 - 고정 IP를 예약하도록 변경
  ( 고정X 일 경우 가상머신 켤 때마다 IP 바뀜)

 

(4) 약간이 시간이 소요된 후, 가상머신이 생성된 것을 확인할 수 있다. 

 

(5) 외부IP를 사용하여 도메인주소를 만들 수 있다. 

    [참고]  blog.dalso.org/it/google-cloud-platform/5735

http://sachawon.duckdns.org:8080/
http://4d-car.duckdns.org:8080/

-> 8080 포트 번호 없이 DNS만으로 접속하려면 httpd 등으로 별도 설정해줘야 한다. 


3. 프로젝트 전체에 적용할 방화벽 설정하기

 

(1) 햄버거 메뉴를 통해 "VPC 네크워크" - "방화벽" 서비스로 들어간다. 

 

(2) "방화벽 규칙 만들기"를 클릭하여 8080 포트에 대한 규칙을 만든다. 

     같은 방식으로 80포트와 mariaDB에서 사용할 3306포트에 대한 규칙도 만든다. 

 


4. 가상머신을 웹서버로 만들기 (JAVA 및 Tomcat 설치)

 

(1) VM인스턴스 목록에서 SSH로 접속한다. 

 

(2) 비밀번호 설정 후 root 계정으로 변경하여 opt 디렉토리로 이동한다. 

(1) sudo passwd 입력
(2) 비밀번호 2번 입력
(3) su 입력
(4) 비밀번호 입력
(5) cd /opt

 

(3) apt 패키지의 인덱스 업데이트 후 yum을 설치한다.   -------- 안 해도 무방함

(1) apt update                    (apt-get update 또는 sudo apt update 도 가능)
(2) apt install yum               (웹 서버에 필요하진 않지만 미리 설치)
(3) yum update
(4) which yum                     (yum 설치 확인)
(5) yum repolist                  (yum 저장소 확인, 0일 경우 yum 사용이 안 됨)

3단계에서 repo(저장소)가 없다고 에러가 발생할 때

[참고] gogoonbuntu.tistory.com/17

 

(4) wget이 설치되어있는지 확인, 미설치시 root 계정에서 설치한다. 

(1) which wget
(2) apt install wget

 

(5) tomcat9 를 설치 전 JAVA를 먼저 설치 후 환경변수 파일을 연다. 

    [참고] lsjsj92.tistory.com/394

(1) java -version                 (현재 설치된 내역이 없을 경우, 설치 가능한 패키지를 보여줌)
(2) apt install openjdk-8-jdk
(3) java -version                 (설치 확인)
(4) readlink -f /usr/bin/javac    (링크 경로를 확인 --- /usr/lib/jvm/java-8-openjdk-amd64/bin/javac)
(5) vi /etc/profile               (환경변수 설정 파일 열기)

 

(6) 다음 내용을 fi 아랫줄에 추가한다. 

# 자바 환경변수 설정
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JAVA_OPTS=-Dfile.encoding=UTF-8
export PATH=$JAVA_HOME/bin/:$PATH
export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH

 

(7) 환경변수를 적용 후 반영되었는지  확인한다. 

(1) source /etc/profile
(2) echo $JAVA_HOME                  ( /usr/lib/jvm/java-8-openjdk-amd64 확인 )
(3) $JAVA_HOME/bin/javac -version    ( javac 1.8.0_282 확인 )

 

(8) tomcat9 를 설치한다. 

(1) https://tomcat.apache.org/ 접속
(2) 좌측 메뉴에서 tomcat9 다운로드 클릭
(3) Core의 tar.gz 우클릭 - 링크주소 복사
(4) wget 으로 해당 링크에서 파일 다운로드
    wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz
(5) 다운 받은 파일 확인 - ls
(6) 압축 해제
    tar zxvf apache-tomcat-9.0.43.tar.gz

또는
(1) wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.39/bin/apache-tomcat-9.0.39.tar.gz
(2) tar zxvf apache-tomcat-9.0.39.tar.gz

 

 

(9) tomcat9 설치경로의 bin 디렉토리로 이동 후 startup.sh 파일을 실행한다. 

(1) cd apache-tomcat-9.0.43/bin/     ( 또는 cd apache-tomcat-9.0.39/bin/ )
(2) ./startup.sh                     ( Tomcat started. 확인 )

 

(10) 8080 포트로 외부 IP 접속시 탐캣 index 페이지가 나타남을 확인할 수 있다. 

 

 

(11) 서버 시간이 세계시로 되어 있으므로 한국/서울 시간으로 바꿔준다.  (root 계정으로 진행)

sudo -i
date
more /etc/timezone
dpkg-reconfigure tzdata
'Asia/Seoul'
date

 

[ 참고 ]

https://blog.hangyeong.com/1013

 

 


5. 가상머신에 mariaDB 설치하기

 

[캡처는 kaikaikai.tistory.com/78 참고]

 

 

(1) mariaDB 설치 전 키를 얻고 저장소 추가하기 (Ubuntu 의 경우)

(1) apt install software-properties-common gnupg-curl
(2) apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
(3) add-apt-repository 'deb [arch=amd64,arm64,i386,ppc64el] https://mirror.yongbok.net/mariadb/repo/10.5/ubuntu xenial main'

 

(2) mariaDB 설치 및 실행하기

(1) apt update
(2) apt install mariadb-server 
(3) service mariadb start
(4) service mariadb status    ( 입력 후 active 상태면 정상적으로 설치된 것 )

1단계에서 " MalMalformed entry 58 in list file /etc/apt/sources.list (URI parse) " 에러가 발생할 경우,

vi 에디터로 파일을 열고, 해당되는 58라인을 주석처리 후 저장한 뒤 다시 수행한다. 

[참고] jwkim96.tistory.com/115

(1) sudo vi /etc/apt/sources.list
(2) esc로 명령모드 진입 후 :set nu   (라인 수 확인)
(3) :58                            (58라인으로 이동)
(4) :wq                            (저장 후 종료)

 

(3) 일반사용자 계정으로 전환 후 mariaDB에 접속하기

(1) exit
(2) sudo mysql -u root
(3) exit;

 

(4) 외부 사용자(팀원)가 mariaDB에 접속할 수 있도록 외부접속을 허용하기

(1) netstat -lntp                      (첫 라인에서 3306 포트의 ip가 127.0.0.1 고정 상태)
(2) sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf 
(3-1) 30라인의 bind-adress = 0.0.0.0 으로 변경 
(3-2) 22라인 다음에 기본 언어셋 설정을 위해 2줄 추가 후 저장 :wq
      character-set-server = utf8mb4
      collation-server = utf8mb4_unicode_ci
(4) sudo /etc/init.d/mariadb restart   (mariaDB 재시작)
(5) netstat -lntp                      (3306 포트의 ip가 0.0.0.0 인지 확인)

[참고] mariaDB 언어셋

blog.naver.com/msjang4/221318463468

[참고] mariaDB 보안설정을 추가하려면

kaikaikai.tistory.com/71 에서 mariaDB 설치 (6)부터 확인

 

(5) 파이썬에서 사용하는 root 계정이 모든 ip 로부터 접속 후 DB사용할 수 있도록 허용하기

(1) sudo mysql -u root
(2) grant all privileges on *.* to 'root'@'%' identified by 'admin1234' with grant option;

 

[참고]

myybean.tistory.com/37

blog.dalso.org/it/4260

linuxhint.com/expose_mysql_server_internet/


6. PuTTy로 SSH 외부접속 환경 만들기 

 

(1) PuTTygen 실행 후 RSA 키를 생성한다. (PuTTy 아님!!)

(1) Generate 클릭 하고 네모난 화면에 마우스 휘적휘적 움직이면 초록바 차오름
(2) Key comment 에 SSH 접속시 사용하고 싶은 아이디 적기
(3) Key passphrase 에 비번 적기 
(4) Save private key 클릭
(5) 저장할 파일명 지정하기                 -> PuTTy 접속시 사용할 예정
(6) 블라블라 엄청 길게 생겨난 Key 를 복사  -> 팀원의 경우 GCP프로젝트 소유자에게 Key 전달

[참고] https://newpower.tistory.com/192

 

(2) GCP의 VM 인스턴스에서 메타데이터에 복사해둔 SSH 키를 붙여넣고 저장한다. 

 

(3) PuTTy 실행 후 세션 정보를 설정한다. 

(1) 좌측 Category - Connection - SSH - Auth 클릭
(2) 위에서 저장한 Key 파일을 로드
(3) 좌측 Category - Connection - Data 클릭
(4) Auto-login username에 PuTTyGen에서 만든 로그인 ID를 입력 (Key Comment)
(5) 좌측 Category - Session 클릭
(6) Host Name 에 가상머신의 고정IP 주소를 입력 (Port는 22로 유지)
(7) 저장할 세션명을 입력 후 Save 클릭

 

(4) 이후부터는 해당 세션정보 load 후 open을 클릭하면 바로 비밀번호(Key passphrase) 입력 후 SSH 접속이 가능하다. 

 

 


7. 이미지 파일을 저장 할 스토리지 만들기

 

(1) GCP 햄버거 메뉴에서 "스토리지" 를 선택한다. 

 

(2) "버킷 만들기"를 클릭하여 생성할 버킷 정보를 입력한다. 

 

(3) 생성된 버킷의 이름을 클릭 - "권한" 클릭

(4) "추가" 클릭

(5) 자동완성되는 "allUsers"를 새 구성원으로 추가 - "Cloud Storage - 저장소 개체 뷰어"를 역할로 추가 - 저장

    (+) "저장소 관리자", "저장소 개체 관리자"까지 추가해줘야 누구나 스토리지에 업로드할 수 있다. 

 

(6) 팝업창의 공개 액세스 허용 클릭

 

(7) 파일 업로드시 공개 접속 가능한 URL이 생성된다.

 


8. 클라우드 스토리지의 접속권한 허용하기

 

(1) 햄버거 메뉴의 IAM 및 관리자 - 서비스 계정 클릭

 

(2) 상단의 "서비스 계정 만들기" 클릭

 

(3) "서비스 계정 이름, 서비스 계정 설명" 작성 후 "만들기" 클릭

 

(4) 클라우드 스토리지를 사용하기 위한 역할을 추가한다. 

 

(5) 완료 클릭

 

(6) 생성된 계정 오른쪽의 "작업" 메뉴 (점 3개)를 클릭 - "키 만들기" 클릭 - json 선택 - "만들기" 클릭

 

(7) json 키가 다운로드 된다. 

 

 

 

[ 참고 ] 

https://jyami.tistory.com/54

https://guitaryc.tistory.com/30

https://blog.naver.com/varkiry05/222077908011

 

 


9. 웹페이지와 가상머신 내 mariaDB 연동 - 입출력 

 

 

(1) 간단판 웹 웹피이지가 될 jsp 파일을 만든다. 

1. 구글클라우드 환경에서 War파일로 Web App 서비스하기 </br>
2. Web App에서 입력한 데이터를 mariaDB에 입력하기 </br>
3. mariaDB의 데이터를 Web App에서 출력하기 </br><br/>

<hr/><br/>

<form action='iodata.jsp' method='get'>
	<table>
		<tr>
			<td>이름 : </td>
			<td><input type='text' name='itext'/></td>
		</tr>
		<tr>
			<td>숫자 : </td>
			<td><input type='text' name='inumber'/></td>
		</tr>
		<tr>
			<td colspan='2'><input type='submit' value='전송'/></td>
		</tr>
	</table>
</form>

<!-- 데이터 출력 -->
<table border="1">
	<% for(ioVO vo : volist) { %>
	<tr>
		<td> <%= vo.getItext() %> </td>
		<td> <%= vo.getInumber() %> </td>
	</tr>
	
	<% } %>
</table>

 

(2) VO와 DAO를 비롯한 페이지를 만들되, DB연결시 다음 코드를 사용한다. 

// DB 연결에 관한 변수
private static final String dbDriver = "org.mariadb.jdbc.Driver";
private static final String dbUrl = "jdbc:mysql://가상머신IP:3306/mariaDB의 데이터베이스명";
private static final String dbUser = "root";
private static final String dbPass = "admin1234";

 

(3) Spring Legacy Project의 경우 pom.xml 에 다음 메이븐 의존성을 추가한다. 

<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.7.1</version>
</dependency>

[ 참고 ]

https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client

https://dotheright.tistory.com/164

 

 

(+) 단순 Dynamic Web Project의 경우 WEB-INF / lib 위치에 mariadb-java-client-2.3.0.jar 파일을 추가한다.

mariadb-java-client-2.3.0.jar
0.56MB

[ 참고 ]

https://it-mentoring.tistory.com/entry/Model2-기반의-간단한-Dynamic-Web-Project-구축하기

https://dololak.tistory.com/762

 

(4) 프로젝트에 대해 메이븐 업데이트를 진행한다. 

 


10. 웹페이지와 GCP 내 클라우드 스토리지 연동 - 입출력

 

(1) src/main/resources 아래에 8단계의 서비스 계정 생성시 다운받은 json 파일을 넣는다. ---- 필요 없음

 

(2) 같은 위치에 application.properties 파일 생성 후 다음을 입력한다.  ---- 필요 없음

# application.properties

spring.cloud.gcp.storage.credentials.location=classpath:sachawon-54674da1b51d.json

 

(3) Spring Legacy Project의 경우 pom.xml 에 다음 메이븐 의존성을 추가한다. 

<!-- https://mvnrepository.com/artifact/com.google.cloud/google-cloud-storage -->
<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-storage</artifactId>
    <version>1.111.2</version>
</dependency>

[ 참고 - 임의로 버전 결정했음 ] 

https://mvnrepository.com/artifact/com.google.cloud/google-cloud-storage

https://jyami.tistory.com/54

 

(4) 프로젝트에 대해 메이븐 업데이트를 진행한다. 

 

(5) ioDAO.java 에서 필요한 모듈을 임포트한다. 

import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.BlobInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

 

(6) 이미지 파일을 업로드하는 함수 insertImg 를 작성한다. 

public void insertImg (String projectId, String bucketName, String objectName, String filePath) throws Exception{

	Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
	BlobId blobId = BlobId.of(bucketName, objectName);
	BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("image/png").build();
	storage.create(blobInfo, Files.readAllBytes(Paths.get(filePath)));
	
	System.out.println("File " + filePath + " uploaded to bucket " + bucketName + " as " + objectName);		
}

[ 참고 ] 

https://cloud.google.com/storage/docs/reference/libraries#client-libraries-usage-java

 

(7) index.jsp 파일에서 첨부파일을 업로드하는 코드를 작성한다. 

<form methos="post" action="iofile.jsp" encType="multipart/form-data">
	첨부파일 : <input type='file' name="file"/> <br/>
	파일명 지정 : <input type="text" name="filename"/><br/>
	<input type="submit" value="업로드"/>
</form>

 

(8) pom.xml에 파일 업로드를 위한 commons-fileupload 의존성을 추가한다. 

<!-- 파일업로드 -->
<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.3</version>
</dependency>

 

(9) 이미지 파일을 보여줄 iofile.jsp 를 생성한다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import='com.mariaIO.*' %>
<%@	page import='java.io.File' %>

<%
	// 이전 화면에서 사용자 입력값 얻어오기
	request.setCharacterEncoding("utf-8");
	String filePath = request.getParameter("file");
	String fileName = request.getParameter("filename");

	// ioDAO 객체 얻어오기
	ioDAO dao = ioDAO.getInstance();
	dao.insertImg(fileName, filePath);
	
	String fileUrl = "https://storage.googleapis.com/car_image_for_analysis/" + fileName;
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 입력</title>
</head>
<body>

<a href="index.jsp">이전 화면으로</a>
<br/><br/>
성공적으로 입력되었습니다. 
<br/><br/>

파일주소 : <%= fileUrl %><br/> 
<img src="<%= fileUrl %>"/>

</body>
</html>

 

 

(10) 결과 페이지

 

 

[ 참고 ]

https://cloud.google.com/storage/docs/uploading-objects#storage-upload-object-java

https://stackoverflow.com/questions/53058801/cloud-storage-files-content-type-is-showing-as-data-when-a-image-is-uploaded

 

(11) war 파일로 export 한다. 

 

 


11. 가상머신에 war 파일 업로드 후 웹페이지에서 이용하기

 

(1) 서버가 설치된 가상머신의 SSH로 접속한다. 

 

(2) 우측 상단 톱니바퀴 모양을 클릭하여 war 파일을 업로드한다. 

[참고]

https://cloud.google.com/compute/docs/instances/transfer-files?hl=ko

 

(3) 업로드한 파일은 /home/$USER 디렉토리에 들어있으므로, tomcat9 디렉토리로 옮겨온다. 

cd /home
cd 유저명
mv mariaLegacy.war /opt/apache-tomcat-9.0.39/webapps/mariaLegacy.war

 

(4) 가상머신주소ip:8080/프로젝트명/index.jsp 로 접속할 수 있다. 

 


12. 리눅스 가상머신에 파이썬 설치하기

 

(1) 기존 가상 머신은 Ubuntu 16.04 LTS 을 사용하므로 파이썬이 기본적으로 3.5가 설치되어 있다. 

 

(2) 파이썬 3.6 버전으로 업그레이드 하는 과정이 복잡하므로 가상머신을 따로 하나 더 만든다. 

    ★ Ubuntu 18.04 LTS 는 파이썬 3.6 이 기본적으로 설치되어 있음!!

 

(3) 가상머신 설치 후 아래 블로그를 참고하여 파이썬을 설치한다. 

[참고]

austcoconut.tistory.com/entry/%EB%AC%B4%EC%9E%91%EC%A0%95-%EB%94%B0%EB%9D%BC-%ED%95%98%EA%B8%B0-LinuxUbuntu%EC%97%90%EC%84%9C-Python-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-python3-%EC%84%A4%EC%B9%98-pip-%EC%84%A4%EC%B9%98

 


13. 리눅스 가상머신에 주피터노트북 설치하기

 

(1) 주피터노트북을 위해 GCP의 VPC 네트워크에서 8888 포트에 대한 방화벽을 열어준다. 

 

(2) 다음 블로그를 참고하여 주피터 노트북을 설치, 실행한다. 

austcoconut.tistory.com/entry/%EB%AC%B4%EC%9E%91%EC%A0%95-%EB%94%B0%EB%9D%BC-%ED%95%98%EA%B8%B0-LinuxUbuntu%EC%97%90%EC%84%9C-Jupyer-Notebook-%EC%84%9C%EB%B2%84-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95?category=1085659

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형