2020. 9. 2. 10:50ㆍAWS/Practice
1. MySQL DB
PHP가 있는 Apache 서버를 설치하고 RDS로 생성한 MySQL DB를 이용하여 PHP 애플리케이션에서 MySQL에 저장된 데이터를 서비스할 수 있도록 구성한다.
1) VPC 및 서브넷 생성
생성한 VPC에 다른 서브넷을 추가로 생성한다. 서브넷 생성 시 VPC는 이전에 생성한 VPC로 설정하고 가용역역은 이전에 선택한 가용 영역과 다른 가용 영역으로 설정한다.
2) 보안 그룹 생성
새로 생성하는 2개의 보안 그룹중 하나는 이전에 생성한 VPC 정보를 기입하고 SSH는 내 IP, HTTP는 위치 무관으로 인바운드 규칙을 설정한다. 다른 보안 그룹은 RDS용으로 생성한다.
3) RDS 서브넷 그룹 생성
가용 영역과 서브넷은 모두 선택하여 생성한다.
4) RDS DB 인스턴스 생성
MySQL은 5.7.30 버전으로 프리티어로 생성한다. 연결 항목에는 생성한 VPC로, VPC 보안 그룹은 이전에 생성한 보안 그룹을 선택한다. 추가 구성에는 데이터베이스명을 지정하고 생성한다.
2. Apache 웹 서버 (PHP)
1) EC2 인스턴스 생성
2) EC2 보안 그룹 변경
3) Apache, PHP 설치
최신 버그 수정 및 보안 업데이트, PHP 소프트웨어 패키지가 포함된 Apache 웹 서버를 설치하고 서비스를 가동한다(서버 부팅하라 때마다 자동으로 가동할 수 있도록 추가 설정). 이 후 인스턴스의 퍼블릭 DNS(IPv4) 정보를 복사하여 웹 사이트 접속 여부를 확인한다.
// 최신 버그 수정 및 보안 업데이트
sudo yum update -y
// PHP 소프트웨어 패키지가 포함된 Apache 웹 서버 설치
sudo yum install -y httpd24 php56 php56-mysqlnd
// 서비스를 가동
sudo service httpd start
sudo chkconfig httpd on
4) 그룹 추가 및 권한 변경
로그인 중인 ec2-user로 웹 서버의 기본 루트 페이지 파일을 수정 변경 가능하도록 설정하기 위해 /var/www 디렉터리의 소유권 및 권한을 변경한다. www 그룹을 추가하고 /var/www에 소유권과 권한을 부여하고 재접속한다. 이 후 /var/www 디렉터리 및 해당 콘텐츠의 그룹 소유권을 www 그룹으로 변경한다.
이어서 /var/www 및 하위 디렉터리의 권한을 변경하고 나중에 생성될 하위 디렉터리의 그룹 ID를 설정한다. 또한 /var/www 및 하위 디렉터리의 파일 권한을 계속 변경해서 그룹 쓰기 권한을 추가한다.
// 그룹 추가 및 권한 부여
sudo groupadd www
sudo usermod -a -G www ec2-user
exit
// /var/www/ 그룹 소유권 및 권한 변경
sudo chown -R root:www /var/www
// /var/www/ 및 하위 디렉터리의 권한 변경 및 생성될 하위 디렉터리 그룹 ID, 쓰기 권한 설정
sudo chmod 2755 /var/www
find /var/www -type d -exec sudo chmod 2775 {} +
find /var/www -type f -exec sudo chmod 0664 {} +
3. RDS DB 인스턴스 Apache 웹 서버 연결
Amazon RDS DB 인스턴스에 연결되는 Apache 웹 서버에 콘텐츠를 추가한다.
1) 폴더 및 파일 생성
EC2 인스턴스에 계속 연결되어있는 동안 inc 하위 디렉터리를 생성하고, inc 디렉터리 하위에 dbinfo.inc 파일을 생성한다.
cd /var/www
mkdir inc
cd inc
>dbinfo.inc
nano dbinfo.inc
/var/www/inc/
dbinfo.inc
<?php
define('DB_SERVER', '[RDS MySQL DB 인스턴스 엔드포인트(포트없음)]');
define('DB_USERNAME', 'tutorial-user');
define('DB_PASSWORD', '[비밀번호]');
define('DB_DATABASE', 'sample');
?>
2) HTML 파일 생성
/var/www/html 디렉토리 하위에 HTML 파일을 생성한다. 이 후 직접 웹 서버에 접속하여 동작을 확인한다.
/var/www/html/
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) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(45),
ADDRESS VARCHAR(90)
)";
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;
}
?>
[참고] 아마존 웹 서비스 AWS Discovery Book
'AWS > Practice' 카테고리의 다른 글
[Practice] Practitioner ELB (0) | 2020.09.03 |
---|---|
[Practice] Practitioner Route 53 (0) | 2020.09.02 |
[Practice] Practitioner MySQL (1) (0) | 2020.09.02 |
[Practice] Practitioner VPC/서브넷, Peering (0) | 2020.09.01 |