
클라우드 또는 가상화 환경에서 사용하는 인스턴스는 일반 VM과는 달리 이미지 OS가 설치되어 있는 형태를 이미지화 한 것이다.
클라우드 환경은 on Demand여야 한다.
데이터베이스와 같은 경우 사용자가 직접 운영체제를 설치하고, 서비스 애플리케이션을 설치하는 과정이 생략된 상태에서 주문 즉시 해당 서비스를 이용할 수 있어야 한다. → 완전 관리형 서비스 → 대신 사용자는 OS나 애플리케이션 자체에 대한 접근 권한은 없다.
클라우드에서 제공하는 serverless 서비스
VM은 OS 설치에서부터 패키지 설치까지 직접 모든 것을 수동으로 설치 해야하지만, 클라우드 용 이미지를 이용한 인스턴스는 배포하는 형식이다.
리눅스

# 압축 풀기
xz -d [파일제목]
# 확인, 결과로 나온 이것이 하나의 볼륨이라고 생각
ls
# 파일이름이 길기 때문에 이름 바꾸기
mv [파일이름] [새로바꿀이름]
# 이미지 준비 완료되었다.
Hypervisor 설치하기
yum update -y
yum -y install @virt # 가상화 관련 도구들을 패키지로 묶어 설치해줌
yum -y install libguestfs-tools # 클라우드용 이미지를 커스터마이징 할 수 있는 도구
한번에 설치하려면앞에거 되면 뒤에 실행될 수 있도록 &&을 이용
yum update -y && yum -y install @virt && yum -y install libguestfs-tools
Hypervisor 실행을 위한 설정
# 지정한 문자열이 있다면 이 문자열로 바꿔라
setenforce 0 # 당장 멈추기
set -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
cat /etc/selinux/config

리눅스에서의 보안
위에서는 selinux를 disabled해서 변경할 수 있게 함. 내가 원하는 클라우드(다른 디렉토리)에서 하려고 함
서버 가상화 서비스 실행
gedit /etc/libvirt/qemu.conf
# 실행
systemctl enable libvirtd && systemctl start libvirtd
# 가상머신 manage 도구 설치
yum -y install virt-manager
리눅스 바탕화면 ALL에서 manager 앱 실행
클라우드 이미지의 내용을 요구사항에 맞게 변경시키기
<요구사항>
# 1. 복사하기. CentOS.qcow2는 원본, gildong.qcow2는 복사본
cp CentOS.qcow2 gildong.qcow2

```bash
# 2,3 이미지에 웹서버 설치. 부팅되면 자동으로 웹서버 실행하도록 함
virt-customize -a gildong.qcowvirt-customize -a gildong.qcow2 --root-password password:test123 --install httpd --run-command 'systemctl enable httpd' --selinux-relabel2 --root-password password:test123 -- install httpd --run-command 'systemctl enable httpd' --selinux-relabel
```

```bash
# gildong을 복사해 하나 더 만들기
cp gildong.qcow2 chulsoo.qcow2
```

```bash
# 4. 인스턴스 만들기
# 네트워크는 일단 default, 나머지 설정
virt-install --name gildong --vcpus 1 --ram 1024 --disk /cloud/gildong.qcow2 --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null
# 동작중인 가상머신 (인스턴스)를 확인
virsh list --all
```

더블클릭 후 root, test123으로 정상적으로 로그인
- ifconfig로 IP 확인
- ping으로 인터넷 확인
- systemctl status httpd로 httpd가 동작중인 지 확인
- 클라우드는 ACL, 보안그룹으로 관리하기때문에 방화벽이 현재 설정 안되어있음
- systemctl stop firewalld

원래의 리눅스로 돌아가서
```bash
# gildong 정보 확인 가능
virsh domifaddr gildong
# IP만 뽑아내기
virsh domifaddr gildong | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}'
# 변수 적용해서 name="gildong" 넣어서 실행도 가능
name="gildong"
virsh domifaddr $name
```
인스턴스를 다량 생산해야한다.
스크립트 작성
```bash
[root@dblab cloud]# touch instance.sh
[root@dblab cloud]# chmod +x instance.sh
[root@dblab cloud]# gedit instance.sh
```
```bash
#!/bin/bash
name=''
vcpu=''
ram=''
clear
echo -e "\t\tINSTANCE CREATION PROGRAM"
echo
echo -en "\tINSTANCE NAME : "
read name
echo -en "\tHOW MANY CPUs DO YOU WANT : "
read vcpu
echo -en "\tMEMORY SIZE : "
read ram
echo $name
echo $vcpu
echo $ram
```
```bash
./instance.sh
```
사용자가 값 입력

chulsoo를 템플릿으로 쓸 것임. 다시 instance.sh를 수정. 변수를 이용해 받아 인스턴스 생성
```bash
#!/bin/bash
# 변수 선언
name=''
vcpu=''
ram=''
clear # 화면 지우기
echo -e "\t\tINSTANCE CREATION PROGRAM" # 화면에 출력
echo
echo -en "\tINSTANCE NAME : " # 사용자에게 인스턴스 이름 입력받기 위한 문장 띄우기
read name # 사용자가 입력한 값을 변수 name에 저장
echo -en "\tHOW MANY CPUs DO YOU WANT : "
read vcpu
echo -en "\tMEMORY SIZE : "
read ram
# chulsoo.qcow2는 템플릿용 기본이미지
cp chulsoo.qcow2 ${name}.qcow2 # 설치를 위한 디스크를 변수에 담긴 이름으로 복사하여 준비
# 변수에 담긴 값을 이용하여 인스턴스 설치. 발생되는 메시지는 null에 버린다(설치메시지출력X)
virt-install --name $name --vcpus $vcpu --ram $ram --disk /cloud/${name}.qcow2 --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null
# 화면을 15초동안 중지시킨다.
sleep 15
# 화면에 결과 내용 출력하기
echo -e "\t\tFINISHED"
result=$(virsh list --all | grep ${name})
echo -e "\t$result"
```
gildong, kimgildong 이런식으로 있을 때 딱 gildong만 뽑아내기 위해 정규표현식 ^$name$ 이런식으로 사용 ( ^는 시작, $는 끝)
다시 실행
```bash
./instance.sh
```

IP 보기

DB로 접속해 데이터 읽기
```bash
```

DB로 접속해 데이터 전달
```bash
id=user1
name=gildong
year=1996
addr=NY
mysql sqlDB -u root -p1234 -e "INSERT INTO userTbl VALUES ('$id','$name',$year,'$addr',NULL,NULL,NULL,NULL)"
echo $? # 잘 수행되었는 지 확인, 0이면 정상수행
# 정상적으로 값이 들어갔는 지 확인
mysql sqlDB -u root -p1234 -e "SELECT * FROM userTbl"
```
[실습 시나리오]
CloudDB
물리서버에서 확인할 수 있는 정보(hostTbl)
(열이름)
- (hostname)
- hostname 명령을 통해서 서버의 이름 확인 가능
- PK로 지정
- ex) dblab
- VARCHAR(20)
- (hostip)
- ifconfig .. 일부 정보 필터링을 통해 IP주소 확인 가능
- NOT NULL
- CHAR(15)
인스턴스에서 확인할 수 있는 정보(instanceTbl)
- (iname)
- 인스턴스의 이름
- $name
- PK로 지정 (실제로는 자동부여된 id가 PK인 것이 좋음)
- VARCHAR(20)
- (hostname)
- 호스트서버 이름
- dblab (위 호스트네임 강제로)
- FK로 지정
- VARCHAR(20)
- 리눅스에서 $HOSTNAME 또는 host=$(hostname)
- (iip)
- 인스턴스 IP 주소
- $ipinfo
- CHAR(15)
```bash
ipinfo=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/'{print $1}')
```
- (ram)
- 인스턴스의 메모리 사이즈
- $ram
- INT

hostTbl에 값 한 개 넣고 실습 시작
스크립트 밑에 DB 연결하는 코드 작성
```bash
#!/bin/bash
name=''
vcpu=''
ram=''
clear
echo -e "\t\tINSTANCE CREATION PROGRAM"
echo
echo -en "\tINSTANCE NAME : "
read name
echo -en "\tHOW MANY CPUs DO YOU WANT : "
read vcpu
echo -en "\tMEMORY SIZE : "
read ram
cp chulsoo.qcow2 ${name}.qcow2
virt-install --name $name --vcpus $vcpu --ram $ram --disk /cloud/${name}.qcow2 --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null
sleep 15
echo -e "\t\tFINISHED"
result=$(virsh list --all | grep ${name})
echo -e "\t$result"
# to Database
sleep 60
iip=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')
mysql CloudDB -u root -p1234 -e "INSERT INTO instanceTbl VALUES ('$name','$HOSTNAME','$iip',$ram)"
mysql CloudDB -u root -p1234 -e "SELECT * FROM instanceTbl WHERE iname = '$name'"
```
여기서는 sleep 60으로 했지만, 나중에는 계속 확인해서 되면 실행되도록 함
```bash
./instance.sh # 실행해서 작성해보기
```

