EC2インスタンス構築およびApache導入記録

DS243100 岡田修門

本ドキュメントは、Amazon Web Services (AWS) の EC2 インスタンス上に Apache HTTP Server を導入し、Webサーバーとして完全に自律駆動させるまでの全インフラ構築プロセスを客観的に記録したものである。

1. EC2 インスタンス起動設定

起動時のインスタンス構成パラメータは以下の通りである。

1.1. 基本情報・タグ

1.2. アプリケーションおよび OS イメージ (AMI)

1.3. インスタンス仕様・ストレージ

1.4. ネットワーク・セキュリティ設定

1.5. Elastic IP設定

HTTPS化の為にドメインとIPアドレスの固定化を行う。通常パブリック IP は再起動の度に再割り当てとなるが、Elastic IPを使用することで、サーバー再起動時もIPが変わらず、DNS設定やSSL/TLS証明書の自動更新エラーを防ぎます。

1.6. DNS設定

2. サーバーへの接続方法

macのターミナルからSSHクライアントとダウンロードした秘密鍵を用いて、以下のコマンドでインスタンスへ接続を行う。

Bash

ssh -i "Downloads/AirChecker for Shonan Beach FM-2.pem" ec2-user@demo20260712.develop.azm.ne.jp

3. 初期設定および Apache HTTP Server のインストール手順

3.1. システムのアップデート、タイムゾーン指定

パッケージメタデータの更新確認およびシステム全体のパッケージを最新バージョンに引き上げる。
時間帯を調整する。

Bash

# パッケージメタデータの更新とキャッシュチェック
sudo dnf check-update

# システム全体のパッケージを最新バージョンに引き上げ
sudo dnf update -y

# OSのタイムゾーンをアジア/東京に設定
sudo timedatectl set-timezone Asia/Tokyo

# 時計が日本時間(現在11:41など)になったか確認
date

3.2. Apache HTTP Server のインストール

Amazon Linux 2023 の公式リポジトリより、コアパッケージである httpd(Apache)のインストールを実施する。

Bash

# Apache本体および関連依存パッケージのインストール
sudo dnf install -y httpd

3.3. サーバープロセスの起動と状態検証

インストール直後の Apache サービスは停止状態(Inactive)であるため、明示的にプロセスを起動し、その稼働ステータスを客観的に検証する。
Bash

# Apache サービス(httpd)の起動
sudo systemctl start httpd

# 稼働状態(ステータス)の確認
sudo systemctl status httpd

ステータス出力(検証ポイント)

コマンド執行後、出力ログの Active: 項目が以下のように active (running) と緑色で表示され、Webサーバーとして正常にプロセスがメモリ上に展開されたことを示す。
Plaintext

● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     Active: active (running) since Sat 2026-07-11 16:50:00 JST; 1min ago

3.4. OS起動時の自動有効化設定(永続化)

EC2インスタンスの停止・再起動や予期せぬ瞬断が発生した場合でも、Webサーバーが人間の手を介さずに自動で復旧・常駐するように、OSのシステム管理(systemd)へ自動起動設定を登録する。
Bash

# OS起動時の自動有効化を永続化登録
sudo systemctl enable httpd

3.5. 疎通確認

外部ブラウザからアクセスされた際に、コンテンツが正常に読み込めるよう、既定のWeb公開ルートディレクトリの権限を確認し、本ドキュメントを index.html として設置する。
URL
http://demo20260712.develop.azm.ne.jp/

3.6. https通信の実装

Let’s Encrypt が公式に提供している自動化ツール Certbot を利用することで、証明書の取得から Apache の設定更新、さらには有効期限(90日間)の自動更新の設定までを実装する。

3.6.1. Apache のポート 80 のバーチャルホスト設定

/etc/httpd/conf.d/ 配下に新しく設定ファイル(例: airchecker.conf)を作成します。

Bash

sudo vi /etc/httpd/conf.d/airchecker.conf

ファイルの中に以下の内容を記述して保存します。

Plaintext

<VirtualHost *:80>
    ServerName demo20260712.develop.azm.ne.jp
    DocumentRoot /var/www/html

    <Directory "/var/www/html">
        AllowOverride None
        Require all granted
        DirectoryIndex airchecker.html index.html
    </Directory>
</VirtualHost>

3.6.2: Apache の設定チェックと再起動

構文チェックを行い、Apache を再起動して設定を反映させます。

Bash

# 構文チェック(Syntax OK と出れば正常)
sudo httpd -t

# Apache の再起動
sudo systemctl restart httpd

3.6.3: 再度 Certbot を実行する

下準備が整ったので、Let’s Encrypt のコマンドを実行します。

Bash

sudo certbot --apache

3.6.4: Apache を再起動と確認

Apache を再起動して確認する。

Bash

# Apache の再起動
sudo systemctl restart httpd

以下のURLを開く。
URL
https://demo20260712.develop.azm.ne.jp/

4. 湘南ビーチFM エアチェック・システム 仕様書

URL
[http://demo20260712.develop.azm.ne.jp/airchecker.html

本システムは、Amazon EC2 (Linux) 環境において、湘南ビーチFM(IPサイマルラジオ)の番組をWeb UIから簡単な操作で予約し、バックグラウンドで最高音質(無劣化)のままエアチェック(録音)を行うシステムである。

4.1. 全体アーキテクチャとデータフロー

システムは以下の5つのレイヤーによるバケツリレー方式で堅牢に動作する。

[1. airchecker.html (Web UI)] 
       │ (JSON形式の予約リクエスト送信 / 曜日タブ・編集機能)
       ▼
[2. reserve_handler.py (CGI)] 
       │ (リクエストを検証、大文字始まり曜日正規化、ユニークな予約票JSONを生成)
       ▼
[3. at_scheduler.py (毎分cron巡回)] 
       │ (pending状態の予約票を検知、次回該当曜日の具体的な日付(YYYY-MM-DD)を算出)
       ▼
[4. Linux atd (at デーモン)] 
       │ (指定日時にec2-user権限でバックグラウンド実行)
       ▼
[5. ffmpeg (コア録音処理)] ➔ 最高音質(.m4a)で保存 ➔ [後処理] 予約票の自動削除/ステータス復帰

4.2. 各コンポーネントの仕様

4.2.1. フロントエンド UI (index.html)

4.2.2. 予約受付ハンドラー (reserve_handler.py)

4.2.3. タスクスケジューラー (at_scheduler.py)

4.2.4. 実行エンジン (atd & ffmpeg)

4.2.5. ライブラリ配信API (get_recordings.py)

4.3. ディレクトリ構造と所有権・パーミッション設計

システムをWEBとOSデーモンの両権限で衝突なく安定稼働させるための、厳格なセキュリティおよびアクセス権限の設計シート。

4.3.1. 配置マップ

/usr/local/bin/ 
└── at_scheduler.py [755 / root:root または ec2-user:ec2-user] 巡回
スケジューラー本体

/var/www/html/ 
├── index.html [644 / apache:apache] Webメイン画面 
├── reserve_handler.py [755 / apache:apache] 予約受付CGI
├── program_data.json       [644 / apache:apache] マスター番組スケジュール表
├── list_reservations.py    [755 / apache:apache] 予約状況一覧CGI
├── get_recordings.py       [755 / apache:apache] 録音ファイル一覧CGI
├── queue/                  [755 / apache:apache] 予約票(JSON)の一時保管庫
│   └── scheduler.log       [644 / ec2-user:ec2-user] 巡回ログ
└── recordings/             [775 / ec2-user:apache] 録音済みオーディオ保管庫
    └── rec_*.m4a           [664 / ec2-user:apache] 実際の録音ファイル

4.3.2. パーミッションの根拠

4.4. システム運用・ジョブ管理コマンド

4.4.1. 巡回ジョブ(cron)の登録

スケジューラーは一般ユーザーである ec2-user の cron で安全に稼働する。

Plaintext

* * * * * /usr/bin/python3 /var/www/html/at_scheduler.py >> /var/www/html/queue/scheduler.log 2>&1

4.4.2. at ジョブの管理コマンド