귀염둥이의 메모

[AWS] 웹 서버에서 php 실행 및 MySQL 연동하기, RDS, EC2, VPC 본문

Infra & Devops/AWS

[AWS] 웹 서버에서 php 실행 및 MySQL 연동하기, RDS, EC2, VPC

겸둥이xz 2021. 9. 2. 23:35
반응형

원래 하고 싶었던 것

  • 이렇게 Multi AZ 를 이용해서 만들어 보고 싶지만
  • RDS 프리티어는 다중 AZ 지원을 하지 않음!!!

 

실제 결과물

  • 이렇게 같은 AZ 이거나 다른 AZ 에 만들어 보겠음

 

 

VPC 마법사를 이용해서 Public Subnet과 Private Subnet 만들기

탄력적 IP 먼저 할당

  • VPC를 생성하기 전에 탄력적 IP를 할당해주자

 

VPC  마법사 

  • [VPC 마법사 시작]

 

  • [퍼블릭 및 프라이빗 서브넷이 있는 VPC] > [선택]

 

  • 퍼블릭과 프라이빗을 같은 가용 영역으로 지정해주고, 만들었던 탄력적 IP 할당하자
  • 둘 다  가용 영역을 ap-northeast-2a 로 설정
  • [VPC 생성]

 

RDS 네트워크 및 보안 설정

private subnet 2 생성

  • 다른 가용 영역을 선택해줍니다 ap-northeast-2c

 

웹 서버용 보안 그룹 생성

  • VPC를 우리가 만든 Tutorial VPC로 지정해주고
  • 웹 서버용이니까 인바운드 규칙에 SSHHTTP를 모두로 추가한다
  • 원래 SSH 접속을 나만 허용해야 하는데 실습하고 삭제할 예정이니 모두로 해도 상관없다

 

RDS용 보안그룹 생성

  • [서비스] > [RDS] > 좌측 메뉴 [서브넷 그룹] > [DB 서브넷 그룹 생성]
  • Tutorial VPC로 지정하고
  • MySQL을 사용할거니까 지정해주고
  • 소스에 아까 만든 웹 서버용 보안그룹을 사용하는 것만 허용할 수 있게 선택해준다
  • 어차피 웹 서버용 인스턴스 하나만 WebServer 보안 그룹을 사용할 것이다

 

DB 서브넷 그룹 생성

  • 이름, VPC 설정
  • Private Subnet 1, 2 가 포함 되어있는 가용 영역을 선택해 준다
  • 그리고 Private Subnet 1, 2 를 선택해준다

 

RDS DB 인스턴스 생성

  • [RDS] > [데이터베이스 생성]
  • 표준 생성, MySql 선택
  • 버전 정보 : MySQL 5.7.30
  • 프리티어
    • 프리티어는 Multi AZ 를 지원하지 않는다... 🤣
  • ⭐️ 마스터 사용자 : tutorial_user 
  • ⭐️ 마스터 암호 : 12345678
    • 사용자랑 암호는 꼭 기억하자

 

  • 서브넷 그룹 아까 만든 거로 지정해준다
  • 퍼블릭 액세스는 아니요 : 어차피 VPC 내부에서만 접근할 거다 외부에서 접근할 일 없음
  • VPC 보안 그룹 : 아까 만든 tutorial-db-securitygroup
  • 가용 영역 : 선택 없음으로 해도 상관없다 하지만 ap-northeast-2a 로 하겠음
    • Multi AZ 를 하고 싶어서 가용 영역 여러 개를 설정했었는데 프리티어여서 의미가 없어졌다 😭
    • 그래도 Multi AZ 배포를 한다고 생각하고 하자~
  • 포트는 3306

 

  • 추가 구성에서 초기 데이터 베이스 이름 sample 지정하자
  • 그리고 마지막으로 [생성] 버튼을 누르고 5분~ 10분을 기다리자!!
  • 기다릴 동안 ec2에 Apache랑 php 설치 고고

 

EC2 생성하고 Apache, php 설치하기

  • EC2로 넘어가서 Amazon Linux -> t2.micro 
  • 3단계에서 Tutorial-VPC 지정
  • 서브넷은 Public Subnet으로 지정
  • 퍼블릭 IP 자동 할당 활성화
  • 6단계 보안 그룹 구성으로 넘어가자

 

  • 기존 보안 그룹 선택
  • 아까 만들었던 WebServer용 보안 그룹을 선택하자
  • [검토 및 시작]

 

EC2 접속해서 apache, php 설치 

sudo yum -y update
sudo yum -y install httpd php php-mysqlnd
  • update 해주고 설치 고고

 

sudo systemctl start httpd
sudo systemctl enable httpd
  • 아파치 실행 고고

 

  • 인스턴스 퍼블릭 IP로 접속해보자
  • 그리고 RDS 생성되었는지 확인

 

웹 서버 루트 페이지 수정을  위한 설정

sudo groupadd www
sudo usermod -aG www ec2-user
exit
  • 웹 서버 기본 루트 페이지 수정을 하기 위해 /var/www 디렉토리의 소유권 및 권한을 변경하자
  • www 그룹을 추가해주고 ec2-user 보조 그룹으로 지정

 

  • 재접속 후 groups로 확인

 

sudo chown -R root: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 {} +
  • /var/www 의 그룹 소유권을 www 그룹으로 변경
  • /var/www 와 하위 디렉토리에 그룹 쓰기 권한을 추가하고, 나중에 생성될 하위 디렉토리에서 GID 설정
  • /var/www 및 하위 디렉토리의 파일 권항을 변경

 

RDS DB 인스턴스에 Apache 웹 서버 연결

  • /var/www 에 inc 디렉토리 생성

 

vi dbinfo.inc


<?php
define('DB_SERVER', 'tutorial-db-instance.c8mygpyjttdj.ap-northeast-2.rds.amazonaws.com');
define('DB_USERNAME', 'tutorial_user');
define('DB_PASSWORD', '12345678');
define('DB_DATABASE', 'sample');
?>
  • vi 에디터로 해당 내용을 작성
  • DB_SERVER 에는 자신의 RDS MySQL 인스턴스 엔드포인트
  • 아까 RDS 설정했던 대로 작성해줍니다 그리고 저장

 

cd /var/www/html
vi SamplePage.php
<?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;

}

?>
  • /var/www/html 로 이동해서 SamplePage.php 작성하고 저장

 

  • http://ec2퍼블릭주소/SamplePage.php 접속

 

  • 이름, 주소 등록 및 조회
  • 잘 작동한다~

 

EC2에서 MySQL DB 인스턴스 접속해보기

 

sudo yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
sudo yum install -y mysql-community-client
mysql --version
  • 그냥 설치하면 낮은 버전이 설치될 수 있다
  • 위에 처럼 mariadb 설치하고
  • mysql 버전 확인

 

mysql -h [MySQL 인스턴스 엔드포인트] -P 3306 -u tutorial_user -p
  • 비밀번호 12345678 입력

 

  • sample 데이터 베이스 확인

 

  • 테이블 조회하면 아까 우리가 넣었던 것들이 조회된다 😊

 

반응형
Comments