

# チュートリアル: ウェブサーバーと Amazon RDS DB インスタンスを作成する
<a name="TUT_WebAppWithRDS"></a>

このチュートリアルでは、PHP を使用して Apache ウェブサーバーをインストールする方法と MariaDB、MySQL、または PostgreSQL データベースを作成する方法を示します。ウェブサーバーは Amazon Linux 2023 を使用して Amazon EC2 インスタンスで実行し、MySQL DB インスタンスと PostgreSQL DB インスタンスのいずれかを選択できます。Amazon EC2 インスタンスと DB インスタンスはいずれも、Amazon VPC サービスに基づき、仮想プライベートクラウド (VPC) で実行されます。

**重要**  
AWS アカウントを作成するための料金はかかりません。ただし、このチュートリアルを完了すると、使用する AWS リソースのコストが発生する可能性があります。これらのリソースが不要になった場合は、チュートリアルの完了後に削除できます。

**注記**  
このチュートリアルは Amazon Linux 2023 で機能します。他の Linux のバージョンでは機能しない場合があります。

次のチュートリアルでは、AWS アカウント のデフォルトの 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/ja_jp/AmazonRDS/latest/UserGuide/images/con-VPC-sec-grp.png)


**注記**  
チュートリアルを完了すると、VPC 内の各アベイラビリティーゾーンにパブリックサブネットとプライベートサブネットができます。このチュートリアルでは、AWS アカウント にデフォルトの VPC を使用し、EC2 インスタンスと DB インスタンス間の接続を自動的に設定します。このシナリオで代わりに新しい VPC を設定する場合は、[チュートリアル: DB インスタンスで使用する VPC を作成する (IPv4 専用)](CHAP_Tutorials.WebServerDB.CreateVPC.md) のタスクを完了してください。

# EC2 インスタンスを起動して DB インスタンスに接続する
<a name="CHAP_Tutorials.WebServerDB.LaunchEC2"></a>

VPC のパブリックサブネットで Amazon EC2 インスタンスを作成します。

**EC2 インスタンスを起動するには**

1. AWS マネジメントコンソール にサインインし、Amazon EC2 コンソール ([https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)) を開きます。

1. AWS マネジメントコンソール の右上で、EC2 インスタンスを作成する AWS リージョン を選択します。

1. 次に示すように、[**EC2 ダッシュボード**] を選択し、次に [**インスタンスの作成**] を選択します。  
![\[EC2 ダッシュボード\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_11.png)

1. **[インスタンスを起動]** ページで次の設定を選択します。

   1. **[Name and tags]** (名前とタグ) の、**[Name]** (名前) で、**tutorial-ec2-instance-web-server** と入力します。

   1. **[アプリケーションおよび OS イメージ (Amazon マシンイメージ)]** で、**[Amazon Linux]** を選択し、**[Amazon Linux 2023 AMI]** を選択します。他の選択肢をデフォルトのままにします。  
![\[Amazon Machine Image の選択\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_12.png)

   1. **[Instance type]** (インスタンスタイプ) で **[t2.micro]** を選択します。

   1. **[Key pair (login)]** (キーペア (ログイン)) で、**[Key pair name]** (キーペア名) を選択して、既存のキーペアを使用します。Amazon EC2 インスタンスの新しい key pair を作成するには、**[Create new key pair]** (新しい key pair を作成する) を選択し、**[Create key pair]** (キーペアを作成する) ウィンドウを使用して作成します。

      新しいキーペアの作成については、「*Amazon EC2 ユーザーガイド*」の「[キーペアの作成](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html#create-a-key-pair)」を参照してください。

   1. **[Network settings]** (ネットワーク設定) で、次の値を設定し、他の値はデフォルトのままにします。
      + **[Allow SSH traffic from]** (SSH トラフィックを許可) で、EC2 インスタンスへの SSH 接続のソースを選択します。

        表示された IP アドレスが SSH 接続に適している場合は、**[My IP]** (マイ IP)を選択できます。

        それ以外の場合は、Secure Shell (SSH) を使用して VPC の EC2 インスタンスへの接続に使用する IP アドレスを決定します。パブリック IP アドレスを決定するには、別のブラウザウィンドウまたはタブで、[https://checkip.amazonaws.com](https://checkip.amazonaws.com) のサービスを使用できます。IP アドレスの例は `203.0.113.25/32` です。

        多くの場合、インターネットサービスプロバイダー (ISP) 経由、またはファイアウォールの内側から静的 IP アドレスなしで接続することがあります。その場合、クライアントコンピュータが使用する IP アドレスの範囲を確認してください。
**警告**  
SSH アクセスに `0.0.0.0/0` を使用すると、すべての IP アドレスが SSH を使ってパブリックインスタンスにアクセスできるようになります。この方法は、テスト環境で短時間なら許容できますが、実稼働環境では安全ではありません。実稼働環境では、特定の IP アドレスまたは特定のアドレス範囲にのみ、SSH を使ったインスタンスへのアクセスを限定します。
      + **[Allow HTTPs traffic from the internet]** (インターネットからの HTTPs トラフィックを許可する) をオンにします。
      + **[Allow HTTP traffic from the internet]** (インターネットからの HTTP トラフィックを許可する) をオンにします。  
![\[インスタンスの詳細の設定\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_14.png)

   1. 残りのセクションをデフォルト値のままにします。

   1. **Summary** (概要) パネルでインスタンス設定の要約を確認します。準備が完了したら、**[Launch instance]** (インスタンスを起動) を選択してください。

1. **[起動ステータス]** ページで、新しい EC2 インスタンスの ID (例: `i-1234567890abcdef0`) をメモします。  
![\[起動ステータスページの EC2 インスタンス ID。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/getting-started-ec2-id.png)

1. EC2 インスタンス ID を選択して、EC2 インスタンスのリストを開き、EC2 インスタンスを選択します。

1. **[詳細]** タブで、SSH を使用して接続するときに必要な次の値を書き留めます。

   1. **[インスタンスの概要]** で、**[パブリック IPv4 DNS]** の値を書き留めます。  
![\[[インスタンス] ページの [詳細] タブにある EC2 パブリック DNS 名。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/easy-create-ec2-public-dns.png)

   1. **[インスタンスの詳細]** で、**[キーペア名]** の値を書き留めます。  
![\[[インスタンス] ページの [詳細] タブにある EC2 キーペア名。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/easy-create-ec2-key-pair.png)

1. インスタンスの **[Instance Status]** (インスタンスのステータス) が **[Running]** (実行中) になるまで続行せずに待ちます。

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 DB インスタンスを作成します。

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

**MariaDB インスタンスを作成するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. AWS マネジメントコンソール の右上にある AWS リージョン を確認します。これは EC2 インスタンスを作成した場所と同じである必要があります。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. **[データベースの作成]** を選択します。

1. **[データベースの作成]** ページで、**[標準作成]** を選択します。

1. **[エンジンのオプション]** で **[MariaDB]** を選択します。  
![\[エンジンタイプの選択\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/tutorial-create-mariadb.png)

1. **[テンプレート]** で、**[無料利用枠]** または **[サンドボックス]** を選択します。**[無料利用枠]** は無料プランアカウントに表示されます。**[サンドボックス]** は有料プランアカウントに表示されます。  
![\[テンプレートの選択\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. **[可用性と耐久性]** セクションで、デフォルト値を使用します。

1. **[設定]** セクションで、これらの値を設定します。
   + **[DB instance identifier]** (DB インスタンス識別子) - **tutorial-db-instance** を入力します。
   + **[Master username]** (マスターユーザー名) — **tutorial\$1user** を入力します。
   + **[Auto generate a password]** (パスワードの自動生成) — オプションはオフのままにします。
   + **[Master password]** (マスターパスワード): パスワードを入力します。
   + **[パスワードの確認]** - パスワードを再入力します。  
![\[[設定] セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. **[Instance configuration]** (インスタンス設定) セクションで、次の値を設定します。
   + **バースト可能クラス (t クラスを含む)**
   + **db.t3.micro**  
![\[[Instance configuration] (インスタンス設定) セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. **[Storage]** (ストレージ) セクションでは、デフォルトのままにします。

1. **[Connectivity]** (接続) セクションで、次の値を設定し、他の値はデフォルトのままにします。
   + **[Compute resource]** (コンピューティングリソース) で、選択してください**[Connect to an EC2 compute resource]** (EC2 コンピューティングリソースに接続する) を選択します。
   + **[EC2 instance]** (EC2 インスタンス) で、以前に作成した **[tutorial-ec2-instance-web-server]** などの EC2 インスタンスを選択します。  
![\[[接続] セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. [**データベース認証**] セクションで、[**パスワード認証**] が選択されていることを確認します。

1. [**Additional configuration (追加設定)**] セクションを開き、[**Initial database name (初期データベース名)**] に **sample** と入力します。その他のオプションについては、デフォルト設定のままにしておきます。

1. MariaDB インスタンスを作成するには、**[データベースを作成]** を選択します。

   新しい DB インスタンスは、**[作成中]** ステータスとして **[データベース]** リストに表示されます。

1. 新しい DB インスタンスの [**ステータス**] が [**Available**] と表示されるまで待ちます。詳細を表示する DB インスタンスの名前を選択します。

1. [**接続とセキュリティ**] セクションで、DB インスタンスの [**エンドポイント**] および [**ポート**] を表示します。  
![\[DB インスタンスの詳細\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port.png)

   DB インスタンスのエンドポイントとポートを書き留めます。この情報を使用して、ウェブサーバーを DB インスタンスに接続します。

1. [EC2 インスタンスにウェブサーバーをインストールします](CHAP_Tutorials.WebServerDB.CreateWebServer.md) を完了します。

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

**MySQL DB インスタンスを作成するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. AWS マネジメントコンソール の右上にある AWS リージョン を確認します。これは EC2 インスタンスを作成した場所と同じである必要があります。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. **[データベースの作成]** を選択します。

1. **[データベースの作成]** ページで、**[標準作成]** を選択します。

1. **[エンジンのオプション]** として、**[MySQL]** を選択します。  
![\[エンジンタイプの選択\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/tutorial-create-mysql.png)

1. **[テンプレート]** で、**[無料利用枠]** または **[サンドボックス]** を選択します。**[無料利用枠]** は無料プランアカウントに表示されます。**[サンドボックス]** は有料プランアカウントに表示されます。  
![\[テンプレートの選択\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. **[可用性と耐久性]** セクションで、デフォルト値を使用します。

1. **[設定]** セクションで、これらの値を設定します。
   + **[DB instance identifier]** (DB インスタンス識別子) - **tutorial-db-instance** を入力します。
   + **[Master username]** (マスターユーザー名) — **tutorial\$1user** を入力します。
   + **[Auto generate a password]** (パスワードの自動生成) — オプションはオフのままにします。
   + **[Master password]** (マスターパスワード): パスワードを入力します。
   + **[パスワードの確認]** - パスワードを再入力します。  
![\[[設定] セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. **[Instance configuration]** (インスタンス設定) セクションで、次の値を設定します。
   + **バースト可能クラス (t クラスを含む)**
   + **db.t3.micro**  
![\[[Instance configuration] (インスタンス設定) セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. **[Storage]** (ストレージ) セクションでは、デフォルトのままにします。

1. **[Connectivity]** (接続) セクションで、次の値を設定し、他の値はデフォルトのままにします。
   + **[Compute resource]** (コンピューティングリソース) で、選択してください**[Connect to an EC2 compute resource]** (EC2 コンピューティングリソースに接続する) を選択します。
   + **[EC2 instance]** (EC2 インスタンス) で、以前に作成した **[tutorial-ec2-instance-web-server]** などの EC2 インスタンスを選択します。  
![\[[接続] セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. [**データベース認証**] セクションで、[**パスワード認証**] が選択されていることを確認します。

1. [**Additional configuration (追加設定)**] セクションを開き、[**Initial database name (初期データベース名)**] に **sample** と入力します。その他のオプションについては、デフォルト設定のままにしておきます。

1. MySQL DB インスタンスを作成するには、[**Create database (データベースの作成)**] を選択します。

   新しい DB インスタンスは、[**作成中**] ステータスとして [**データベース**] リストに表示されます。

1. 新しい DB インスタンスの [**ステータス**] が [**Available**] と表示されるまで待ちます。詳細を表示する DB インスタンスの名前を選択します。

1. [**接続とセキュリティ**] セクションで、DB インスタンスの [**エンドポイント**] および [**ポート**] を表示します。  
![\[DB インスタンスの詳細\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port.png)

   DB インスタンスのエンドポイントとポートを書き留めます。この情報を使用して、ウェブサーバーを DB インスタンスに接続します。

1. [EC2 インスタンスにウェブサーバーをインストールします](CHAP_Tutorials.WebServerDB.CreateWebServer.md) を完了します。

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

**PostgreSQL DB インスタンスを作成するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. AWS マネジメントコンソール の右上にある AWS リージョン を確認します。これは EC2 インスタンスを作成した場所と同じである必要があります。

1. ナビゲーションペインで、[**データベース**] を選択します。

1. **[データベースの作成]** を選択します。

1. **[データベースの作成]** ページで、**[標準作成]** を選択します。

1. **[Engine options]** (エンジンオプション) で **PostgreSQL** を選択します。  
![\[エンジンタイプの選択\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/tutorial-create-postgres.png)

1. **[テンプレート]** で、**[無料利用枠]** または **[サンドボックス]** を選択します。**[無料利用枠]** は無料プランアカウントに表示されます。**[サンドボックス]** は有料プランアカウントに表示されます。  
![\[テンプレートの選択\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/tutorial-create-template.png)

1. **[可用性と耐久性]** セクションで、デフォルト値を使用します。

1. **[設定]** セクションで、これらの値を設定します。
   + **[DB instance identifier]** (DB インスタンス識別子) - **tutorial-db-instance** を入力します。
   + **[Master username]** (マスターユーザー名) — **tutorial\$1user** を入力します。
   + **[Auto generate a password]** (パスワードの自動生成) — オプションはオフのままにします。
   + **[Master password]** (マスターパスワード): パスワードを入力します。
   + **[パスワードの確認]** - パスワードを再入力します。  
![\[[設定] セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Settings.png)

1. **[Instance configuration]** (インスタンス設定) セクションで、次の値を設定します。
   + **バースト可能クラス (t クラスを含む)**
   + **db.t3.micro**  
![\[[Instance configuration] (インスタンス設定) セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_DB_instance_micro.png)

1. **[Storage]** (ストレージ) セクションでは、デフォルトのままにします。

1. **[Connectivity]** (接続) セクションで、次の値を設定し、他の値はデフォルトのままにします。
   + **[Compute resource]** (コンピューティングリソース) で、選択してください**[Connect to an EC2 compute resource]** (EC2 コンピューティングリソースに接続する) を選択します。
   + **[EC2 instance]** (EC2 インスタンス) で、以前に作成した **[tutorial-ec2-instance-web-server]** などの EC2 インスタンスを選択します。  
![\[[接続] セクション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Connectivity.png)

1. [**データベース認証**] セクションで、[**パスワード認証**] が選択されていることを確認します。

1. [**Additional configuration (追加設定)**] セクションを開き、[**Initial database name (初期データベース名)**] に **sample** と入力します。その他のオプションについては、デフォルト設定のままにしておきます。

1. PostgreSQL DB インスタンスを作成するには、**[データベースの作成]** を選択します。

   新しい DB インスタンスは、**[作成中]** ステータスとして **[データベース]** リストに表示されます。

1. 新しい DB インスタンスの [**ステータス**] が [**Available**] と表示されるまで待ちます。詳細を表示する DB インスタンスの名前を選択します。

1. [**接続とセキュリティ**] セクションで、DB インスタンスの [**エンドポイント**] および [**ポート**] を表示します。  
![\[DB インスタンスの詳細\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/Tutorial_WebServer_Endpoint_Port_postgres.png)

   DB インスタンスのエンドポイントとポートを書き留めます。この情報を使用して、ウェブサーバーを 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 インスタンスに接続することをお勧めします。SSH クライアントユーティリティが Windows、Linux、または Mac にインストールされている場合は、次のコマンド形式でインスタンスに接続できます。

   ```
   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 インスタンスのパブリックドメインネームシステム (DNS) 名を入力します (例: `http://ec2-42-8-168-21.us-west-1.compute.amazonaws.com`)。ウェブサーバーが実行中の場合、Apache テストページが表示されます。

   Apache テストページが表示されない場合は、[チュートリアル: DB インスタンスで使用する 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)」を参照してください。

## Apache ウェブサーバーを DB インスタンスに接続する
<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)」の手順に従います。