

# 자습서: 웹 서버 및 Amazon RDS DB 인스턴스 생성
<a name="TUT_WebAppWithRDS"></a>

이 자습서에서는 PHP가 있는 Apache 웹 서버를 설치하고 MariaDB, MySQL 또는 PostgreSQL 데이터베이스를 생성하는 방법을 보여줍니다. 이 웹 서버는 Amazon Linux 2023을 사용하여 Amazon EC2 인스턴스에서 실행되며, MySQL 또는 PostgreSQL DB 인스턴스 중에서 선택할 수 있습니다. Amazon EC2 인스턴스와 DB 인스턴스 모두 Amazon VPC 서비스를 기반으로 하는 Virtual Private Cloud(VPC)에서 실행됩니다.

**중요**  
AWS 계정 생성은 무료입니다. 그러나 이 자습서를 완료하면 사용하는 AWS 리소스에 대한 비용이 발생할 수 있습니다. 자습서가 더 이상 필요하지 않은 경우 자습서를 완료한 후에 이러한 리소스를 삭제할 수 있습니다.

**참고**  
이 자습서에서는 Amazon Linux 2023을 사용하여 작업하며 다른 버전의 Linux는 적용되지 않을 수 있습니다.

다음 자습서에서는 AWS 계정의 .NET용 기본 VPC, 서브넷 및 보안 그룹을 사용하는 EC2 인스턴스를 생성합니다. 이 자습서에서는 DB 인스턴스를 생성하고 생성한 EC2 인스턴스와의 연결을 자동으로 설정하는 방법을 보여줍니다. 그런 다음 자습서에서는 EC2 인스턴스에 웹 서버를 설치하는 방법을 보여줍니다. DB 인스턴스 엔드포인트를 사용하여 VPC의 DB 인스턴스에 웹 서버를 연결합니다.

1. [EC2 인스턴스를 시작하여 DB 인스턴스에 연결](CHAP_Tutorials.WebServerDB.LaunchEC2.md)

1. [Amazon RDS DB 인스턴스 생성](CHAP_Tutorials.WebServerDB.CreateDBInstance.md)

1. [EC2 인스턴스에 웹 서버 설치](CHAP_Tutorials.WebServerDB.CreateWebServer.md)

다음 다이어그램은 이 자습서를 완료했을 때 구성을 보여 줍니다.

![\[단일 VPC 시나리오\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/con-VPC-sec-grp.png)


**참고**  
자습서를 완료하면 VPC의 각 가용 영역에 퍼블릭 서브넷과 프라이빗 서브넷이 있을 것입니다. 이 자습서에서는 AWS 계정에 대한 기본 VPC를 사용하고 EC2 인스턴스와 DB 인스턴스 간의 연결을 자동으로 설정합니다. 대신 이 시나리오에 맞게 새 VPC 구성하려면 [자습서: DB 인스턴스에 사용할 Amazon VPC 생성(IPv4 전용)](CHAP_Tutorials.WebServerDB.CreateVPC.md)에서 작업을 완료하세요.

# EC2 인스턴스를 시작하여 DB 인스턴스에 연결
<a name="CHAP_Tutorials.WebServerDB.LaunchEC2"></a>

VPC의 퍼블릭 서브넷에서 Amazon EC2 인스턴스를 생성합니다.

**EC2 인스턴스 시작**

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. AWS Management Console 콘솔의 오른쪽 상단에서 EC2 인스턴스를 생성하려는 AWS 리전을 선택합니다.

1. 다음과 같이 **EC2 대시보드**를 선택한 다음, **인스턴스 시작**을 선택합니다.  
![\[EC2 대시보드\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_11.png)

1. **인스턴스 시작** 페이지에서 다음 설정을 선택합니다.

   1. **Name and tags**(이름 및 태그) 아래의 **Name**(이름)에 **tutorial-ec2-instance-web-server**을 입력하세요.

   1. **Application and OS Images (Amazon Machine Image)**(애플리케이션 및 OS 이미지(Amazon Machine Image))에서 **Amazon Linux**를 선택한 다음 **Amazon Linux 2023 AMI**를 선택합니다. 다른 선택 항목에 대해서는 기본값을 그대로 유지합니다.  
![\[Amazon Machine Image 선택\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_12.png)

   1. **인스턴스 유형**에서 **t2.micro**를 선택합니다.

   1. **키 페어(로그인)**에서 기존 키 페어를 사용할 **키 페어 이름**을 선택합니다. Amazon EC2 인스턴스에 대한 새 키 페어를 생성하려면 **새 키 페어 생성**을 선택한 다음 **키 페어 생성** 창을 사용하여 생성합니다.

      새 키 페어 생성에 대한 자세한 내용은 **Amazon EC2 Linux 인스턴스용 사용 설명서의 [키 페어 생성](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html#create-a-key-pair)을 참조하세요.

   1. **네트워크 설정**에서 다음과 같이 이러한 값을 설정하고 다른 값은 기본값으로 유지합니다.
      + **SSH 트래픽 허용**에서 EC2 인스턴스에 대한 SSH 연결 소스를 선택합니다.

        표시된 IP 주소가 SSH 연결에 대해 올바른 경우 **내 IP**를 선택할 수 있습니다.

        그렇지 않으면 SSH(Secure Shell)를 사용하여 VPC의 EC2 인스턴스에 연결하는 데 사용할 IP 주소를 결정할 수 있습니다. 퍼블릭 IP 주소를 확인하려면 다른 브라우저 창 또는 탭에서 [https://checkip.amazonaws.com](https://checkip.amazonaws.com)의 서비스를 사용합니다. IP 주소의 예는 `203.0.113.25/32`입니다.

        대부분의 경우 고정 IP 주소가 없는 방화벽 뒤나 인터넷 서비스 제공업체(ISP)를 통해 연결하는 경우가 많습니다. 그렇다면 클라이언트 컴퓨터에서 사용하는 IP 주소 범위를 결정합니다.
**주의**  
SSH 액세스에 `0.0.0.0/0`을 사용하는 경우 모든 IP 주소가 SSH를 사용하여 퍼블릭 인스턴스에 액세스할 수 있도록 활성화합니다. 이 방법은 테스트 환경에서 잠시 사용하는 것은 괜찮지만 프로덕션 환경에서는 안전하지 않습니다. 프로덕션에서는 SSH를 사용하여 인스턴스에 액세스할 수 있는 특정 IP 주소 또는 주소 범위만 인증합니다.
      + **인터넷에서 오는 HTTPS 트래픽 허용**을 켭니다.
      + **인터넷에서 오는 HTTP 트래픽 허용**을 켭니다.  
![\[인스턴스 세부 정보 구성\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_14.png)

   1. 나머지 섹션에서 기본값은 그대로 둡니다.

   1. **요약** 패널에서 인스턴스 구성 요약을 검토하고 준비가 되면 **인스턴스 시작**을 선택합니다.

1. **시작 상태** 페이지에서, 새 EC2 인스턴스의 식별자(예: `i-1234567890abcdef0`)를 기록해 둡니다.  
![\[시작 상태 페이지의 EC2 인스턴스 식별자.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/getting-started-ec2-id.png)

1. EC2 인스턴스 식별자를 선택하여 EC2 인스턴스 목록을 열고 EC2 인스턴스를 선택합니다.

1. **세부 정보** 탭에서 SSH를 사용하여 연결할 때 필요한 다음 값을 기록해 둡니다.

   1. **인스턴스 요약**에서 **퍼블릭 IPv4 DNS**의 값을 기록해 둡니다.  
![\[인스턴스 페이지의 세부 정보 탭에 있는 EC2 퍼블릭 DNS 이름.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/easy-create-ec2-public-dns.png)

   1. **인스턴스 세부 정보**에서 **키 페어 이름**의 값을 기록해 둡니다.  
![\[인스턴스 페이지의 세부 정보 탭에 있는 EC2 키 페어 이름.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/easy-create-ec2-key-pair.png)

1. 인스턴스의 **인스턴스 상태**가 **실행 중**으로 읽힐 때까지 기다린 다음 계속합니다.

1. [Amazon RDS DB 인스턴스 생성](CHAP_Tutorials.WebServerDB.CreateDBInstance.md)을 완료합니다.

# Amazon RDS DB 인스턴스 생성
<a name="CHAP_Tutorials.WebServerDB.CreateDBInstance"></a>

웹 애플리케이션에서 사용되는 데이터를 유지 관리하는 RDS for MariaDB, RDS for MySQL 또는 RDS for PostgreSQL 인스턴스를 생성합니다.

------
#### [ RDS for MariaDB ]

**MariaDB 인스턴스를 만들려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. AWS Management Console의 오른쪽 상단 모서리에서 AWS 리전을 확인합니다. EC2 인스턴스를 생성한 리전과 동일해야 합니다.

1. 탐색 창에서 **데이터베이스**를 선택합니다.

1. **데이터베이스 생성**을 선택합니다.

1. **데이터베이스 생성** 페이지에서 **표준 생성**을 선택합니다.

1. **엔진 옵션**에서 **MariaDB**를 선택합니다.  
![\[엔진 유형 선택\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/tutorial-create-mariadb.png)

1. **템플릿**에서 **프리 티어** 또는 **샌드박스**를 선택합니다. **프리 티어**는 무료 요금제 계정에 표시됩니다. **샌드박스**는 유료 요금제 계정에 표시됩니다.  
![\[템플릿 선택\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. **가용성 및 내구성** 섹션에서 기본값을 사용합니다.

1. **설정** 섹션에서 이러한 값들을 설정합니다.
   + **DB 인스턴스 식별자** – **tutorial-db-instance**를 입력합니다.
   + **마스터 사용자 이름 ** - **tutorial\$1user**를 입력합니다.
   + **Auto generate a password**(암호 자동 생성) - 옵션을 끈 상태로 둡니다.
   + **마스터 암호** – 암호를 입력합니다.
   + **암호 확인** – 암호를 다시 입력합니다.  
![\[설정 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. **인스턴스 구성**] 섹션에서 다음 값을 설정합니다.
   + **버스트 가능 클래스(t 클래스 포함)**
   + **db.t3.micro**  
![\[인스턴스 구성 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. **스토리지** 섹션에서 기본값으로 유지합니다.

1. **연결** 섹션에서 다음 값을 설정하고 다른 값을 기본값으로 유지합니다.
   + **컴퓨팅 리소스**에서 **EC2 컴퓨팅 리소스에 연결**을 선택합니다.
   + E**C2 인스턴스**의 경우 **tutorial-ec2-instance-web-server**와 같이 이전에 생성한 EC2 인스턴스를 선택합니다.  
![\[연결 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. [**데이터베이스 인증(Database authentication)**] 섹션에서 [**암호 인증(Password authentication)**]이 선택되어 있는지 확인합니다.

1. **추가 구성** 섹션을 열고 **초기 데이터베이스 이름**에 **sample**를 입력합니다. 다른 옵션은 기본 설정을 유지합니다.

1. MariaDB 인스턴스를 생성하려면 **데이터베이스 생성**을 선택합니다.

   새 DB 인스턴스가 **데이터베이스**목록에 **생성 중**의 상태로 나타납니다.

1. 새 DB 인스턴스의 **상태**가 **사용 가능**으로 나타날 때까지 기다립니다. 그런 다음, 세부 정보를 표시할 DB 인스턴스 이름을 선택합니다.

1. **Connectivity & security(연결 및 보안)** 섹션에서 DB 인스턴스의 **엔드포인트** 및 **포트**를 확인합니다.  
![\[DB 인스턴스 세부 정보\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port.png)

   DB 인스턴스의 엔드포인트와 포트를 적어 둡니다. 이 정보를 사용하여 웹 서버를 RDS DB 인스턴스에 연결하게 됩니다.

1. [EC2 인스턴스에 웹 서버 설치](CHAP_Tutorials.WebServerDB.CreateWebServer.md)를 완료합니다.

------
#### [ RDS for MySQL ]

**MySQL DB 인스턴스를 만들려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. AWS Management Console의 오른쪽 상단 모서리에서 AWS 리전을 확인합니다. EC2 인스턴스를 생성한 리전과 동일해야 합니다.

1. 탐색 창에서 **데이터베이스**를 선택합니다.

1. **데이터베이스 생성**을 선택합니다.

1. **데이터베이스 생성** 페이지에서 **표준 생성**을 선택합니다.

1. **엔진 옵션**에서 **MySQL**을 선택합니다.  
![\[엔진 유형 선택\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/tutorial-create-mysql.png)

1. **템플릿**에서 **프리 티어** 또는 **샌드박스**를 선택합니다. **프리 티어**는 무료 요금제 계정에 표시됩니다. **샌드박스**는 유료 요금제 계정에 표시됩니다.  
![\[템플릿 선택\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. **가용성 및 내구성** 섹션에서 기본값을 사용합니다.

1. **설정** 섹션에서 이러한 값들을 설정합니다.
   + **DB 인스턴스 식별자** – **tutorial-db-instance**를 입력합니다.
   + **마스터 사용자 이름 ** - **tutorial\$1user**를 입력합니다.
   + **Auto generate a password**(암호 자동 생성) - 옵션을 끈 상태로 둡니다.
   + **마스터 암호** – 암호를 입력합니다.
   + **암호 확인** – 암호를 다시 입력합니다.  
![\[설정 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. **인스턴스 구성**] 섹션에서 다음 값을 설정합니다.
   + **버스트 가능 클래스(t 클래스 포함)**
   + **db.t3.micro**  
![\[인스턴스 구성 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. **스토리지** 섹션에서 기본값으로 유지합니다.

1. **연결** 섹션에서 다음 값을 설정하고 다른 값을 기본값으로 유지합니다.
   + **컴퓨팅 리소스**에서 **EC2 컴퓨팅 리소스에 연결**을 선택합니다.
   + E**C2 인스턴스**의 경우 **tutorial-ec2-instance-web-server**와 같이 이전에 생성한 EC2 인스턴스를 선택합니다.  
![\[연결 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. [**데이터베이스 인증(Database authentication)**] 섹션에서 [**암호 인증(Password authentication)**]이 선택되어 있는지 확인합니다.

1. **추가 구성** 섹션을 열고 **초기 데이터베이스 이름**에 **sample**를 입력합니다. 다른 옵션은 기본 설정을 유지합니다.

1. MySQL DB 인스턴스를 생성하려면 [**데이터베이스 생성(Create database)**]을 선택합니다.

   새 DB 인스턴스가 **데이터베이스**목록에 **생성 중**의 상태로 나타납니다.

1. 새 DB 인스턴스의 **상태**가 **사용 가능**으로 나타날 때까지 기다립니다. 그런 다음, 세부 정보를 표시할 DB 인스턴스 이름을 선택합니다.

1. **Connectivity & security(연결 및 보안)** 섹션에서 DB 인스턴스의 **엔드포인트** 및 **포트**를 확인합니다.  
![\[DB 인스턴스 세부 정보\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port.png)

   DB 인스턴스의 엔드포인트와 포트를 적어 둡니다. 이 정보를 사용하여 웹 서버를 RDS DB 인스턴스에 연결하게 됩니다.

1. [EC2 인스턴스에 웹 서버 설치](CHAP_Tutorials.WebServerDB.CreateWebServer.md)를 완료합니다.

------
#### [ RDS for PostgreSQL ]

**PostgreSQL DB 인스턴스를 생성하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. AWS Management Console의 오른쪽 상단 모서리에서 AWS 리전을 확인합니다. EC2 인스턴스를 생성한 리전과 동일해야 합니다.

1. 탐색 창에서 **데이터베이스**를 선택합니다.

1. **데이터베이스 생성**을 선택합니다.

1. **데이터베이스 생성** 페이지에서 **표준 생성**을 선택합니다.

1. **엔진 옵션**에서 **PostgreSQL**을 선택합니다.  
![\[엔진 유형 선택\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/tutorial-create-postgres.png)

1. **템플릿**에서 **프리 티어** 또는 **샌드박스**를 선택합니다. **프리 티어**는 무료 요금제 계정에 표시됩니다. **샌드박스**는 유료 요금제 계정에 표시됩니다.  
![\[템플릿 선택\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. **가용성 및 내구성** 섹션에서 기본값을 사용합니다.

1. **설정** 섹션에서 이러한 값들을 설정합니다.
   + **DB 인스턴스 식별자** – **tutorial-db-instance**를 입력합니다.
   + **마스터 사용자 이름 ** - **tutorial\$1user**를 입력합니다.
   + **Auto generate a password**(암호 자동 생성) - 옵션을 끈 상태로 둡니다.
   + **마스터 암호** – 암호를 입력합니다.
   + **암호 확인** – 암호를 다시 입력합니다.  
![\[설정 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. **인스턴스 구성**] 섹션에서 다음 값을 설정합니다.
   + **버스트 가능 클래스(t 클래스 포함)**
   + **db.t3.micro**  
![\[인스턴스 구성 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. **스토리지** 섹션에서 기본값으로 유지합니다.

1. **연결** 섹션에서 다음 값을 설정하고 다른 값을 기본값으로 유지합니다.
   + **컴퓨팅 리소스**에서 **EC2 컴퓨팅 리소스에 연결**을 선택합니다.
   + E**C2 인스턴스**의 경우 **tutorial-ec2-instance-web-server**와 같이 이전에 생성한 EC2 인스턴스를 선택합니다.  
![\[연결 섹션\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. [**데이터베이스 인증(Database authentication)**] 섹션에서 [**암호 인증(Password authentication)**]이 선택되어 있는지 확인합니다.

1. **추가 구성** 섹션을 열고 **초기 데이터베이스 이름**에 **sample**를 입력합니다. 다른 옵션은 기본 설정을 유지합니다.

1. PostgreSQL DB 인스턴스를 생성하려면 **데이터베이스 생성**을 선택합니다.

   새 DB 인스턴스가 **데이터베이스**목록에 **생성 중**의 상태로 나타납니다.

1. 새 DB 인스턴스의 **상태**가 **사용 가능**으로 나타날 때까지 기다립니다. 그런 다음, 세부 정보를 표시할 DB 인스턴스 이름을 선택합니다.

1. **Connectivity & security(연결 및 보안)** 섹션에서 DB 인스턴스의 **엔드포인트** 및 **포트**를 확인합니다.  
![\[DB 인스턴스 세부 정보\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port_postgres.png)

   DB 인스턴스의 엔드포인트와 포트를 적어 둡니다. 이 정보를 사용하여 웹 서버를 RDS DB 인스턴스에 연결하게 됩니다.

1. [EC2 인스턴스에 웹 서버 설치](CHAP_Tutorials.WebServerDB.CreateWebServer.md)를 완료합니다.

------

# EC2 인스턴스에 웹 서버 설치
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer"></a>

[EC2 인스턴스를 시작하여 DB 인스턴스에 연결](CHAP_Tutorials.WebServerDB.LaunchEC2.md)에서 생성한 EC2 인스턴스에 웹 서버를 설치합니다. 웹 서버는 [Amazon RDS DB 인스턴스 생성](CHAP_Tutorials.WebServerDB.CreateDBInstance.md)에서 생성한 Amazon RDS DB 인스턴스에 연결됩니다.

## PHP 및 MariaDB와 함께 Apache 웹 서버 설치
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer.Apache"></a>

EC2 인스턴스에 연결하고 서버를 설치합니다.

**EC2 인스턴스에 연결하고 PHP가 포함된 Apache 웹 서버를 설치하는 방법**

1. **Amazon EC2 사용 설명서에 있는 [Linux 인스턴스에 연결](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)의 단계를 따라 앞에서 만든 EC2 인스턴스에 연결합니다.

   SSH를 사용하여 EC2 인스턴스에 연결하는 것이 좋습니다. Windows, Linux 또는 Mac에 SSH 클라이언트 유틸리티가 설치된 경우 다음 명령 형식을 사용하여 인스턴스에 연결할 수 있습니다.

   ```
   ssh -i location_of_pem_file ec2-user@ec2-instance-public-dns-name
   ```

   예를 들어 `ec2-database-connect-key-pair.pem`이 Linux의 `/dir1`에 저장되어 있고, EC2 인스턴스의 퍼블릭 IPv4 DNS가 `ec2-12-345-678-90.compute-1.amazonaws.com`이라고 가정해 보겠습니다. SSH 명령은 다음과 같이 표시됩니다.

   ```
   ssh -i /dir1/ec2-database-connect-key-pair.pem ec2-user@ec2-12-345-678-90.compute-1.amazonaws.com
   ```

1. EC2 인스턴스에서 소프트웨어를 업데이트하여 최신 버그 수정 및 보안 업데이트를 받습니다. 이렇게 하려면 다음 명령을 사용하십시오.
**참고**  
`-y` 옵션을 사용하면 확인 여부를 묻지 않고 업데이트를 설치합니다. 설치 전에 업데이트 정보를 확인하려면 이 옵션을 생략합니다.

   ```
   sudo dnf update -y
   ```

1. 업데이트가 완료되면 다음 명령을 사용하여 Apache 웹 서버, PHP, MariaDB 또는 PostgreSQL 소프트웨어를 설치합니다. 이 명령은 여러 소프트웨어 패키지와 관련 종속 프로그램을 동시에 설치합니다.

------
#### [ MariaDB & MySQL ]

   ```
   sudo dnf install -y httpd php php-mysqli mariadb105
   ```

------
#### [ PostgreSQL ]

   ```
   sudo dnf install -y httpd php php-pgsql postgresql15
   ```

------

   오류가 발생하면 인스턴스가 Amazon Linux 2023 AMI로 실행되지 않은 것입니다. Amazon Linux 2 AMI를 사용하고 있는 것일 수 있습니다. 다음 명령을 사용하여 Amazon Linux 버전을 볼 수 있습니다.

   ```
   cat /etc/system-release
   ```

   자세한 내용은 [인스턴스 소프트웨어 업데이트](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-updates.html) 단원을 참조하십시오.

1. 다음 명령을 사용하여 웹 서버를 시작합니다.

   ```
   sudo systemctl start httpd
   ```

   웹 서버가 제대로 설치되고 시작되었는지 테스트할 수 있습니다. 이렇게 하려면 웹 브라우저의 주소 표시줄에 EC2 인스턴스의 퍼블릭 Domain Name System(DNS) 이름을 입력합니다(예: `http://ec2-42-8-168-21.us-west-1.compute.amazonaws.com`). 웹 서버가 실행되고 있으면 Apache 테스트 페이지가 표시됩니다.

   Apache 테스트 페이지가 표시되지 않으면 [자습서: DB 인스턴스에 사용할 Amazon VPC 생성(IPv4 전용)](CHAP_Tutorials.WebServerDB.CreateVPC.md)에서 생성한 VPC 보안 그룹에 대한 인바운드 규칙을 확인합니다. 인바운드 규칙에 웹 서버에 연결할 IP 주소에 대한 HTTP(포트 80) 액세스를 허용하는 규칙이 포함되어 있는지 확인합니다.
**참고**  
Apache 테스트 페이지는 문서의 루트 디렉터리 `/var/www/html`에 콘텐츠가 없는 경우에만 표시됩니다. 문서의 루트 디렉터리에 콘텐츠를 추가한 후에는 콘텐츠가 EC2 인스턴스의 퍼블릭 DNS 주소에 나타납니다. 이 시점 이전에는 Apache 테스트 페이지에 나타납니다.

1. `systemctl` 명령을 사용하여 웹 서버가 시스템 부팅 때마다 시작되도록 구성합니다.

   ```
   sudo systemctl enable httpd
   ```

`ec2-user`가 Apache 웹 서버의 기본 루트 디렉터리에 있는 파일을 관리할 수 있도록 하려면 `/var/www` 디렉터리의 소유권 및 권한을 변경합니다. 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 본 자습서에서는 `ec2-user`를 `apache` 그룹에 추가하여 `apache` 그룹에 `/var/www` 디렉터리의 소유권을 부여하고 쓰기 권한을 할당합니다.

**Apache 웹 서버에 대한 파일 권한 설정 방법**

1. `ec2-user` 사용자를 `apache` 그룹에 추가합니다.

   ```
   sudo usermod -a -G apache ec2-user
   ```

1. 권한을 새로 고치고 새 `apache` 그룹을 포함하려면 로그아웃합니다.

   ```
   exit
   ```

1. 다시 로그인한 다음, `apache` 명령을 사용하여 `groups` 그룹이 있는지 확인합니다.

   ```
   groups
   ```

   출력 결과는 다음과 비슷합니다.

   ```
   ec2-user adm wheel apache systemd-journal
   ```

1. `/var/www` 디렉터리 및 해당 콘텐츠의 그룹 소유권을 `apache` 그룹으로 변경합니다.

   ```
   sudo chown -R ec2-user:apache /var/www
   ```

1. `/var/www` 및 그 하위 디렉터리의 디렉터리 권한을 변경해서 그룹 쓰기 권한을 추가하고 나중에 생성될 하위 디렉터리에서 그룹 ID를 설정합니다.

   ```
   sudo chmod 2775 /var/www
   find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

1. `/var/www` 디렉터리 및 하위 디렉터리의 파일 권한을 계속 변경해서 그룹 쓰기 권한을 추가합니다.

   ```
   find /var/www -type f -exec sudo chmod 0664 {} \;
   ```

이제 `ec2-user`(및 `apache` 그룹의 향후 멤버)는 Apache 문서 루트에서 파일을 추가, 삭제, 편집할 수 있습니다. 따라서 정적 웹 사이트 또는 PHP 애플리케이션과 같은 콘텐츠를 추가할 수 있습니다.

**참고**  
HTTP 프로토콜을 실행하는 웹 서버는 송신하거나 수신하는 데이터에 대해 아무런 전송 보안 기능도 제공하지 않습니다. 웹 브라우저를 사용하여 HTTP 서버에 연결하면 네트워크 경로를 따라 어디서든 엿보려는 사람들이 많은 정보를 볼 수 있습니다. 이 정보에는 방문하는 URL, 수신하는 웹 페이지의 내용, HTML 양식의 내용(암호 포함)이 포함됩니다.  
웹 서버를 안전하게 보호하기 위한 최선의 방법은 HTTPS(HTTP Secure) 지원 기능을 설치하는 것입니다. 이 프로토콜은 SSL/TLS 암호화로 데이터를 보호합니다. 자세한 내용은 *Amazon EC2 사용 설명서*에서 [자습서: Amazon Linux AMI를 사용하여 SSL/TLS 구성](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/SSL-on-amazon-linux-ami.html)을 참조하세요.

## DB 인스턴스에 Apache 웹 서버 연결
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer.PHPContent"></a>

이제 Amazon RDS DB 인스턴스에 연결되는 Apache 웹 서버에 콘텐츠를 추가합니다.

**DB 인스턴스에 연결되는 Apache 웹 서버에 콘텐츠를 추가하는 방법**

1. EC2 인스턴스에 계속 연결되어 있을 때 디렉터리를 `/var/www`로 변경하고 `inc`라는 새로운 하위 디렉터리를 생성합니다.

   ```
   cd /var/www
   mkdir inc
   cd inc
   ```

1. `inc`라는 `dbinfo.inc` 디렉터리에서 새 파일을 생성한 다음 nano 또는 선택한 편집기를 호출하여 파일을 편집합니다.

   ```
   >dbinfo.inc
   nano dbinfo.inc
   ```

1. 다음 내용을 `dbinfo.inc` 파일에 추가합니다. 여기서 *db\$1instance\$1endpoint*는 DB 인스턴스에 대해 포트가 없는 DB 인스턴스 엔드포인트입니다.
**참고**  
웹 서버의 문서 루트에 속하지 않은 폴더에 사용자 이름과 암호 정보를 두는 것이 좋습니다. 이렇게 하면 보안 정보가 노출될 가능성이 줄어듭니다.  
애플리케이션에서 적절한 암호로 `master password`를 변경해야 합니다.

   ```
   <?php
   
   define('DB_SERVER', 'db_instance_endpoint');
   define('DB_USERNAME', 'tutorial_user');
   define('DB_PASSWORD', 'master password');
   define('DB_DATABASE', 'sample');
   ?>
   ```

1. `dbinfo.inc` 파일을 저장하고 닫습니다. nano를 사용하는 경우 Ctrl\$1S 및 Ctrl\$1X를 사용하여 파일을 저장하고 닫습니다.

1. 디렉터리를 `/var/www/html`로 변경합니다.

   ```
   cd /var/www/html
   ```

1. `html`라는 `SamplePage.php` 디렉터리에서 새 파일을 생성한 다음 nano 또는 선택한 편집기를 호출하여 파일을 편집합니다.

   ```
   >SamplePage.php
   nano SamplePage.php
   ```

1. 다음 콘텐츠를 `SamplePage.php` 파일에 추가합니다.

------
#### [ MariaDB & MySQL ]

   ```
   <?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;
   }
   ?>
   ```

------
#### [ PostgreSQL ]

   ```
   <?php include "../inc/dbinfo.inc"; ?>
   
   <html>
   <body>
   <h1>Sample page</h1>
   <?php
   
   /* Connect to PostgreSQL and select the database. */
   $constring = "host=" . DB_SERVER . " dbname=" . DB_DATABASE . " user=" . DB_USERNAME . " password=" . DB_PASSWORD ;
   $connection = pg_connect($constring);
   
   if (!$connection){
    echo "Failed to connect to PostgreSQL";
    exit;
   }
   
   /* 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 = pg_query($connection, "SELECT * FROM EMPLOYEES");
   
   while($query_data = pg_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
   
     pg_free_result($result);
     pg_close($connection);
   ?>
   </body>
   </html>
   
   
   <?php
   
   /* Add an employee to the table. */
   function AddEmployee($connection, $name, $address) {
      $n = pg_escape_string($name);
      $a = pg_escape_string($address);
      echo "Forming Query";
      $query = "INSERT INTO EMPLOYEES (NAME, ADDRESS) VALUES ('$n', '$a');";
   
      if(!pg_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 serial PRIMARY KEY,
            NAME VARCHAR(45),
            ADDRESS VARCHAR(90)
          )";
   
        if(!pg_query($connection, $query)) echo("<p>Error creating table.</p>"); 
     }
   }
   /* Check for the existence of a table. */
   function TableExists($tableName, $connection, $dbName) {
     $t = strtolower(pg_escape_string($tableName)); //table name is case sensitive
     $d = pg_escape_string($dbName); //schema is 'public' instead of 'sample' db name so not using that
   
     $query = "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = '$t';";
     $checktable = pg_query($connection, $query);
   
     if (pg_num_rows($checktable) >0) return true;
     return false;
   
   }
   ?>
   ```

------

1. `SamplePage.php` 파일을 저장하고 닫습니다.

1. 웹 브라우저를 열고 `http://EC2 instance endpoint/SamplePage.php`(예: `http://ec2-12-345-67-890.us-west-2.compute.amazonaws.com/SamplePage.php`)를 검색하여 웹 서버에서 DB 인스턴스에 제대로 연결되는지 확인합니다.

`SamplePage.php`를 사용하여 DB 인스턴스에 데이터를 추가할 수 있습니다. 그러면 추가한 데이터가 페이지에 표시됩니다. 데이터가 테이블에 삽입되었는지 확인하려면 Amazon EC2 인스턴스에 MySQL을 설치합니다. 그런 다음 DB 인스턴스에 연결하여 테이블을 쿼리합니다.

MySQL 클라이언트를 설치하고 DB 인스턴스에 연결하는 방법에 대한 자세한 내용은 [MySQL DB 인스턴스에 연결](USER_ConnectToInstance.md) 섹션을 참조하세요.

DB 인스턴스를 최대한 보호하려면 VPC 외부의 소스가 DB 인스턴스에 연결할 수 없는지 확인합니다.

웹 서버 및 데이터베이스 테스트를 완료한 후에는 DB 인스턴스와 Amazon EC2 인스턴스를 삭제해야 합니다.
+ DB 인스턴스를 삭제하려면 [DB 인스턴스 삭제](USER_DeleteInstance.md)의 지침을 따릅니다. 최종 스냅샷을 생성할 필요가 없습니다.
+ Amazon EC2 인스턴스를 종료하려면 *Amazon EC2 사용 설명서*에서 [인스턴스 종료](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html) 섹션의 지침을 따르세요.