예전에 만든 스프링 기반 웹서비스를 AWS EC2, AWS RDS를 사용하여 운영하고 있었는데

본인의 프리티어 기간도 종료되고 AWS EC2, AWS RDS 비용이 많이 나와 

EC2를 가장 작은 서버로 옮기고 DB또한 EC2 안에서 구동하려고 

서버와 db 마이그레이션을 하게 되어 그 과정을 포스팅 해보려고 한다.


가장 낮은 사양의 AWS EC2 t2.nano Ubuntu Server 18.04 LTS (HVM), SSD Volume Type 우분투 리눅스를 설치하였다.

(더 자세한 정보 : https://shlee0882.tistory.com/180?category=777755)


서버의 보안그룹 설정은 다음과 같이 진행하였다.

putty나 filezila에서 접속하기 위해 SSH 포트 22, 웹서비스를 구동하기 위한 80, 8080 포트

MySQL을 사용하기 위한 3306 DB포트를 열어주었다.




그 이후 putty로 접속하여 리눅스에서의 설치 과정을 정리해보았다.


본인은 db마이그레이션이 가장 중요하다고 생각되어 라이브러리는 mysql 부터 설치하였다. 


1. Ubuntu Linux에서의 MySQL 설치 및 root 권한 설정


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- 업데이트
sudo apt update
 
-- mysql 설치
sudo apt install mysql-server
 
-- mysql 접속
sudo mysql
 
-- mysql.user 쿼리 조회
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
 
-- root 플러그인 변경
mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
$ sudo service mysql restart
 
-- root 비밀번호 재설정
$ sudo mysql 
mysql> USE mysql; 
mysql> update user set authentication_string=password('0000'where user='root';
mysql> flush privileges;
 
-- root 계정을 외부에서 접속가능하게 허용
mysql> grant all privileges on *.* to 'root'@'%' identified by '0000'
mysql> flush privileges;
mysql> select host, user, authentication_string  from user;
mysql> exit
 
-- bind-address 주석설정
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
$ sudo service mysql restart
cs


mysql의 root 권한부터 기본설정을 마치고

mysqld.cnf를 열어 bind-address = 127.0.0.1 맨 앞의 #을 붙여 주석설정한 뒤 저장하였다.

그 이후 mysql 서버를 재시작한다.

(더 자세한 정보 : https://shlee0882.tistory.com/240)


이제 MySQL Tool (heidiSQL)을 이용해 root로 접속해보겠다.

ip는 IPv4 퍼블릭 IP를 넣었고 사용자 이름은 root 암호는 본인이 설정한 0000으로 넣었다.


2. HeidiSQL에서의 접속 테스트



접속이 된다면 성공한 것이다.


이제 본인의 AWS RDS에서의 export한 DB Schema를 불러와 import 한다.


필요한 경우 DB Charset 변경도 해준다.


1
2
cd /etc/mysql
vi my.cnf
cs


해당 사항을 추가하고 저장한다.


1
2
3
4
5
6
7
8
9
10
[client]
default-character-set = utf8mb4
 
[mysql]
default-character-set = utf8mb4
 
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
cs


DB 스키마 언어도 변경해준다.


1
ALTER DATABASE DB_NAME CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
cs


(db 마이그레이션 완료)



3. 오픈 JDK, JRE, 톰캣8 설치 및 확인


1
2
3
4
5
6
7
8
9
10
-- 오픈 jdk8, jre 설치 및 확인 
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
$ sudo apt-get install openjdk-8-jre
$ java -version
$ javac -version
 
-- 톰캣8 설치 및 확인
$ sudo apt-get install tomcat8
/usr/share/tomcat8/bin/version.sh
cs


톰캣을 설치했으면 확인해보자.

자신의 EC2퍼블릭 서버ip와 톰캣 기본포트는 8080이니 

본인의 EC2 보안그룹에 8080포트가 열려있다면 접속가능하다.


http://자신의EC2퍼블릭서버ip:8080/

(ex: http://15.164.212.200:8080/)



하지만 웹의 기본포트는 80 인데 

톰캣의 포트번호 8080을 80으로 변경하여 ip주소만 입력하면

바로 서비스하는 웹으로 이동해보려고 한다. 


4. Tomcat8 port 8080 to 80 change


server.xml의 port 8080을 80으로 수정하고

tomcat8의 AUTHBIND=yes로 변경 후 AUTHBIND 설치 후 톰캣 재시작을 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sudo vi /var/lib/tomcat8/conf/server.xml
-- <Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
-- port 8080을 80으로 수정
 
$ sudo vi /etc/default/tomcat8
-- #AUTHBIND=no를 주석제거하고 AUTHBIND=yes 로 변경
 
$ sudo apt-get install authbind
 
$ sudo touch /etc/authbind/byport/80
$ sudo chmod 500 /etc/authbind/byport/80
$ sudo chown tomcat8 /etc/authbind/byport/80
 
$ sudo /etc/init.d/tomcat8 restart
cs


이제 포트입력 없이 자신의 EC2퍼블릭서버ip 주소로 바로 접속 가능하다면 성공이다.


5. 스프링 프로젝트를 war파일을 export 및 linux로 전송


스프링 프로젝트를 war파일로 만든다.



export된 war파일을 

filezila 접속 후 리눅스서버의 /home/ubuntu 디렉토리로 파일을 전송한다.




리눅스로 돌아와 파일 확인 및 tomcat8/webapps 하위디렉토리로 이동시킨다.



1
2
3
4
5
6
7
8
9
10
11
12
-- 리눅스로 파일 이동되었는지 확인
$ cd /home/ubuntu
$ ls
BurgerInfo.war
 
-- tomcat8 webapps 디렉토리 아래로 war파일 이동
$ sudo mv BurgerInfo.war /var/lib/tomcat8/webapps/
$ cd /var/lib/tomcat8/webapps/
 
-- webapps 디렉토리 확인 war파일이 풀려져있으면 성공
$ ls
BurgerInfo  BurgerInfo.war  ROOT
cs


webapps의 war파일이 풀려 디렉토리가 생겼다면 

자신의 프로젝트의 기본경로를 추가해주고 톰캣 재시작한다.


1
2
3
4
5
6
7
8
9
-- server.xml 수정
$ cd /var/lib/tomcat8/conf
$ sudo vi server.xml
 
-- <Host> 태그 안에 본인의 프로젝트 이름과 기본경로 추가해준다.
-- <Context docBase="BurgerInfo" path="/" reloadable="true"/>
 
-- 톰캣 재시작
$ sudo service tomcat8 restart
cs



이후 자신의 프로젝트가 잘뜨는지 확인한다.

잘 뜨는 것이 확인되었다. 




그런데 띄우고 몇분이 되지 않아 DB로 접속이 되지 않는것이었다.

mysql을 재시작하려고 했는데 start가 되지 않았다.


6. AWS EC2 t2.nano InnoDB Cannot allocate memory for the buffer pool Error


1
2
3
-- mysql restart error 발생
$ sudo service mysql stop
$ sudo service mysql start
cs


Job for mysql.service failed because the control process exited with error code.

See "systemctl status mysql.service" and "journalctl -xe" for details.


에러 로그를 확인해보니 

2020-04-05T06:30:39.241537Z 0 [Note] InnoDB: Using CPU crc32 instructions
2020-04-05T06:30:39.243292Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2020-04-05T06:30:39.243322Z 0 [ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12
2020-04-05T06:30:39.243329Z 0 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2020-04-05T06:30:39.243334Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2020-04-05T06:30:39.243339Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2020-04-05T06:30:39.243343Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2020-04-05T06:30:39.243347Z 0 [ERROR] Failed to initialize builtin plugins.
2020-04-05T06:30:39.243350Z 0 [ERROR] Aborting

버퍼풀에 메모리 할당 못한다. 메모리 부족 하다는 것을 얘기하는 것 같다.

stackoverflow에서 확인해보니 AWS EC2의 Micro 인스턴스는 기본 SWAP 공간이 없다고 한다.

(https://stackoverflow.com/questions/16917973/amazon-ec2-mysql-failed-to-start)


그럼 스왑설정을 해주자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sudo su
 
$ dd if=/dev/zero of=/swapfile bs=1M count=1024
$ mkswap /swapfile
$ swapon /swapfile
$ vi /etc/fstab 
-- /swapfile swap swap defaults 0 0 추가해준다. 
 
-- 스왑설정 확인
$ swapon -
$ free -k
$ swapon -a
 
$ service mysql restart
cs



설정을 마치니 mysql 버퍼메모리 오류가 발생 하지 않았다.


그런데 매번 배포할때마다 수동으로 war로 묶어 tomcat wepapps 밑으로 옮겨서 

배포할순 없다.  


다음번엔 빌드와 배포를 자동화 하는 젠킨스를 설치하여 지속적으로 통합관리 해보려고 한다. 


이번 설정을 통해 AWS 비용을 아낄수 있는 기회가 되었으면 좋겠다.



 AWS RDB에 테이블 생성 후


테이블의 한글 데이터를 넣으려고 하면 한글이 ?? 로 들어가는 경우가 있다.


해당문제는 charset의 인코딩 문제여서


1. AWS RDB에 연결된 파라미터 그룹의 charset을 utf8로 바꿔주고 

인스턴스 db를 재시작하는 것도 방법이지만






2. 해당 테이블의 char-set을 utf8로 바꿔주는 것도 방법이 될수 있다.



1
ALTER TABLE 테이블명 CONVERT TO character SET utf8;
cs




  1. 독서하는 개발자 2019.03.28 16:19 신고

    좋은정보 잘보고갑니다!!!
    자주 소통해요


1. EC2에서 우분투 인스턴스 하나를 생성한다.


2. putty로 원격 접속해 다음 cmd line을 이용해 실습환경을 셋팅한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1. 최신상태 업데이트
sudo apt-get update;
 
2. apache 설치
sudo apt-get install apache2
 
3. php 설치
sudo apt-get install php
 
4. MySQL 데이터베이스 서버 설치
sudo apt-get install mysql-server
 
5. MySQL 데이터베이스 클라이언트 설치
sudo apt-get install mysql-client
 
6. php와 mysql 연동
sudo apt-get install php-mysql;
 
7. 아파치 php 연동
sudo apt-get install libapache2-mod-php
 
8. 아파치 재시작
sudo service apache2 restart;
cs


3. 명령어를 통해 다 설치가 되면 웹브라우저를 열어 퍼블릭 DNS(IPv4) 를 입력한다.


 3.1 웹서버 아파치가 제대로 설치되었다면 ubuntu 기본페이지가 잘나온다.




 3.2 index.php 파일을 하나 만들어 phpinfo(); 내장함수를 호출해 php정보가 잘 설치되었는지 확인한다.





4. AWS RDS를 생성한다.






mariadb를 선택하고 비용문제가 있으니 프리티어를 꼭 체크해준다.

프리티어를 체크하면 다음단계로 기본설정으로 셋팅되어 진행된다. 






db 인스턴스 이름을 정하고 db에 접근하기 위한 username과 password를 지정한다.(꼭 기억해야함)


기본적으로 자신이 사용하고 싶은 데이터베이스 스키마를 생성할수 있다.

데이터베이스 이름은 o2로 지정하고 생성한다.




RDS 설치가 완료되면 

원활한 테스트환경을 위해 보안그룹을 열어준다.

자신의 RDS의 보안그룹으로 들어가 Inbound를 위치무관으로 설정한다.





테스트 이후에 보안그룹을 재설정하면 된다.



5. mysql이 잘 설치 되었는지 확인하기 위해 접속해본다.




1
2
mysql -h 퍼블릭 DNS(IPv4) 주소 -u RDS계정 -p
mysql -h mydb1.ceczqdx83uhe.ap-northeast-2.rds.amazonaws.com -u sanghyun -p
cs




잘 접속되었다면 rds를 생성할때 기본으로 만들었던 o2 데이터베이스가 잘 만들어졌는지 확인하고

간단한 쿼리도 날려본다.




1
2
3
4
mysql에 접속이 되었다면 
show databases;
use o2;
select * from topic;
cs




6. GUI 환경에서 db를 보고싶으면 heidisql을 깔아 

호스트명에  RDS 엔드포인트를 넣고 마스터 username과 password를 넣고 자신이 생성한 데이터베이스까지 넣어 접속해본다.





7  데이터베이스 스키마의 테이블을 생성하고 샘플데이터를 몇개 넣어서 확인한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 테이블 생성 */
CREATE TABLE `topic` (
`id` int(11NOT NULL AUTO_INCREMENT,
  `title` varchar(100NOT NULL,
  `description` text NOT NULL,
  `author` varchar(30NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (id)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
/* 테이블 조회 */
select * from topic;
 
/* 샘플 데이터 삽입 */
INSERT INTO `topic` (`id``title``description``author``created`VALUES(1'harry potter','magic is power''sanghyun', now());
INSERT INTO `topic` (`id``title``description``author``created`VALUES(2'lord of the ring''ring is mine''sanghyun', now());
INSERT INTO `topic` (`id``title``description``author``created`VALUES(3'venom''black venom is fighter''sanghyun', now());
INSERT INTO `topic` (`id``title``description``author``created`VALUES(4'spiderman','spider is red''sanghyun', now());
cs






8. php파일 만들어 db 연결하기



1
2
3
4
5
6
7
8
9
10
11
// 경로 이동해
cd /var/www/html
 
// db.php 만든다.
sudo vi db.php
 
// rds.php 만든다.
sudo vi rds.php
 
// rds_receiver.php 만든다.
sudo vi rds_receiver.php
cs


db.php 내용은 다음과 같다.


1
2
3
4
5
<?php
// mysqli_connect("엔드포인트주소","사용자이름","비밀번호","db스키마명");
$write = mysqli_connect("mydb2.ceczqdx83uhe.ap-northeast-2.rds.amazonaws.com","sanghyun","abcdefg1234","o2");
$read = mysqli_connect("mydb2.ceczqdx83uhe.ap-northeast-2.rds.amazonaws.com","sanghyun","abcdefg1234","o2");
?>
cs



rds.php 내용은 다음과 같다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTPYE>
<html>
 <head><meta charset="utf-8"></head>
  <body>
  <form action="rds_receiver.php" method="post">
       <p>
         제 목 :
         <input type="text" name="title">
       </p>
       <p>
         본 문 :
         <textarea name="description">
         </textarea>
       </p>
       <p><input type="submit"></p>
   </form>
   <ul>
<?php
include('db.php');
$sql="SELECT * FROM topic";
$result=mysqli_query($read,$sql);
 
while($row=mysqli_fetch_assoc($result)){
 $title=mysqli_real_escape_string($read,$row['title']);
 print("<li>{$title}</li>");
}
?>
    </ul>
   </body>
</html>
cs



rds_receiver.php 내용은 다음과 같다.



1
2
3
4
5
6
7
8
<?php
include('db.php');
$title = mysqli_real_escape_string($write$_POST['title']);
$description = mysqli_real_escape_string($write$_POST['description']);
$sql = "INSERT INTO topic(title, description, author, created) VALUES('{$title}','{$description}','sanghyun',NOW())";
mysqli_query($write,$sql);
header("Location: rds.php");
?>
cs



결과를 확인하면

select와 insert 모두 잘 되는 것을 확인할 수 있었다.






--------------------------------------------------------------------------------------------------------------------------



9. AWS server characterset 변경하기


데이터에 한글을 넣으면 ?나 특수문자 등 깨지는 현상 발생한다면 charset을 utf8로 바꿔줘야한다.





Server characterset과 Db characterset을 utf로 바꾸려면 aws rds의 파라미터그룹으로 접근해

파라미터 편집을 통해 캐릭터셋을 변경해줘야한다. 파라미터 그룹에서 






utf8로 바꾼뒤 db파라미터구성을 수정하여 DB 인스턴스를 재부팅하면 잘 적용되어 나온다.







출처 : https://opentutorials.org/course/2717/11268







1. 구글에 aws marketplace라고 검색하여 공식사이트에 들어가서 wordpress를 검색한다.






2. 환경설정으로 진입해






3. 버전을 확인하고 지역을 서울로 맞추고 launch한다.





4. launch 방법으로는 EC2를 선택하여 진행한다.





5. AWS AMI 선택이 완료된 이후이므로 

인스턴스 타입, 구성, 스토리지, 태그, 보안 그룹을 설정하여 시작한다.

(https://shlee0882.tistory.com/180?category=777755 참고)





6. WordPress 웹서버가 구축되면 퍼블릭 DNS와 IP로 접근이 가능하다.




7. 이제 워드프레스 관리자가 되어야한다.


사용설명서에 /wp-admin 을 붙여서 관리자로 진입하라고 안내하고 있다.

기본 서버 관리자는 'user'이고 비밀번호는 어떻게 얻는지 링크를 통해 안내하고 있다.




웹브라우저에서 ip주소/wp-admin 을 붙여서 url 이동하면 관리자 화면이 나오는데 username은 'user'

password를 알아야한다.





EC2 인스턴스 설정에서 > 시스템 로그 가져오기 




로그를 통해 암호를 확인한다.





아이디와 비밀번호를 넣고 접속하면 성공






이후 관리자의 여러기능을 활용해 수정하고 포스팅하여 자신의 블로그를 운영할 수 있다.








출처 : https://opentutorials.org/course/2717/11268




  1. young7104bb 2020.11.20 00:32

    재미있는 글 되게 잘 배우고 갑니다

  2. kimcs5 2020.11.26 03:05

    도움되는 글 정말 잘 배우고 가요

  3. 익명 2022.09.30 02:12

    비밀댓글입니다


1. AWS 프리티어로 가입 한다. 






가입은 매우 간단하며 자신의 카드를 등록해야하고 인증과정에서 1달러가 결제된다.

카드 등록시 visa, mastercard인지 확인해야 한다. 본인은 체크visa카드로 가입을 진행하였다.



2. AWS > EC2 > 인스턴스 시작 


가입을 완료하고 AWS 많은 서비스 중 EC2 서비스를 선택하여 인스턴스 시작부분으로 진입한다.






3. 우분투 서버 만들기




1단계 우분투 이미지 선택 후





2단계 인스턴스 유형을 선택한다.







3단계 인스턴스 세부 정보 구성은 기본셋팅구성을 가져간다.






4단계 스토리지도 프리티어에서 사용할수 있는 기본 셋팅 되어있는 설정 그대로 가져간다.  


다음을 눌러 태그추가 단계에 들어오면






5단계 태그 추가를 통해 서버의 키(Name)와 값(Value)를 넣어준다.

 





6단계 보안 그룹 구성에 진입하면 SSH는 기본으로 잡혀있고 내 IP만 접속가능하게 설정하고

HTTP 추가를 하고 위치무관하게 잡아준다.






7단계는 지금까지 셋팅한 인스턴스를 어떻게 만들지 점검하고 생성을 누른다.






인스턴스 시작을 하면 키페어 생성 팝업이 나타난다.

키페어 이름은 원하는 것으로 정하고, 키페어 다운로드를 통해 암호화된 비밀번호를 다운받는다.

이미 만들어 놓은 키페어가 있다면 기존 키페어를 사용해도 된다.






다음과 같이 running 상태가 나타나면 서버가 잘 구동된 것이다.






생성한 ubuntu_server를 마우스 우클릭으로 연결하면



r



인스턴스에 연결하는 정보가 뜨게 된다.

퍼블릭 DNS를 가지고 putty나 xshell을 이용해 원격접속하여 제어할 수 있다.




3.1 xshell을 이용해 접속하는 방법



xshell을 실행해 세션의 퍼블릭 DNS의 내용을 호스트 값에 채워넣고





사용자 인증 탭의 사용자 키 부분을 연결시켜준다.






정보를 저장후 연결을 하면 원격으로 ubuntu_webserver가 잘 연결된 것을 확인 할 수 있다.






3.2 putty를 이용해 접속하는 방법



putty를 깔게되면 PUTTYgen이라는 프로그램도 같이 깔리게 된다.


자신의 인스턴스에서 지정한 키페어 이름을 확인하고 

키페어 암호를 파일형식으로 다운받아 


PUTTYgen을 실행시키고 Load를 눌러 다운받은 키페어 파일을 지정하고

Save private key를 눌러 재저장한다. 





ppk파일 형식으로 바뀐 파일을 PuTTY를 실행시켜 SSH > Auth > Browse 에 지정해주고




퍼블릭 DNS를 Host Name에 넣어준다.






연결을 하게 되면 ubuntu 로 로그인하여 접속한다.









-------------------------------------------------------------------------------------------------------------------------------------



3.3 우분투 서버 접속 방법



putty나 xshell을 이용해 접속이 되었다면 cmd명령어를 사용한다.


sudo apt-get update; 

cmd명령어를 통해 최신 업데이트 목록을 갱신시키고




sudo apt-get install apach2;

명령어를 넣어 웹서버 구동에 필요한 아파치2를 설치 한다.

설치 후 서버를 자동으로 실행시켜주는데 

웹브라우저에서 퍼블릭 DNS나 IP주소를 넣어 접속하면 apach2 기본 페이지가 잘 뜨는것을 확인할 수 있다. 



cd /var/www/html

명령어를 이용해 경로로 이동한뒤 sudo rm index.html 로 파일을 지우고 sudo nano index.html 로 파일을 재생성하여 코딩한다.





잘 반영되었는지 확인한다.









--------------------------------------------------------------------------------------------------------------------------------------------





4. 윈도우 서버 만들기




1단계에서 윈도우 서버 이미지를 선택하고






2,3 단계는 기본 설정으로 가져가고

4단계에서 윈도우 서버 기본크기가 30GB 이상인지 확인한다.






5단계에서 서버의 이름을 설정하고






6단계에서 보안그룹 설정을 통해 http가 위치 무관하게 어디든 접속 가능하게 설정한다.






7단계를 통해 인스턴스가 생성된 후 마우스 오른쪽 버튼 연결을 누른다.






생성한 키페어를 불러와 인스턴스에 연결시켜준다.










암호해독을 눌러 암호를 디코드한다.






원격 데스크톱 파일다운로드를 눌러 실행하면 






윈도우 서버로 연결된다.


윈도우 서버에서 Server Manager를 찾아서 실행 시킨뒤 Local Server에서 IE 보안 관련설정을 OFF해준다.






Service Manager에서 Manage > Add Roles and Features 를 눌러






Web Server(IIS) 를 설치해준다.






설치가 완료되면 Service Manager에 IIS가 생기게 되고 IIS Manager를 실행한다.





explore를 눌러







해당 위치에 메모장을 사용하여 index.html 파일을 간단하게 만들어 저장한다.







윈도우 서버컴퓨터에서 http://localhost/index.html 접속하면 잘나오는것을 확인했다.





로컬위치가 아닌 퍼블릭 DNS에서도 잘나오는지 확인이 필요해 AWS 콘솔에서 DNS주소에 index.html 붙여서 접속한다.







잘 반영되어 나오는 것을 확인할 수 있다.







출처 : https://opentutorials.org/course/2717/11268







1. EC2 인스턴스란?


EC2 인스턴스는 aws 컴퓨터를 임대하여 할당받는 것을 말한다.

물리적 컴퓨터 기계 위에 가상머신을 올려 

현재는 구성할 수 없는 저렴한 컴퓨터부터 강력한 비싼 컴퓨터까지 탄력적으로 만들 수 있다.  



2. aws ami


aws에서는 인스턴스를 생성할때 웹서버로 구성할 운영체제를 선택할 수 있다.

linux, ubuntu, window server 등 자신이 원하는 운영체제를 가상머신위에 올릴수 있다.



웹서버를 선택하여 처음부터

자신이 만들고 싶은 사이트를 설치 및 구성 하는 것은 시간도 많이 소요되고 어려운 일이다.


그래서 aws에서는 구글마켓플레이스처럼 

사용자가 원하는 사이트를 바로 구축하여 운영할 수 있게 

기본 셋팅을 이미지 형태로 제공하고 있다.

자신이 블로그를 만들고 싶다면 대표적으로 워드프레스를 검색하여 인스턴스로 바로 만들수 있다.

 


3. scale up 전략




예전 전통적인 모델 같은 경우 웹 서버를 구축하여 운영할 시 

사용자의 컴퓨터 서비스적 수요가 늘어나면 공급업체에서는 그 서비스를 원활히 운영하기 위해

더 좋은 컴퓨터로 업그레이드하여 서비스적 자원의 공급을 늘렸다.


그 과정에서 공급보다 수요가 많아지면 사용자의 서비스 품질 저하와 공급의 문제점이 발생한다.

또한 수요가 항상 많다가 갑자기 적어질 경우 불필요한 공급으로 인해 공급비용이 낭비되는 문제가 생긴다.


aws 클라우드 컴퓨팅 모델의 경우 변화하는 수요에 따라 탄력적으로 공급이 가능하다.



4. Elastic Ips 


aws에서는 한정된 ip주소를 가지고 있어 ( 0.0.0.0~255.255.255.255 ip주소가 한정적 )

사용자가 running한 인스턴스가 종료하게 되면 할당한 ip주소를  회수해 간다.

다시 인스턴스를 run하면 바뀐 ip주소를 부여해준다.


운영하던 인스턴스를 종료하고 다시 실행했을 시 

기존의 사용하던 ip주소가 바뀌면 문제가 생긴다.


이러한 문제로

사용자는 aws의 Elastic Ips (엘라스틱 아이피)를 할당받아 자신의 인스턴스에 부여하여 연결할 수 있다.


엘라스틱 아이피를 인스턴스에 연결하게 되면 인스턴스를 종료하고 다시 실행 했을 시

ip주소가 바뀌지 않는다.



5. 확장성을 위한 부하 테스트


aws 인스턴스 2대를 running하여

1대는 자신이 운영하고 있는 인스턴스

1대는 공격하려는 인스턴스

로 구성하여


우분투에서 ab -n 400 -c 100 http://ip주소/ 명령어를 사용하여

테스트를 진행한다.(요청은 400 , 동시접속 100 , 접속할 주소 http://)


결과를 통해 자신의 인스턴스를 확장해야 할지 말지 결정할 수 있다.



6. scale-up 방법


스케일 업 하려는 기존의 인스턴스를 이미지로 만들어

확장하려는 유형의 자원을 할당하여 인스턴스를 생성한다.

엘라스틱 아이피를 할당한다.


7. scale-out 방법


판도라는 숲의 특성은 뿌리가 하나여서 숲은 하나의 나무이다.

하나의 뿌리를 공유하고 있는 뿌리가 나무의 개체를 결정한다고 한다면

하나의 거대한 나무가 숲을 이루고 살아간다.


scale-out은 여러대의 컴퓨터가 협력하여 동일목표를 달성을 위해

일하는 컴퓨터들의 사회를 만드는 것이다.


사용자가 많아져 서비스 이용이 많아지면 


web server : 아파치, 엔진엑스

middle ware : php, jsp, spring

database : mysql, oracle

웹서버, 미들웨어, 데이터베이스 에 부하가 생긴다. 


이 부하를 1대의 컴퓨터가 아닌 3대의 컴퓨터로 일을 처리할 수 있고


ELB(elastic load banlancecr 부하분배기)로 여러개 인스턴스를 사용해서 부하를 감당한다.


8. auto scaling


서비스 이용이 많아지면 컴퓨터를 자동으로 생성해서

바로 서비스를 시작하게 했다가


서비스 이용이 적어지면 컴퓨터를 자동으로 삭제해서

과금발생 안하게함


인스턴스의 생성과 삭제를 auto로 반복한다.




출처 : https://opentutorials.org/course/2717/11268





+ Recent posts