[AWS] 웹 서버에서 실행되는 php 애플리케이션에 MySQL DB 연동(with EC2, RDS, VPC)

Fabro·2021년 9월 4일
0
post-thumbnail

웹 서버에서 실행되는 php 애플리케이션에 MySQL DB 연동

만들어 볼 결과물!

RDS Free Tier는 AZ(가용 영역)을 한개만 사용 가능하기 때문에 서로 다른 AZ에 각각 RDS를 만드는 실습은 다음에 해보자..!!

1. 탄력적(Elastic) IP 할당하기

  • VPC 마법사를 이용해서 Public Subnet과 Private Subnet을 간단하게 만들 거다. 만드는데 탄력적 IP가 필요하므로 미리 할당 받아두자(VPC 마법사 만드는 중간에 할당 받으려면 다시 나갔다 들어와야 하니까 미리 할당 받자)
    VPC 메뉴바에서 탄력적 IP -> 탄력적 IP 주소 할당 Click
    그냥 기본 설정 그대로 두고 할당 Click! 참고로 네트워크 경계 그룹의 'ap-northeast-2'는 서울 리전을 나타냄

2. VPC 마법사 생성하기

  • 이전 포스트에서 VPC를 직접 구축해 봤는데 사실 VPC 마법사를 이용하면 VPC 구축하면서 했던 노가다를 안하고 손쉽게 만들수 있다!!! 그래도 직접 해보는건 중요하니까 한번씩 해보고 이해하도록 하자!
    VPC 대시보드에서 VPC 마법사 시작 Click
    퍼블릭 및 프라이빗 서브넷이 있는 VPC 누르고 선택하자. 푸르딩딩한 네모 박스를 보면 약간 우리가 만들 결과물과 비슷하게 생겼다. 한개의 AZ 안에 한개의 퍼블릭 서브넷과 한개의 프라이빗 서브넷...!
    이렇게 설정하면 된다. 파란 밑줄이 있는 부분은 초기값 그대로다. VPC 이름은 Study-VPC로 해줬고 퍼블릭 서브넷, 프라이빗 서브넷도 각각 이름을 지어줬다. 여기서 중요한건 퍼블릭 서브넷과 프라이빗 서브넷의 가용 영역을 같은 가용 영역(여기선 ap-northeast-2a)로 해야 한다는 점이다. 왜냐면, RDS Free Tier는 한개의 AZ만 가능하니까..ㅎㅎㅎ

3. RDS 네트워크 및 보안 설정

  • RDS DB 인스턴스를 VPC에서 사용하기 위한 RDS DB 서브넷 그룹을 생성하기 위해 프라이빗 서브넷을 한개 추가하자
    Study-VPC를 선택해 주고 가용 영역은 아깐 2a로 만들었으니까 이번엔 2c로 만들자. IP주소는 아까 퍼블릭, 프라이빗 서브넷에 각각 10.0.0.0/24, 10.0.1.0/24를 할당 해줬으니 이번엔 10.0.2.0/24로 할당 해주자
    서브넷 리스트를 봤을 때 이렇게 세개 있으면 된다.

  • 이번엔 보안 그룹 설정을 위해 보안 그룹을 생성하자 먼저, 보안 그룹에서 보안 그룹 생성 클릭하자
    보안 그룹 이름 지어주고 설명은 용도에 맞게 잘 적어주고 VPC는 우리가 사용할 VPC를 선택하자
    인바운드 규칙에 SSH와 HTTP를 추가 해주자

  • 다음으로 RDS용 보안 그룹을 생성하자 위에서 보안 그룹 만들었던 것처럼 만들면 된다.
    이름 지어주고 설명 적어주고 VPC는 아까처럼 우리가 사용할 VPC 선택
    인바운드 규칙에 MySQL이 유형을 추가해준다. 접속자는 아까 위에서 만든 study-securitygroup을 선택하자(RDS 보안 그룹에 웹 서버용 보안그룹만 추가해서 웹 서버용 인스턴스만 사용 가능하게 만들기 위해서!) 설정 다 했으면 생성 누르자!

  • 이제 데이터베이스를 구동시킬 서브넷들을 지정시키기 위해 서브넷 그룹을 생성하자 VPC에서 RDS로 이동 후 좌측 서브넷 그룹에 들어가서 DB 서브넷 그룹 생성을 하자
    서브넷 그룹 이름 지어주고 VPC는 똑같이 우리가 만든 걸로! 가용 영역은 프라이빗 서브넷이 존재하는 가용 영역을 전부 선택하고 프라이빗 서브넷만 추가하자(퍼블릭 서브넷 추가 안하도록 주의! 퍼블릭 서브넷에 db 저장할거 아니잖아요~) 서브넷 선택된거 확인하고 생성을 누른다.

4. RDS DB 인스턴스 생성

메뉴바에서 RDS -> 데이터베이스 -> 데이터베이스 생성 Click 표준 생성, MySQL 선택!우리는 5.7.30버전에서 할 거니까 버전 바꿔주고 템플릿은 프리티어로 선택DB 인스턴스 식별자 적어주고 마스터 사용자 이름, 마스터 암호를 입력하자!
나는 귀찮아서 암호는 12345678로 했다.
마스터 사용자 이름과 마스터 암호는 절대로 까먹으면 안됨!!!!아래로 쭉쭉 내려와서 VPC 선택하고 생성해둔 서브넷 그룹, 보안그룹, 가용영역을 선택하자. 추가구성을 보면 데이터베이스 포트가 있는데 이건 처음부터 3306이다. 미리 생성할 데이터베이스 이름을 입력해주자.
데이터베이스 설정은 여기서 끝이자 이제 생성을 눌러서 db 생성을 마치고 활성화 될 때까지 5-10분 기다리자.

5. EC2 인스턴스 생성 및 Apache, php 설치하기

위 처럼 인스턴스를 생성하자
단계 3에서 VPC를 선택하고 서브넷은 Public 서브넷, 퍼블릭 IP 자동 할당은 활성화 해주자
단계 6에선 기존에 만들어 뒀던 study-securitygroup을 선택하자
이렇게 인스턴스를 만들었다면 이제 ssh로 인스턴스에 접속하자

이제 Apache와 php를 설치하자

sudo yum -y update
sudo yum -y install httpd php php-mysqlnd

sudo systemctl start httpd
sudo systemctl enable httpd

인스턴스에 접속해서 yum install로 httpd와 php, php-mysqlnd를 설치
systemctl 명령어로 httpd를 실행시키자
이렇게 설정 후에 크롬에서 EC2 인스턴스의 Public IP로 접속해 보면 아래와 같은 화면이 나온다.

이렇게..! 아파치 웹 서버가 잘 연결된 걸 확인할 수 있다.

웹 서버 수정을 위한 권한 설정

이제 웹 서버 수정을 위해서 권한을 설정하자

sudo groupadd www
sudo usermod -aG www ec2-user
exit

웹 서버 루트 페이지 수정을 위해 'www'라는 그룹을 만들고 ec2-user의 보조 그룹으로 설정하고 exit로 나갔다가 다시 접속해보자

groups
id

다시 접속해서 group, id 명령어를 입력하면 'www'라는 그룹이 추가된 걸 볼 수 있고, id에서 보조 그룹으로 'www'가 등록된것도 볼 수 있다.

이제 /var/www의 그룹 소유권을 root에서 www로 변경하자

sudo chown root:www /var/www

그리고 /var/www와 하위 디렉토리에 그룹 쓰기 권한을 추가하고 하위 디렉토리와 파일의 권한을 변경하자

sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} +
find /var/www -type f -exec sudo chmod 0664 {} +

6. RDS DB 인스턴스와 웹 서버 연결

/var/www에 inc 디렉토리를 만들고 dbinfo.inc라는 파일을 생성하자

<?php
define('DB_SERVER', 'study-db-instance.c74uers7erov.ap-northeast-2.rds.amazonaws.com');
define('DB_USERNAME', 'tutorial_user');
define('DB_PASSWORD', '12345678');
define('DB_DATABASE', 'test_db');
?>

파일 안의 내용은 이렇게 설정하자
DB_SERVER : RDS DB의 엔드포인트
DB_USERNAME : 데이터베이스 생성에서 입력한 마스터 사용자 이름
DB_PASSWORD : 데이터베이스 생성에서 입력한 마스터 암호
DB_DATABASE : 데이터베이스 생성에서 만든 데이터베이스 이름

그 다음 /var/www/html폴더로 이동해서
SamplePage.php라는 파일을 만들어주자

cd /var/www/html
vi SamplePage.php

파일 안에 아래와 같이 입력하고 !wq

<?php include "../inc/dbinfo.inc"; ?>

<html>

<body>

<h1>Sample page</h1>

<?php

 /* Connect to MySQL and select the database. */

  $connection = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD);

  if(mysqli_connect_errno()) echo "Failed to connect to MySQL: " . mysqli_connect_error();

   $database = mysqli_select_db($connection, DB_DATABASE);

  /* Ensure that the Employees table exists. */

  VerifyEmployeesTable($connection, DB_DATABASE);

  /* If input fields are populated, add a row to the Employees table. */

  $employee_name = htmlentities($_POST['Name']);

  $employee_address = htmlentities($_POST['Address']);

   if(strlen($employee_name) || strlen($employee_address)) {

    AddEmployee($connection, $employee_name, $employee_address);

  }

?>

<!-- Input form -->

<form action="<?PHP echo $_SERVER['SCRIPT_NAME'] ?>" method="POST">

  <table border="0">

    <tr>

      <td>Name</td>

      <td>Address</td>

    </tr>

    <tr>

      <td>

        <input type="text" name="Name" maxlength="45" size="30" />

      </td>

      <td>

        <input type="text" name="Address" maxlength="90" size="60" />

      </td>

      <td>

        <input type="submit" value="Add Data" />

      </td>

    </tr>

  </table>

</form>

<!-- Display table data. -->

<table border="1" cellpadding="2" cellspacing="2">

  <tr>

    <td>ID</td>

    <td>Name</td>

    <td>Address</td>

  </tr>

<?php

$result = mysqli_query($connection, "SELECT * FROM Employees");

while($query_data = mysqli_fetch_row($result)) {

  echo "<tr>";

  echo "<td>",$query_data[0], "</td>",

       "<td>",$query_data[1], "</td>",

       "<td>",$query_data[2], "</td>";

  echo "</tr>";

}

?>

</table>

<!-- Clean up. -->

<?php

  mysqli_free_result($result);

  mysqli_close($connection);

?>

</body>

</html>

<?php

/* Add an employee to the table. */

function AddEmployee($connection, $name, $address) {

   $n = mysqli_real_escape_string($connection, $name);

   $a = mysqli_real_escape_string($connection, $address);

   $query = "INSERT INTO `Employees`(`Name`, `Address`) VALUES('$n', '$a');";

   if(!mysqli_query($connection, $query)) echo("<p>Error adding employee data.</p>");

}

/* Check whether the table exists and, if not, create it. */

function VerifyEmployeesTable($connection, $dbName) {

  if(!TableExists("Employees", $connection, $dbName))

  {

     $query = "CREATE TABLE `Employees`(

         `ID` int(11) NOT NULL AUTO_INCREMENT,

         `Name` varchar(45) DEFAULT NULL,

         `Address` varchar(90) DEFAULT NULL,

         PRIMARY KEY(`ID`),

         UNIQUE KEY `ID_UNIQUE`(`ID`)

      ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1";

     if(!mysqli_query($connection, $query)) echo("<p>Error creating table.</p>");

  }

}

/* Check for the existence of a table. */

function TableExists($tableName, $connection, $dbName) {

  $t = mysqli_real_escape_string($connection, $tableName);

  $d = mysqli_real_escape_string($connection, $dbName);

 

  $checktable = mysqli_query($connection,

      "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = '$t' AND TABLE_SCHEMA = '$d'");

  if(mysqli_num_rows($checktable)> 0) return true;

  return false;

}

?>

입력이 끝났으면 이제 크롬에서 잘 나오는지 확인하자

http://인스턴스의PublicAddress/SamplePage.php



위 처럼 이름과 주소를 입력하고 Add Data를 클릭했을 때 데이터가 추가되면 잘 작동하고 있는 것이다.

MySQL DB에 접속해보자
이제 다시 ssh로 접속한 인스턴스에서 MySQL DB에 접속해서 데이터가 잘 저장되었는지 확인하자

sudo yum -y install https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
sudo yum -y install mysql-community-client
mysql --version

위 처럼 MySQL을 설치하고 버전을 확인하자

mysql -h [MySQL DB EndPoint] -P 3306 -u study_user -p
password : 12345678

위 처럼 입력해서 MySQL에 접속하고 비밀번호는 마스터 암호를 입력하자
이제 데이터베이스에 접속 되었으니 확인만 하면 된다!!!

show databases; 명령으로 우리가 데이터베이스 인스턴스를 만들면서 같이 생성한 test_db가 있는걸 확인하고 use test_db 명령어로 데이터베이스를 변경하자

그 다음 데이터베이스 안에 있는 테이블을 확인하고 select 명령어로 테이블을 조회하면 우리가 추가했던 데이터들이 잘 추가된 걸 볼 수 있다~~!!!!


References

profile
엔지니어 유망주의 곡괭이질

0개의 댓글