사내 게이트웨이에 접속할 때마다 명령어 전체를 입력해야 되는 것을

alias 설정을 통해 간단하게 할 수 있도록 변경해보자!

 

 

ASIS

아래의 명령어를 전체 입력해야 했다.

ssh [ID]@hcon.nhnent.com

 

TOBE

단어 하나 입력으로 접속할 수 있도록 한다.

hcon

 

 

1. /Users/nhn 위치로 이동

cd /Users/nhn

 

2. zshrc, cshrc 파일이 있는지 확인

ls -a

 

3. zshrc, cshrc 파일 열기

vi ~/.zshrc
vi ~/.cshrc

 

4. 두 파일 모두 alias 설정

alias hcon="ssh [ID]@hcon.nhnent.com"

 

5. 두 파일 모두 변경 사항 적용

source ~/.zshrc
source ~/.cshrc

 

끝! 접속 시 hcon 만 입력하면 된다!

 

4월 20일(목) 10~17시 한국컨퍼런스센터

 

✅ 교육 목표

  • NHN Cloud 서비스를 활용하여 2-tier 구조를 설계하고 구축할 수 있습니다.
  • 인프라 확장 기술인 Auto Scale 개념을 이해하고 활용할 수 있습니다.
  • 클라우드 서비스를 운영 관리에 필요한 서비스를 사용할 수 있습니다.

 

✅ 교육 목차

  1. 소규모 웹사이트 구축하기
  2. 인스턴스 시스템 모니터링 및 감시 설정하기
  3. 조건에 맞춰 서버 Scale In/Out 해보기

1. 소규모 웹사이트 구축하기

NHN Cloud에서 아래와 같은 아키텍처를 구성하는 실습을 진행해보았다!

 

 

Lab1. 기본 인프라 서비스 활성화

  1. 리전부터 확인하고 설정하기! 잘못된 리전에 만들었을 경우, 다 부수고 다시 만들어줘야 함..
  2. 기본 인프라 서비스 활성화하기

 

Lab2. 2개의 VPC 설정 / 인터넷 게이트웨이를 생성 후 라우팅 테이블에 연결

먼저, 사설망을 2개 생성한다.

  • 서비스용 : 웹 서버가 돌아갈 Service VPC
  • 관리용 : Private Subnet에 DB 서버가 돌아갈 mgmt VPC (Default VPC를 이걸로 변경)

 

사설망은 인터넷이 연결이 안 되어 있기 때문에, 인터넷 게이트웨이(문과 같은 역할)를 연결해야 한다.

 

단계는..

1. 인터넷 게이트웨이 생성

2. 라우팅 테이블(Service VPC)에 인터넷 게이트웨이 연결 (경로를 알려주는 것)

 

디폴트로 생성된 Default VPC의 경우 인터넷 게이트웨이가 자동으로 할당되어 있기 때문에

라우팅 테이블에서 Service VPC에만 인터넷 게이트웨이를 연결해주면 된다.

Lab3. Management vpc - public subnet 생성 / Service vpc - private subnet, public subnet 생성

  • mgmt vpc : Default Network의 경우, public용 subnet 또한 자동 생성 → Default Network를 서브넷 변경으로 이름만 변경
  • service vpc : private, public용 subnet 총 2개 생성
  • 헷갈리지 않게 네이밍이 대충 하지 말고 의미를 담는 것이 중요하다.

 

Lab4. mgmt vpc의 서브넷에 mgmt 인스턴스 생성

인스턴스를 생성 시, 네트워크 서브넷에 public-subnet-mgmt를 연결한다.

 

Lab5. 보안그룹 설정 (local → mgmt-server)

공인 IP를 통해 mgmt-server에 접속할 수 있게 mgmt-sg에 내 IP로 보안 규칙을 생성한다.

 

Lab6. Service VPC의 Private Subnet에 MariaDB 인스턴스를 생성

💡 RDS for DB vs DB Instance

 

✔️ RDS for DB

  • 복잡한 설정 없이 고가용성, 자동 백업, 모니터링을 UI 상에서 이용할 수 있음
  • PaaS형 상품
  • 설치 간편성 : 희망 서버 사양 선택 > 희망 DB 버전 선택 > 생성

1. 고가용성(HA)

  • Master와 Candidate Master 인스턴스가 나란히 생성됨
  • Master가 정지되면 Candidate가 자동으로 Master로 승격되어 장애를 막음

2. 자동화된 백업

  • 지정된 시간 범위 안에 자동으로 백업이 수행됨
  • Object Storage에 보관할 수 있고, 원하는 시점으로 복원할 수 있음

3. 손쉬운 설정 변경

  • 웹 콘솔을 통해 설정을 쉽게 변경할 수 있음

4. 모니터링

  • 하드웨어 및 DB 상태를 모니터링 할 수 있음
  • 슬로우 쿼리 같은 부분도 같이 제공
  • 임계치 설정 시 알림 설정도 받을 수 있음

 

✔️ DB Instance

  • OS 위에 DB를 설치한 단순 DB 설치형, 나머지는 고객이 관리
  • IaaS형 상품

 

 

Lab7. Service VPC의 Public 서브넷에 웹서버를 설치

 


  • mgmt vpc와 service vpc가 통신하기 위해 거쳐야 할 설정 단계!

mgmt vpc ↔ Sevice vpc

0. local에 있는 펨키를 mgmt-server로 전송

1. 피어링 게이트웨이 생성

2. 라우팅 테이블 두개 다 잡아주기

3. 보안그룹 mgmt에서 들어오는 것만 열어주면 됨

 

아래에서 따라해보자!

 

Lab8. Local 환경에서 mgmt-server로 키페어 전송

ssh -i key.pem centos@[mgmt-server public ip]

 

Lab9. mgmt VPC ↔ Service VPC를 피어링 작업 / 각각의 VPC 라우팅 테이블 설정

1. 네트워크 - 피어링 게이트웨이 - 생성

두 개의 네트워크가 사설 통신하기 위해서 피어링 게이트웨이를 생성해준다.

 

2. 네트워크 - 라우팅 - 라우트 선택 - 라우트 생성

mgmt는 service도 가야 되고, db에도 가야한다.

두 군데에 가야 되기 때문에 범위를 vpc 자체로 열어줄 것!

 

mgmt vpc 라우팅 테이블에서 10점 대역이 들어올 거니까 10점 대역이 피어링 게이트웨이를 타야 하므로

대상 CIDR에 10.0.0.0/16으로 설정한다.

service vpc의 라우팅 테이블은 192.168 대역이 피어링 게이트웨이를 타야 한다.

Lab10. 보안그룹 설정 ( mgmt → web, mydb )

 

Lab11. web1 → DB 서버 접속

먼저 보안그룹 설정이 필요하다.

 

  • 포트 : 3306

db 서버 보안그룹(db-sg)에 3306 포트를 열어주어야 한다.

 

  • IP : web-sg

web 서버가 현재는 1개지만 여러 개로 늘어날 수 있다고 하면,

db 서버 보안그룹(db-sg)에 web 서버 보안그룹(web-sg) 자체를 추가해주면

나중에 추가되는 web 서버를 db-sg에 매번 넣어주지 않아도 되어 편리하다.

 

🤔 db-sg 보안그룹에 web-sg 보안그룹 자체를 추가한다는 건?

web-sg를 보안그룹으로 쓰는 모든 인스턴스를 db-sg에서 허용해달라는 의미와 같다.

 

두둥

web 서버에서 db 서버에 접속했다!

 

Lab12. 웹서버의 /www/var/htmlprocess_create.php 파일 수정

db 서버의 ip로 변경

 

Lab13. 생성한 웹서버를 이용하여 이미지 생성

  • 이미지 : 현재까지 구성한 인스턴스 상태를 스냅샷

환경구성을 다 하고 이미지를 생성하는 것이 좋다.

인스턴스를 정지 후 이미지 기능을 사용하는 것을 권고한다.

 

1. Compute - 인스턴스

2. 생성하고자 하는 인스턴스 중지

3. 이미지 생성

 

4. Compute - Image에서 확인

 

Lab14. LB 생성 및 설정

💡 Load Balancer

트래픽을 분산시켜주는 기능

 

✔️ 알고리즘에 의해 동작 방식이 조금씩 다름

1. Round Robin (라운드 로빈)

  • 트래픽을 전달할 인스턴스를 순차적으로 선택하는 가장 기본적인 방식

2. Least Connections (최소 연결 우선 선택)

  • TCP 연결 수를 기준으로 하며 부하가 가장 적은 인스턴스로 보내는 방식
  • 특정 인스턴스에 부하가 집중되는 상황 방지

3. Source IP(원본 IP 기준 선택)

  • 청자의 원본 IP를 해싱하여 처리할 인스턴스를 선택
  • 한 사용자의 요청을 기억해 매번 동일한 인스턴스에서 처리하고자 할 때 유용

 

✔️ 지원 프로토콜

1. TCP : TCP(4계층) LB 제공

2. HTTP / HTTPS : OSI 7계층 LB 제공

3. TERMINATED_HTTPS : HTTPS에서 SSL Termination 기능이 추가돼 LB 제공

 

✔️ 리스너

  • LB 앞 단에 리스너가 있음
  • 리스너가 듣고자 하는 포트와 프로토콜 포트만 허용해줌
  • HTTP/80를 듣고자 하는데, HTTPS가 들어오려고 하면 못 들어감
  • 리스너가 듣고 있는 정보만 통신 가능
  • 필요한 수만큼 리스너 생성하면 됨
  • 보안그룹에 LB 정보가 없으면 통신이 안 되고 부하 분산도 안 됨

 

✔️ IP접근제어기능

🤔 LB로 들어오는 트래픽이 너무 많으면? 너무 느려지면?

IP를 확인해서 이슈가 있을 때 LB에 IP접근제어기능을 쓰면 좋음

 

 

LB 생성

1. network - Load Balancer

2. health check를 해서 인스턴스 상태를 확인함 -> 80 포트, url 체크(웹서버 특정 디렉토리에 특정 파일이 있는지)

3. 네트워크 설정 (web1)

 

 

 

Lab15. web-img 이미지로 web2 서버 생성 / 종료된 web1 서버 시작

1. 정지했던 web1 서버 켜기

2. 인스턴스 생성 시 이미지 사용

 

Lab16. LB에 Floating IP를 할당

LB에 공인 IP 할당

 

Lab17. LB에 web-2 서버를 추가

  • LB - 인스턴스 연결 추가

로드 밸런서에 라운드 로빈할 총 2대의 인스턴스(web1, web2) 추가 완료!

 

  • web-sg 보안 그룹에 로드 밸런서 사설 IP 추가해주기

안 그러면 80포트로 모든 IP가 다 들어오게 되어버린다.

 

30초에 한번씩 추가하기 때문에 바로 안 될 수도 있음 기다려줘야 한다.

대신 LB를 재시작하면 바로 적용된다.

로드밸런서 - 리스너 - 리스너 변경 아무것도 변경하지 말고 누르면 재시작 된다.

 

결과

 

새로 고침 할 때마다 두 인스턴스로 라운드 로빈 되는 걸 확인할 수 있다!

 

Lab18. 웹사이트 확인

1. 데이터 입력

 

2. DB 서버 접속 후 데이터 삽입 확인!

웹에서 입력한 정보가 DB에 잘 들어가있는 것을 볼 수 있다.

 

+ 추후 도메인을 달고 싶다면 LB에 도메인 설정만 해주면 된다.

+ 원본 서버에 점검이 필요하면 mgmt-server를 통해 사설망으로 들어가서 점검할 수 있다.

 

로드 밸런서 모니터링

기본적으로 제공해주는 통계 기능을 통해 로드 밸런서를 모니터링 할 수 있다.


2. 인스턴스 시스템 모니터링 및 감시 설정하기

무료니까 꼭 이용해보기

1분 단위 수집해주고, 이슈가 있으면 연락을 준다.

 

  • Compute - System Monitoring

 

단계는..

1. 레이아웃 만들기

2. 알림

2-1 알림 받을 사용자 그룹 생성

 

2-2 어떤 그룹에 어떤 알림 줄 지 생성

 

2-3 감시 설정

 

2-4 서버 목록 설정

 

2-5 사용자 그룹 설정

 

 

테스트

  • systemctl stop httpd로 강제로 httpd 종료해보기

 

SMS와 이메일로 바로 연락이 온다!

 

 

시스템 모니터링 - 이벤트 현황 페이지에서도 확인할 수 있다.


3. 조건에 맞춰 서버를 Scale In/Out 해보기

필요에 따라 서버를 확장하거나 축소하는 것

 

💡 Scaling

인스턴스 또는 컴퓨팅 파워를 확장하는 것

 

  • Scale Up : 장비의 설비 성능을 높이는 것

 

  • Scale Out : 장비의 설비 규모를 늘리는 것

Auto Scaling Group

  • Scale In/Out을 자동으로 해주는 것
  • 인스턴스를 추가로 생성 또는 삭제하는 조건과, 조건이 만족하는 경우 수행할 행동을 정의한 것
  • 최소, 최대, 구동 인스턴스는 스케일링 그룹에서 반드시 정의해야 하는 매개변수
    • 최소, 최대 : 만들어질 수 있는 limit 수
    • 구동 : 돌아갈 인스턴스
  • 임계치 또는 감축 정책을 미리 설정해놓으면 지속적으로 모니터링 하다가 조건이 만족하면 Scale In/Out 함
  • 모니터링은 아래 항목 중에 원하는 항목을 선택하면 됨

  • 어떤 값을 보고 움직일까? Auto Scaling Group 안에 있는 인스턴스의 평균값으로 움직임
  • Instance Template을 사용하면 좋음
    • 자주 사용하는 인스턴스 구성 요소 정보를 미리 정의해 보관하는 서비스

 

설정

1. 인스턴스 템플릿 설정

스펙은 한 번 설정하면 나중에 바꿀 수 없다.

 

2. Compute - Auto Scale

2-1 인스턴스 템플릿으로 인스턴스 설정

2-2 스케일링 그룹 설정

증설 정책 - 재사용 대기 시간 → 쿨타임 : 한번 수행하고 나면 쿨타임 동안은 조건이 만족해도 오토 스케일링을 하지 않음

 

로드 밸런서랑 연동해서 자동으로 LB 밑으로 들어가도록 한다.

 

설정 결과

  • 오토 스케일링 그룹 생성

 

  • 인스턴스 템플릿 + 로드 밸런서 -> 인스턴스 생성

 

  • 로드 밸런서 인스턴스에 오토 스케일링 인스턴스가 추가됨

 

3대에서 움직이다가 4대가 됐다가 3대가 됐다가 그런 방식이다.

 

⚠️ 오토 스케일링으로 만들어진 인스턴스는 콘솔에서 삭제하거나 중지할 수 없음

 

 

부하 테스트 방식

  • 리눅스 도구 Stress를 이용하여 부하테스트 진행
  • web-auto에서 해야 됨
  • stress -c 1 --timeout 240
  • 인스턴스 > web-auto > 모니터링 > 전체 팝업으로 보기
  • 오토 스케일 > web-auto > 통계 > 평균 값 보여주는 것

 

결과

1. 인스턴스 1대가 추가됨

 

2. 오토 스케일 인스턴스 목록에도 추가됨

 

3. 로드 밸런서에도 2대 추가됨

 

 

4. 나중에 축소될 때는 먼저 만들어진 인스턴스가 삭제됨

 

 

모든 로그는 Cloud Trail에서 확인 가능

오토 스케일은 SYSTEM이 해준걸 알 수 있다.

 

++ 리소스 반납

다 썼으면 잊지 말고 꼭 리소스 반납하기

  1. 인스턴스 삭제
  2. 서비스 비활성화
  3. 조직 삭제

 

NHN Cloud 전반적인 기능을 알차게 배울 수 있는 유익한 시간이었다.

이미지, 인스턴스 템플릿, VPC, 라우터, 피어링, 로드 밸런서, 모니터링, 스케일링까지-!

특히 처음에 구성할 아키텍처를 먼저 보여주시고 직접 실습을 통해서 따라가니까 더 이해가 잘 된 것 같다.

엔클 최고당

개발한 vue-django 프로젝트를 실제 운영서버에 띄우는 과정을 정리합니다! 

 

개발서버에서 구축했던 방법이 운영서버에서 적용할 때 조금씩 다른 부분도 있었고, 

여러 단계를 거쳐야 했기 때문에 잊어 버리지 않기 위해 기록해봅니다 스타트..!

 

🐾 단계

  1. 인스턴스 생성
  2. 보안규칙 생성
  3. DB ACL 허용 요청
  4. 도커 설치 - v23.0.3
  5. Jenkins 도커 서버 띄우기 - v2.399
    1. Jenkins 컨테이너 생성 및 실행
    2. Jenkins 컨테이너 내부에 DooD 구성하기
  6. 패키지 설치 및 환경 구성
  7. 웹 서버 띄우기
    1. 백그라운드로 웹 서버 띄우기

 

1. 인스턴스 생성

개발서버

ssh -i {pem키} ubuntu@{ip}

  • OS : Ubuntu Server 20.04 LTS
  • 타입 : r2.c4m16 (4vCPU, 16GB)
  • 스토리지 : 300GB

운영서버

  • OS : Ubuntu Server 20.04 LTS
  1. ssh {id}@{domain}
  2. (kinit)
  3. ssh {user}@{host}

😃 커버로스을 이용해 티켓이 발급된 사용자만 접속할 수 있도록 보안 단계를 거치게 됩니다! 

 

2. 보안규칙 생성

보안 그룹에서 필요한 포트 열어주기

젠킨스 기본 포트는 8080이지만 장고에서 사용하고 있기 때문에 겹치지 않게 7070으로 변경!

  • 7070 : 젠킨스
  • 8080 : 장고
  • 8000 : 뷰

 

3. DB ACL 허용

 

 

4. Docker 설치

  • Docker Latest : v23.0.3

개발서버

# dependency library download  
sudo apt-get update  
sudo apt-get install -y curl apt-transport-https ca-certificates gnupg-agent software-properties-common  
  
# Docker 다운로드 링크 추가  
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  
  
# Docker Repository 등록  
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  
  
# Docker 설치  
sudo apt-cache policy docker-ce  
sudo apt-get update  
sudo apt-get install -y docker-ce docker-ce-cli containerd.io  
  
# docker 그룹에 사용자 추가  
sudo usermod -aG docker $USER  
  
# 그룹 변경사항 활성화  
sudo newgrp docker

 

운영서버

# sudo 권한을 위해 아래 계정으로 접속
ssh {user}@{host}

# dependency library download  
sudo apt-get update  
sudo apt-get install -y curl apt-transport-https ca-certificates gnupg-agent software-properties-common  
  
# Docker 다운로드 링크 추가  
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  
  
# Docker Repository 등록  
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  
  
# 의존성 문제 해결
curl -O http://archive.ubuntu.com/ubuntu/pool/main/libs/libseccomp/libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb
sudo dpkg -i libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb

# Docker 설치
sudo apt-cache policy docker-ce  
sudo apt-get update  
sudo apt-get install -y docker-ce docker-ce-cli containerd.io  
  
# docker 그룹에 사용자 추가  
sudo usermod -aG docker $USER

 

5. Jenkins 서버 띄우기

Jenkins 컨테이너 생성 및 실행

  • Jenkins 제공 공식 도커 이미지 사용 (Jenkins 2.399)
  • Jenkins 컨테이너 생성 시 --privileged 옵션 필요
    • Variable Parsing 시 PostgreSQL는 yum으로 설치되므로 systemctl 명령어 사용 필요
  • 프로젝트 내 폴더 생성 후 실행할 스크립트 파일 모으기 (/home/ubuntu/variable-comparison/script/<DBMS명>)
  • 인스턴스와 컨테이너 폴더 위치 마운트하기 (/root/script)
sudo docker run --privileged -d --name jenkins -p 7070:8080 -v /home1/{user}/variable-comparison/script:/root/script -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins

젠킨스 초기 비밀번호 확인

docker exec -i jenkins bash <<< "cat /var/jenkins_home/secrets/initialAdminPassword"

 

Jenkins 컨테이너 내부에 DooD 구성하기

# jenkins 컨테이너에 루트 권한으로 접속
docker exec -it -u root jenkins bash

# docker 그룹 생성
groupadd docker
# docker 그룹에 jenkins 사용자 추가
usermod -G docker -a jenkins
# 호스트의 docker 그룹 ID(998)로 지정된 그룹명을 docker로 변경
# docker 그룹 ID는 /etc/group 파일에서 확인 가능
groupmod -g 499 docker
# 컨테이너 내부 사용자가 호스트의 파일에 접근 가능하도록 호스트 사용자 아이디(500)로 변경
usermod -u 500 jenkins

apt-get update
apt-get -y install lsb-release apt-transport-https ca-certificates curl gnupg2 software-properties-common
apt-get -y upgrade apt-transport-https

# Docker 다운로드 링크 추가
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey
apt-key add /tmp/dkey

# Docker Repository 등록
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"

# Docker 설치
apt-get update
apt-get -y install docker-ce docker-ce-cli containerd.io

 

6. 패키지 설치 및 환경 구성

1. 프로젝트 Git clone

  • 안될 경우, 사내 게이트웨이 신청 필요할 수 있음
git clone {repository url}

 

2. pyenv 설치 (python 3.9.10)

sudo apt update
sudo apt install -y git sqlite3 build-essential libedit-dev make

# pyenv 설치를 위한 패키지 다운로드
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
# pyenv 다운로드
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

# ~/.bashrc에 환경변수 추가
cat >> ~/.bashrc << 'EOF'
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOF

# ~/.bashrc 적용
source ~/.bashrc

# pyenv로 python 3.9.10 버전 다운로드
#sudo apt install -y lzma
pyenv install 3.9.10
# py39라는 이름의 가상환경 생성
pyenv virtualenv 3.9.10 py39
# py39 활성화
pyenv activate py39

 

3. requirements.txt 설치

pip install -r requirements.txt

# setuptools가 먼저 설치되어야 mysqlclient 설치가 정상적으로 진행됨
# 설치 순서도 중요!

 

4. secret key 발급

 

5. 필요한 패키지

  • Redis
sudo apt-get install -y libssl-dev default-mysql-server default-mysql-client default-libmysqlclient-dev
sudo apt-get install -y python3-pip
pip3 install requests bs4 sqlalchemy pymysql mysqlclient pandas redis
  • PostgreSQL
apt-get update && apt-get -y install sudo
sudo apt-get install -y postgresql-client
sudo apt-get install -y postgresql-client-common
sudo apt install pip 
sudo apt install default-libmysqlclient-dev
pip install sqlalchemy requests bs4 psycopg2-binary mysqlclient numpy pandas
  • 설치가 잘 안 될 경우
# ModuleNotFoundError: No module named '_ctypes' 에러
sudo apt-get install libffi-dev
# 가상환경 파이썬 제거
pyenv uninstall 3.9.10
# 가상환경 파이썬 재설치
pyenv install 3.9.10
# py39라는 이름의 가상환경 생성
pyenv virtualenv 3.9.10 py39
# py39 활성화
pyenv activate py39

 

6. npm, vue, nvm 설치

node 버전을 잘 맞춰 주는 것이 매우 중요하다! 안 맞으면 띄워지지가 않음..

# npm 설치
sudo apt install npm

# vue-cli 설치
sudo npm install -g @vue/cli
vue --version #@vue/cli 5.0.8

# nvm 설치
sudo apt-get install build-essential libssl-dev
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
source ~/.bashrc

# 원하는 버전 설치
nvm install 16.14.2

# 실행
# nvm use default 16.14.2

# 버전 확인
node -v  # v16.14.2
npm -v # 8.5.0

 

7. vue.config.js 변경

publicPath: process.env.NODE_ENV === 'production' ? '/static/dist/' : 'http://{ip}:{port}',

.public('http://{ip}:{port}')

 

7. 서버 띄우기

* 주의

로컬을 띄운 상태에서 실행할 경우 로컬 화면이 나오는 것이기 때문에 로컬을 끈 상태에서 진행해야 진정한 서버를 볼 수 있다!

 

운영서버

백그라운드에서 띄우기!

  • nohup node ./node_modules/@vue/cli-service/bin/vue-cli-service serve --port 18080 &
  • nohup python manage.py runserver {ip}:{port} --settings=main.config.settings.debug
  • 15361번 포트, 18080번 포트 사용

드디어 메인 화면이 예쁘게 뜬 것을 확인할 수 있다~!!

 

이렇게 정식으로 서버를 띄워본 것은 처음이어서 한 단계를 알아 갈 때마다 너무 재밌고 이런 시간을 보낼 수 있어서 감사했다!

관련 내용은 더 반복하고, 모르는 내용은 스터디해서 잘 정리해두어야겠다 :)

배치를 수동으로 돌려야 하는 상황이 있을 수 있다.

예를 들면, DBMS에 새 버전이 나왔을 때 바로 배치를 돌려서 데이터를 추가해야 될 수도 있기 때문! 

 

웹에 [수동 배치] 같은 버튼을 만들어 놓고 누르면 젠킨스에서 배치가 돌게 하고 싶은 경우

젠킨스에서 제공하는 원격으로 빌드 유발 기능을 사용하면 된다.

 

그러면 젠킨스에 설정해 놓은 재시도 횟수, 두레이 메신저 알림 기능, 로그 확인 기능을 모두 사용할 수 있기 때문이다.

 

아래 방법을 따라서 원격으로 빌드를 유발해보자!

 


1. 토큰 발급

  • Dashboard > 사람

 

  • admin이란 이름으로 사용자를 등록했기 때문에 admin 클릭!

 

  • 설정으로 들어가서 API Token 발급

다시 들어가면 값이 사라져 있으니 잘 복사해두자!

 

2. Job 설정

  • 원격으로 빌드 유발 체크 및 토큰 이름 설정

토큰 이름은 나중에 호출할 때 사용할 것이기 때문에 띄어쓰기 없이 짧게 적어주면 된다.

 

3. 원격으로 빌드

1) Job Build

  • Parameter가 없는 build
curl -i -X POST 'http://<jenkins_username>:<jenkins_api_token>@<jenkins_url>/job/<job_name>/build?token= <token_name>'

 

값을 채워넣고 터미널에서 실행해보면 젠킨스 job이 잘 실행된다!

 

파이썬에서 구현하고자 하면

@api_view(['POST'])
def trigger_build(request):
    # 젠킨스 빌드 주소 - 파라미터 : 토큰
    jenkins_url = f"http://{jenkins_username}:{jenkins_password}@{jenkins_server}/job/{jenkins_job_name}/build?token={jenkins_token}"

    try:
        response = requests.post(jenkins_url)  # 젠킨스 빌드 주소로 post 요청 보내기

        if response.status_code == 201:  # 요청 성공
            print("[Success] Jenkins trigger builds remotely!")
            return HttpResponse("Jenkins build triggered successfully!", status=201)
        else:  # 요청 실패
            print("[Fail] Failed to trigger builds remotely. Status code:", response.status_code)
            return HttpResponse("Failed to trigger Jenkins build. Status code: " + str(response.status_code), status=500)

    except Exception as e:  # 예외 발생
        print("[Fail] Failed to trigger builds remotely. Exception:", e)
        return HttpResponse("Failed to trigger Jenkins build. Exception: " + str(e), status=500)

 

  • Build with Parameter
curl -X POST 'http://[IP]:[PORT]/job/[JOB_NAME]/build buildWithParameters --data [PARAM1]=[VALUE1] --data [PARAM2]=[VALUE2] --user [USER_NAME]:[USER_API_TOKEN]'

 

@api_view(['GET'])
def trigger_build_with_parameters(request):
    try:
        # 젠킨스 빌드 주소 - 파라미터 : 토큰, 파라미터
        jenkins_url = f"http://{jenkins_username}:{jenkins_password}@{jenkins_server}/job/{jenkins_job_name}/buildWithParameters?token={jenkins_token}&params={params}"
        response = requests.post(jenkins_url)  # 젠킨스 빌드 주소로 post 요청 보내기

        if response.status_code == 201:  # 요청 성공
            print("[Success] Jenkins trigger builds remotely!")
            return HttpResponse("Jenkins build triggered successfully!", status=201)
        else:  # 요청 실패
            print("[Fail] Failed to trigger builds remotely. Status code:", response.status_code)
            return HttpResponse("Failed to trigger Jenkins build. Status code: " + str(response.status_code), status=500)

    except Exception as e:  # 예외 발생
        print("[Fail] Failed to trigger builds remotely. Exception:", e)
        return HttpResponse("Failed to trigger Jenkins build. Exception: " + str(e), status=500)

 

2) Job Build 조회

curl -X GET 'http://[IP]:[PORT]/job/[JOB_NAME]/api/json --user [USER_NAME]:[USER_API_TOKEN]'

 

3) Job Build 결과 조회

 curl -X GET 'http://[IP]:[PORT]/job/[JOB_NAME]/[BUILD_NUM]/api/json --user [USER_NAME]:[USER_API_TOKEN]'

 

빌드 넘버를 확인하기 어려울 경우

BUILD_NUM 대신 lastStableBuild를 입력할 경우 가장 최신의 빌드 결과를 알 수 있다.

각 조회 결과는 json, xml, python 타입을 지정할 수 있다.

 curl -X GET 'http://[IP]:[PORT]/job/[JOB_NAME]/lastStableBuild/api/json --user [USER_NAME]:[USER_API_TOKEN]'

 

 

 

 

 

 

참고 사이트

1. Ubuntu 인스턴스에 CentOS 도커 컨테이너 설치

설치 환경

  • NHN Cloud
  • Ubuntu 20.04 LTS
  • Docker 23.0.1
  • CentOS 7.9

 

Workflow

  1. 설치하려는 패키지가 이미 설치되어 있는지 체크 후 다운로드
  2. Docker 공식 GPG 키 추가
  3. Docker 레포지토리 등록
  4. apt-get 업데이트
  5. Docker 설치
  6. 그룹에 사용자 추가
  7. CentOS 7 컨테이너 실행

 

설치 스크립트

#!/usr/bin/env bash

# curl 이미 설치되어 있는지 체크
if ! command -v curl &> /dev/null
then
    sudo apt-get update
    sudo apt-get install -y curl
fi

# apt-transport-https 이미 설치되어 있는지 체크
if ! dpkg -s apt-transport-https &> /dev/null
then
    sudo apt-get update
    sudo apt-get install -y apt-transport-https
fi

# ca-certificates 이미 설치되어 있는지 체크
if ! dpkg -s ca-certificates &> /dev/null
then
    sudo apt-get update
    sudo apt-get install -y ca-certificates
fi

# gnupg-agent 이미 설치되어 있는지 체크
if ! dpkg -s gnupg-agent &> /dev/null
then
    sudo apt-get update
    sudo apt-get install -y gnupg-agent
fi

# software-properties-common 이미 설치되어 있는지 체크
if ! dpkg -s software-properties-common &> /dev/null
then
    sudo apt-get update
    sudo apt-get install -y software-properties-common
fi

# Docker 공식 GPG key 이미 추가되어 있는지 체크
if ! curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key list | grep Docker &> /dev/null
then
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
fi

# Docker repository 등록
if ! apt-cache policy | grep https://download.docker.com/linux/ubuntu | grep stable &> /dev/null
then
  echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
fi

# 기본적인 패키지들이 최신 버전인지 확인
sudo apt-get update

# docker-ce 이미 설치되어 있는지 체크
if ! dpkg -s docker-ce &> /dev/null
then
    # Docker 설치
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
fi

# docker 그룹에 사용자 추가
sudo usermod -aG docker $USER

# Centos7 컨테이너 실행
sudo docker run --privileged -d -p 5432:5432 --name centos centos:7 /sbin/init
  • systemctl 명령을 사용하기 위해서 privileged로 컨테이너 실행
  • 컨테이너에 postgresql을 설치할 예정이어서 포트 5432로 실행

+ Recent posts