[섹션 2] LAMP 웹 서버 및 Application Load Balancer 구성(1)
● 개요
: 클라우드 네트워크 환경에서 Linux 기반 가상 서버에 Apache 웹 서버, MySQL 데이터베이스, PHP 어플리케이션을 구성하고 Application Load Balancer을 이용하여 이중화 된 네트워크 구성
● 서비스
- Amazon VPC (VPC, Subnet, Internet Gateway, Route Table, NAT Gateway...)
- Amazon EC2
- Amazon EBS(Elastic Block Store)
- Amazon EFS(Elastic File Store)
- Elastic Load Balancer - Application Load Balancer
● 아키텍처 다이어그램
VPC: 네트워크
Subnet(서브 네트워크): 네트워크 내부의 네트워크
Public Subnet: 외부 인터넷과 직접적으로 통신 가능
Private Subnet: 외부 인터넷과 직접적으로 통신 제한
Internet Gateway: Internet Gateway를 통해 Public Subnet의 EC2 외부 인터넷과 통신
EFS: Public Subnet의 EC2와 마운트 타켓으로 연결하여 파일 저장 및 공유
Application Load Balancer: 네트워크 트래픽 분산 서비스
웹 서버 - 보안 상의 이유로 Private Subnet에 위치 시킨다. 하지만 외부 인터넷으로 직접적 통신 안된다. 따라서 Public Subnet에 위치한 EC2를 통해 Private Subnet의 EC2에 접근한다.
중개 서버(Bastion Host, 배스천 호스트) - 웹 서버(Private Subnet의 EC2)에 접근시키는 Public Subnet에 위치한 EC2
=> 웹 서버가 외부 인터넷과 직접적으로 통신하지 않도록 하면서, 안정적인 인프라 구성
● 구현 순서
ㄱ. 기본 네트워크 환경 구성
1) VPC 생성
2) Subnet 생성
3) Internet Gateway 생성
4) Route Table 생성 및 Route 설정
ㄴ. Public EC2 인스턴스 생성 및 LAMP 웹 서버 구성
1) EC2 생성
- AMI
- LAMP 웹 서버 구성
- Security Group
- Storage(EBS)
- Key pair
2) Index.php 생성
3) 웹 브라우저에서 LAMP 웹 서버 작동 테스트
ㄷ. Custom AMI를 통한 Public EC2 인스턴스 생성
1) Custom AMI 생성
2) Custom AMI를 통해 EC2 추가
3) 웹 브라우저에서 LAMP 웹 서버 작동 테스트
ㄹ. EFS를 통한 네트워크 파일 시스템 구성
1) EFS 용 Security Group
2) EFS 생성
- Availability
- Lifecycle
- Performance/Throughput mode
- Network
..
3) EFS - EC2 마운트
4) 웹 브라우저를 통한 EFS 마운트 테스트
ㅁ. Application Load Balancer를 통한 이중화 네트워크 구성 (1)
1) Target Group 생성
- Target type
- Protocol/Port
- Target registration
...
2) Application Load Balancer 구성
- Scheme
- Network
- Security Group
- Lisner/Rule
...
3) 웹 브라우저를 통한 Application Load Balancer 작동 테스트
ㅂ. Bastion host와 NAT Gateway를 통한 Private EC2 인스턴스의 외부 통신 구성
1) Private Subnet에 EC2 생성
2) Public Subnet의 EC2를 통해 Private Subnet의 EC2에 접속
- Key pair 생성
3) NAT Gateway 생성
4) Route Table 설정
5) Private Subnet의 EC2의 외부 통신 테스트
ㅅ. Application Load Balancer를 통한 이중화 네트워크 구성 (2)
1) Target Group 생성
2) Application Load Balancer 구성
3) 웹 브라우저를 통한 Application Load Balancer 작동 테스트
● 구현
ㄱ. 기본 네트워크 환경 구성
1) VPC 생성
- IPv4 CIDR: 10.1.0.0/16
(lab-vpc) 우클릭 > VPC 설정 편집 > DNS 호스트 이름 활성화(v)
2) Subnet 생성
public-subnet-a1 - ap-northeast-2a, IPv4 subnet CIDR block: 10.1.1.0/24
public-subnet-c1 - ap-northeast-2c, IPv4 subnet CIDR block: 10.1.2.0/24
private-subnet-a1 - ap-northeast-2a, IPv4 subnet CIDR block: 10.1.3.0/24
private-subnet-c1 - ap-northeast-2c, IPv4 subnet CIDR block: 10.1.4.0/24
private-subnet-a2 - ap-northeast-2a, IPv4 subnet CIDR block: 10.1.5.0/24
private-subnet-c2 - ap-northeast-2c, IPv4 subnet CIDR block: 10.1.6.0/24
3) Internet Gateway 생성
: 외부 인터넷과 통신 가능하게 함
-> 특정 VPC에 연결
4) Route Table 생성 및 Route 설정
: 목적지 데이터 패킷(트래픽) 이동 정보를 구성하는 규칙a. 특정 서브넷에 연결서브넷 연결 > 편집
b. 인터넷 게이트웨이 설정
-> 0.0.0.0/0: 트래픽이 인터넷 게이트웨이를 통해 외부로 나감 (퍼블릭만)
-> 프라이빗 서브넷 각각 라우팅 테이블 생성 및 연결
=> 3), 4) 자원(리소스)와 외부 인터넷 사이에 트래픽이 이동할 수 있는 경로 구성
ㄴ. Public EC2 인스턴스 생성 및 LAMP 웹 서버 구성
1) EC2 생성
- AMI
- LAMP 웹 서버 구성
- Security Group: public-ec2-sg
- Storage(EBS): 1x8 GIB gp2
- Key pair: ec2-public-seoul
a. EC2 인스턴스 생성 (public-ec2-a1)
-> Amazon Linux 2023 AMI의 경우 아래 스크립트 실행 안됨
-> 소스 유형(사용자 지정), 원본: 출발지
-> 유형(HTTP, HTTPS): (웹 사이트)
#!/bin/bash
yum update -y
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum install -y httpd mariadb-server
systemctl start httpd
systemctl enable httpd
usermod -a -G apache ec2-user
chown -R ec2-user:apache /var/www
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod 0664 {} \;
b. 탄력적 IP 생성 및 연결
키: Name
값: eip-public-ec2-a1
c. 인스턴스 연결(SSH 접속)
(Key pair 위치로 이동)
> chmod 400 ec2-public-seoul.pem
> ssh -i "ec2-public-seoul.pem" ec2-user@ec2-3-39-164-241.ap-northeast-2.compute.amazonaws.com
2) Index.php 생성
> cd var/www/html
> vi index.php
<?php include "dbinfo.inc"; ?>
<html>
<body>
<h1>Instance data</h1>
<?php
echo "<table>";
echo "<tr><th>Data</th><th>Value</th></tr>";
$urlRoot="http://169.254.169.254/latest/meta-data/";
echo "<tr><td>Instance ID</td><td><i>" . file_get_contents($urlRoot . 'instance-id') . "</i></td><tr>";
echo "<tr><td>Private IP Address</td><td><i>" . file_get_contents($urlRoot . 'local-ipv4') . "</i></td><tr>";
echo "<tr><td>Public IP Address</td><td><i>" . file_get_contents($urlRoot . 'public-ipv4') . "</i></td><tr>";
echo "<tr><td>Availability Zone</td><td><i>" . file_get_contents($urlRoot . 'placement/availability-zone') . "</i></td><tr>";
echo "</table>";
?>
<h1>RDS Practice</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);
?>
<!-- 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 SAMPLE");
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>
3) 웹 브라우저에서 LAMP 웹 서버 작동 테스트
ㄷ. Custom AMI를 통한 Public EC2 인스턴스 생성
1) Custom AMI 생성
인스턴스 우클릭 > 이미지 및 템플릿 > 이미지 생성
이미지 이름: ami-public-ec2
재부팅 안함 [v] 활성화
키: Name
값: ami-public-ec2
2) Custom AMI를 통해 EC2 추가
a. EC2 인스턴스 생성 (public-ec2-c1)
=> 사용자 데이터 추가 안해도 됨
b. 탄력적 IP 생성 및 연결
키: Name
값: eip-public-ec2-c1
3) 웹 브라우저에서 LAMP 웹 서버 작동 테스트
(+)
=> public-ec2-a1 스토리지의 볼륨