Side Project

[GCP] 서버 환경 구축

hj_. 2020. 2. 13. 15:27

'스프링 부트와 AWS로 혼자 구현하는 웹서비스' 책을 보며 공부하고 있는데,

개인적으로는 AWS보다는 GCP가 끌려서 다른 클라우드로 접근해 실습해보았다.

(그냥 구글이 끌렸다..ㅋㅋ)

 

[Local PC Environment]

- OS : Windows 10

- Prerequsite : PuTTY, PuTTY Gen

[VM Instance Environment]

- Hardware

n1-standard-1(vCPU 1, 3.75GB 메모리)

물리디스크 SSD 30GB

- OS

Ubuntu 18.04 LTS

- Firewall(방화벽)

HTTP & HTTPS 트래픽 허용

- Cloud API Access 범위

모든 Cloud API에 대한 전체 액세스 허용

 

1. PuTTY로 생성한 VM에 접속하기

    1-1. PuTTY SSH Key Delete : 생성한 VM Instance의 외부 IP주소가 SSH Key로 생성되어있는지 확인 후 삭제 한다.

    ( Command Line > regedit > 경로 - HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys )

 

 

    1-2. PuTTY Public & Private Key 생성 

        1-2-1. Generate : Public & Private Key 생성

        1-2-2. Login 할 계정 ID 입력 (GCP 로그인 계정 ID)

        1-2-3. Save Private Key 저장

 

 

    1-3. VM Instance에 생성한 Public 키 등록 : [Compute Engine] > [메타 데이터] > [SSH 키] > 항목 추가 및 저장

 

 

    1-4. PuTTY로 GCP VM 접속하기 : IP 입력 후 Open 클릭전 아래 Save Session으로 저장해두면 재접속에 용이하다.

    ( 접속시 로그인 ID는 Public Key 생성 시 입력한 Key Comment [구글 ID로 등록했었음] 입력하면 된다. )

 

Local PC에서 PuTTY로 GCP VM 접속하기 성공 !

 

2. openJDK 8 version 설치

접속한 GCP VM에서 수행한다.

 

92phantom@webservice:~$ sudo apt-get update

[openjdk 8 install]
92phantom@webservice:~$ sudo apt-get install openjdk-8-jdk -y

[jdk & compiler 정상 설치 확인]
92phantom@webservice:~$ java -version

* 예상 출력값
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-8u242-b08-0ubuntu3~18.04-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

92phantom@webservice:~$ javac -version

* 예상 출력값
javac 1.8.0_242

 

(Optional) 기존에 다른 버전 jdk가 있다면, 아래 java config를 새로 설치한 openjdk 8 으로 선택해주면 된다.

92phantom@webservice:~$ update-alternatives --config java

 

3. 시스템 Datetime, 한국 시간으로 변경

    3-1. 현재 등록된 시간 확인

92phantom@webservice:~$ date

* 예상 출력값
Wed Feb 12 05:34:57 UTC 2020

 

    3-2. 현재 등록된 시간 삭제 및 한국 시간 등록

[등록된 localtime 삭제]
92phantom@webservice:~$ sudo rm/etc/localtime

[한국 시간을 localtime으로 등록]
92phantom@webservice:~$ sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

92phantom@webservice:~$ date

* 예상 출력값
Wed Feb 12 14:36:04 KST 2020

 

4. hostname /etc/hosts에 등록

/etc/hosts 파일은 호스트의 주소를 찾을 때 가장 먼저 검색하는 곳이다.

 

이걸 굳이..? 왜? 라는 생각을 했는데,,, 등록하지 않아 발생한 우아한 형제들 Billing System에서 사례이다.

 

[mysql unauthenticated user]

2016-12-08 18:00:55 xxxx [Warning] Aborted connection 37170 to db: ‘unconnected’ user: ‘unauthenticated’ host: ‘xxx.xxx.xxx.xxx’ (Unknown error)

MySQL(Mariadb)은 새로운 커넥션 요청이 있을 때 인증을 위해 클라이언트의 IP 주소를 통하여 hostname이 host_cache 테이블에 있는지 확인합니다. 만약 없거나 인증 flag가 false라면 IP 주소로 hostname을 알아내는 과정을 거치게 됩니다. 이때 오류가 발생하거나 시간이 오래 소요되어 너무 많은 클라이언트가 연결에 성공하지 못하면 해당 호스트의 추가 연결을 차단하게 됩니다.

 

즉, 사용자 결제 요청이 급증할 때 hostname을 제대로 명시해두지 않을 경우 IP주소로 hostname을 알아가는 과정을 거치기 때문에 추가 연결에 오버헤드가 생기거나, 일부 연결은 차단될 수 있는 문제가 있다는 것으로 판단된다.

 

해결방법 1)
MySQL 공식 문서에 따르면 DNS가 느리거나 많은 호스트들을 가지고 있다면 --skip-name-resolve 옵션을 my.cnf 파일에 추가하여 위와 같은 과정을 무시(disable DNS lookup) 할 수 있다고 합니다. 

 

해결방법 2)

hostname /etc/hosts에 등록

 

92phantom@webservice:~$ sudo vi /etc/hosts

(변경 전) 127.0.0.1 localhost → (변경 후)127.0.0.1 webservice

92phantom@webservice:~$ curl webservice

* 예상 출력값
curl: (7) Failed to connect to webservice port 80: Connection refused

 

참고 링크: https://woowabros.github.io/experience/2017/01/20/billing-event.html

 

빌링 시스템 장애, 이러지 말란 Maria~ - 우아한형제들 기술 블로그

우아한 6시

woowabros.github.io

 

 

여기까지 GCP 전반적인 환경 설정은 마쳤다.

작성하고 보니 별거 아닌거 같은데,, 시간은 생각보다 많이 쓴거 같다.

다음으로 GCP에서 지원하는 MySQL을 생성하고 설정하는 과정을 이어 간다.