皆様おはようございます。
今回あるお客様から、IT基盤の運用をある程度自動化したい、とご相談を受けたので、これを簡単に実装していきたいと思います。
今回の自動化対象はWebサイトの正常性監視で、ログイン行為をオペレーターの方が一定期間ごとに手動で実施している、という内容だったので、サイト監視機能を用いて実装します。
また今回の構成は外部から公開サイトの正常性監視という位置づけなので外形監視にあたります。
構成図

今回はAWS CloudWatch Synthetics Canaryを使ってWebアプリやWebサイトの正常性監視を行います。
以降本記事では、WebアプリやWebサイトをまとめてWebサービスと呼びます。
AWS上にWebサービスを構築しても良かったのですが、AWS上に構築したWebサービスをAWSの機能で監視するとAWSでしか通用しない監視体制になってしまう(AWSバックボーンネットワークを経由した死活監視など)可能性を排除するため、Webサービス側はあえてAzure上に構築しました。
本記事ではまずは以下の赤枠内Azure上のApp ServiceにログインできるWebサービスを構築します。

環境構築
では早速環境構築を行いましょう。
Webサービス(App Service)側
Azure Portalログイン
https://portal.azure.com
にアクセスしログインします。
[すべてのサービス]をクリックします。

App Service デプロイ
画面上部の[サービスフィルター]に[App Service]と入力するとサービスが絞られます。
検索後最上位にお目当ての[App Service]が出てきますのでクリックします。

当たり前ですが何もないので画面上段の[作成]をクリックし[Webアプリ]をクリックします。
本来はログインユーザーを管理するDBもあっても良いかなと思いますが、今回Webサービス側のDBの有無は本論でなないのでDB構築はスキップします。
お金もかかりますしね。

こんな感じでやいのやいの設定項目入れましょうと出てくるので上から順に行きましょう。

以下設定項目が多いのでリストにします。
| 項目名 | 設定値 | 備考 |
|---|---|---|
| 名前 | test-webapp01 | インターネット上でユニークになるようにAzure側で調整してくれます。 |
| 公開 | コード | [公開]という翻訳がイケてないですね。コードかコンテナかという選択肢なので今回はコードを選びます。 |
| ランタイムスタック | PHP 8.5 | たぶんお試しWebサービスの実装が一番簡便であろうPHPの最新版を選びますが、お得意なコードがある場合はお好きに選択してください。 |
| オペレーティングシステム | Linux | こちらはコードでPHPを選ぶと自動選択されます。 |
| リージョン | Southeast Asia(東南アジア) | 日本から近くて安いリージョンです。 |
| 価格プラン | Free F1 | 1日60分しか使えませんが無料のプランです。1サブスクリプションあたり1つしかデプロイできません。 |
他のパラメーターはもう必要ないので[確認および作成]をクリックします。

デプロイは一瞬で済みました。
カスタムドメイン設定01
念のためカスタムドメインを設定します。
[カスタムドメインの追加]をクリックします。
以降はまたリスト形式にします。
| 項目名 | 設定値 | 備考 |
|---|---|---|
| ドメインプロバイダー | その他のすべてのドメインサービス | ドメイン名をDNSレコード設定できる場合はこちらを選びます。 |
| ドメイン | 任意のドメイン名を入力 | こちらは任意で大丈夫です。 |
| ホスト名レコードの種類 | CNAME | こちらはApp ServiceなのでCNAMEがおすすめです。 |
ここまで入力し出てきたした二つのCNAMEレコードとTXTレコードをDNSレコードに登録します。

以降、DNS設定はそのまま置いておきましょう。
閉じてしまっても再度続きから設定は可能です。
DNS設定
CNAME
まずはCNAMEから設定していきます。
Azure DNSでDNSをホストしている場合は以下のように設定します。
| 項目名 | 設定値 | 備考 |
|---|---|---|
| ホスト | test-webapp01 | サブドメイン名を入力します。 |
| 種類 | CNAME | 先のApp Serviceの設定で指定されたようにCNAMEを選択します。 |
| 値 | 先のApp Serviceの設定で出力された値をコピーします。 | 先のApp Serviceの設定で出力された値をコピーします。 |
TXTレコード
こちらもCNAMEと同じです。
| 項目名 | 設定値 | 備考 |
|---|---|---|
| ホスト | asuid.test-webapp01 | 先のApp Serviceの設定で出力された値をコピーします。 |
| 種類 | TXT | 先のApp Serviceの設定で指定されたようにTXTを選択します。 |
| 値 | 先のApp Serviceの設定で出力された値をコピーします。 | 先のApp Serviceの設定で出力された値をコピーします。 |
カスタムドメイン設定02
カスタムドメイン設定01の設定を閉じずにおいていれば、最後の[検証]をクリックします。

[状態]に緑色のチェックマークがついたらこの作業は[キャンセル]を押して終了です。

カスタムドメインの状態が[セキュリティ保護付き]になります。

設定したカスタムドメインでアクセスして以下のような画面が出れば設定は完了です。

Webサービス(アプリ)設定
作成したWebサイトにSSHでアクセスし、PHPファイルを配置していきます。
Azure Portal内の[開発ツール]から[SSH]を選択します。

[移動]をクリックします。

/home/site/wwwrootという場所にhtmlファイルが置いてあり、ログイン後のカレントディレクトリは/homeという構成になっています。

試しにhostingstart.htmlをリネームして同名で適当なファイルを置いて先のApp Serviceのサイトが変化するか見てみましょう。
いったん切り戻しを考慮して以下のようにコマンドを書いてみましょう。
mv site/wwwroot/hostingstart.html site/wwwroot/hostingstart.html_org
echo "test site" > site/wwwroot/hostingstart.html
実際にコマンドを実行してみると以下のようになります。
エラーは出ませんでしたね。

試しにアクセスしてみるとちゃんと変わってますね。

PHPファイルの配置
以下のPHPファイルを配置します。
まずはログイン用のページから。
<?php
session_start();
$error = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$username = $_POST["username"] ?? "";
$password = $_POST["password"] ?? "";
// 固定ID/PW
$valid_user = "admin";
$valid_pass = "P@ssw0rd0123";
if ($username === $valid_user && $password === $valid_pass) {
$_SESSION["logged_in"] = true;
$_SESSION["username"] = $username;
header("Location: dashboard.php");
exit;
} else {
$error = "ログインに失敗しました";
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<?php if ($error): ?>
<p style="color:red;">
<?php echo htmlspecialchars($error, ENT_QUOTES, 'UTF-8'); ?>
</p>
<?php endif; ?>
<form method="POST" action="login.php">
<label>User Name:</label><br>
<input type="text" name="username"><br><br>
<label>Password:</label><br>
<input type="password" name="password"><br><br>
<button type="submit">Login</button>
</form>
</body>
</html>
注意事項としては、今回は検証用サイトなのでこのログイン用のPHPファイルにログインIDとパスワードを直接記載していることですね。
次にログイン後のページです。
<?php
session_start();
// 未ログインならlogin.phpへ
if (!isset($_SESSION["logged_in"]) || $_SESSION["logged_in"] !== true) {
header("Location: login.php");
exit;
}
$username = $_SESSION["username"];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Dashboard</title>
</head>
<body>
<h1>Dashboard</h1>
<p>
Welcome,
<?php echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); ?>
</p>
<p id="login-success">
ログイン成功
</p>
<a href="logout.php">Logout</a>
</body>
</html>
ポイントとしては2つあります。
1つ目
サイトにsession_start();というログインセッション確認用のコードがあることです。
これでログインしているセッションかどうか確認しています。
ログイン後のページなので必須のパラメーターです。
2つ目
<p id="login-success">です。
サイトの構成次第ですが、今回はログイン成功を正確に読み取るためphpファイルの中にidを埋め込みました。
次にログアウト時のページです。
<?php
session_start();
session_unset();
session_destroy();
header("Location: login.php");
exit;
?>
ポイントとしてはこちらも最初にセッション確認のコードがあり、ログアウトのページなのでsession_unset()とsession_destroy()とがあります。
試しにアクセスしてみましょう。

更に試しにログインしてみると

はい。
問題なさそうですね。
監視基盤構築まで進めてしまいたかったですが思ったよりも長くなってしまったので本日はここまで。







