ここではAWSのコンピューティングサービスであるEC2で動的なWebサイトを構築する方法を紹介します。静的Webサイトの構築でも紹介しましたが、動的Webサイトとはサーバ側で何かしらの処理をして、その結果をクライアントに送信するような部分があるものです。APIなどもそうですし、PHP等のサーバサイドのプログラムを実行するものは動的Webサイトとなります。
EC2とは
EC2とは、Elastic Compute Cloudの略でECC→EC2です。仮想サーバ関連全般のサービスが備わっていますが、その中で基本となるのが、CPUやメモリ、ストレージを組み合わせたインスタンスという仮想サーバになります。EC2インスタンスの料金は、起動している時間単位で課金されますが、起動時間の秒単位で計算されますので(最低60秒)、停止している間は課金されません。(ストレージの部分だけはかかることがあります)
ですので、何か試してみたい時に気軽にサーバを立ち上げてテストすることが低コストでできます。無料枠もあり、t2.microという最小のインスタンスであれば月に750時間までは無料です。(最初の12ヶ月間のみ)つまり、t2.micro1台だけであれば常時起動させていても1年間は無料で使えます。(31日間使っても744時間のため)
ここでは、t2.microインスタンスを使って、動的Webサーバを構築する手順をご紹介します。
EC2で動的Webサイトを構築
EC2インスタンスを起動させると専有のサーバが立ち上がりますが、その周辺の設定をしてあげないとサーバとしては機能しません。サブネットやルーティング等の設定が必要になります。幸いなことに、AWSアカウントの初期状態で下図に示すように、VPCがひとつ、サブネットが各Availability Zoneごとにひとつ(計3つ)、さらにそのサブネットから外部に通信できるインターネットゲートウェイがデフォルトで作られています。これらを使えば、EC2インスタンスを作成してすぐにサーバとしての機能を提供できます。

ここで、それぞれがどんなものなのかを簡単に説明します。まず、VPC(Virtual Private Cloud)は、仮想ネットワークなのですが、ひとつのローカルエリアネットワークのようなイメージです。この中はプライベートIPアドレスで通信でき、外部(インターネット)との通信は、インターネットゲートウェイを介して行います。(NATとは違い、VPC内のサーバにもグローバルIPアドレスを割り当てられます。)
VPC内はサブネットを複数もつことができて、上述のインターネットゲートウェイ経由で外部と通信するサブネットをPublic Subnet、上図には書いてないですが、NAT Gatewayを介して外部と通信する必要があるサブネットをPrivate Subnetと呼びます。
Availability Zoneとは、サーバの物理的なロケーションのようなもので、日本リージョンには、a, c, dの3つが使えます。マルチAZと言われる複数のゾーンにサーバを分散配置しておけば、大規模停電などで a が全滅したとしても、cやdは生きている可能性がありますので、サービス断にならずに済むことがあります。
EC2インスタンスの作成
それでは、実際にEC2を作成してWebサーバを構築していきます。
まず、AWSコンソールからEC2のサービスを選択します。そしてEC2ダッシュボードを選択すると下記のような画面になると思います。最初は何もインスタンスが無い状態ですが、右上の「インスタンスを起動」のボタンを押すと、インスタンスの作成ができます。

まず、インスタンスの名前とOSイメージを決めます。今回は「test-ec2」というインスタンス名にして、OSはUbuntu 22.04を利用します。

次にインスタンスタイプを選びます。これはCPUやメモリのスペックになります。高性能なほど時間単価が高くなります。ここでは、無料枠で利用できる t2.microを選択します。

さらに、キーペアを設定する必要があります。これは作成したインスタンスにデフォルトユーザでSSHログインするための秘密鍵・公開鍵のキーペアになります。最初はキーペアは無いので、「新しいキーペアの作成」で作成します。作成すると自動的に秘密鍵の方がダウンロードされます。秘密鍵をダウンロードできるのはこの作成時の時だけなので、無くさないように(かつ誰にも見られないように)気をつけて保管します。
次にネットワークの設定に進みます。ここで先ほど説明したVPCやサブネットの話がでてきます。

VPCやサブネットはデフォルトのものしかない場合はそれを使うようにセットされています。(サブネットは3つあるので使いたいものを指定したい場合は選択します)パブリックIPの自動割り当ては有効化にしておきます。これで作成するインスタンスにグローバルIPアドレスが付与され、外部と通信できるようになります。
その次のセキュリティグループが大事です。これは、このインスタンスに対して外部からの接続を許可する設定をします。不必要に開けてしまうとサイバー攻撃の標的となってしまうかもしれませんので、必要最低限のものだけを許可するようにします。まず、自分がSSHログインをする必要がありますので、自分のIPアドレスからのみSSHトラフィックを許可します。また、Webサーバとして提供する場合は、「インターネットからのHTTP/HTTPSのトラフィックを許可」も有効化する必要があります。
今回はテストなので、作成したセキュリティグループの「インバウンドのルールを編集」で自分のIPだけHTTPを許可する設定を書きます。(これは後からでもいつでも変更できます)

全ての設定を選択して、インスタンスを起動させると先ほどのEC2ダッシュボードに作成したインスタンスが表示されます。

このインスタンスをチェックすると、インスタンスのパブリックIPアドレス等がわかりますので、そのIPアドレス宛にSSHログインできます。OSがubuntuの場合、デフォルトユーザ名は ubuntu ですので、先ほどダウンロードしたキーペアの秘密鍵を使って、下記のコマンドでログインできます。
# ssh -i test-keypair.pem ubuntu@(インスタンスのパブリックIPアドレス)
これでログインできたら、sudoコマンドが使えますので、sudoでサーバ内を好きなように設定していきます。
Webサーバのインストール
ここでは、apache2とphpでWebサーバを構築します。先ほどのインスタンスにログインして、sudoでインストールすればすぐに完了できます。
まず、apache2のインストールです。
# sudo apt update
# sudo apt-get install apache2
# sudo systemctl start apache2
これで、apache2のパッケージをインストールできサーバが起動します。(インスタンス起動時に自動で立ち上げたい場合は、systemctl enable apache2 もしておきます)
これで、ブラウザからアクセスしてみます。
http://インスタンスのパブリックIPアドレス/
にアクセスしてみましょう。セキュリティグループ等の設定がうまくできていれば、下記のような画面がブラウザに表示されます。

(ブラウザによっては、httpsじゃないと警告がでることがありますが、気にせず進めば見れます)
次に、PHPのインストールをします。
# sudo apt-get install php
これだけでPHPをインストールしてくれて、apache2からPHPをつかうモジュールもインストールしてくれます。
apache2でPHPが使えるかを確認するために、下記のファイルを作って /var/www/html/ におきます。
<?php
phpinfo();
?>
ファイル名は index.php などにしておきます。
そして先ほどと同様にブラウザから下記のURLにアクセスしてみます。
http://インスタンスのパブリックIPアドレス/index.php
これで下記のような画面が表示されれば、PHPも動作しています。

これはサーバ側でPHPのプログラムを実行した結果をHTMLで送ってくれています。つまり、サーバでの何かしらの処理結果を表示するということができています。
ここまでできれば、後はPHPでデータベースを読みに行ったり、書き込んだり、外部APIを呼んでその結果を返したり、いろいろなことができるようになります。
これで動的Webサーバを作る下地ができました。
備考
動的Webサーバを構築するにあたって、必ずしもEC2が必要なわけではありません。AWS Lambdaを使えばサーバレスで動的なWebサーバやAPIを構築できます。PHPを動かすこともできます。簡単なものならLambdaでサーバレスで構築する方が安上がりですが、最初はEC2で構築する方がわかりやすいし作りやすいと思いましたので、EC2での構築方法を書いております。