はじめに
学生アカウントであるAzure for Studentsを使用している。
この100ドルのクレジットと無料枠を使用して、タダでバックアップサーバを構築する。
ハードウェア
インスタンスは以下のどれか
- B1s (Intel/AMD)
- B2pts v2 (ARMベース)
- B2ats v2 (AMDベース)
ストレージ
64GB(P6 SSD)2ユニットまで12ヶ月間無料なのでこれを利用
アドレス
動的パブリックIP
使用技術
- Cloudflare Tunnel
- Application Insights(Azure)
- Logic App(Azure)
VMの設定
VMを構築する。
VMの作成
VMの設定

サブスクリプション: 「Azure for Students」
リソースグループ: [新規作成]
仮想マシン名: [任意]
リージョン: 「Japan East」
セキュリティの種類: 「Standard」
Standard_B2pts_v2 (ARM64アーキテクチャ)
OSイメージ:Almalinux OS 9 ARM64 Gen2
管理者アカウント

認証の種類: 「SSH 公開鍵」
ユーザー名: azureuser (デフォルト)
SSH 公開鍵のソース: 「新しいキー ペアの生成」
受信ポートの規則
ディスク
ネットワーク


パブリックIP: 「新規作成」し、SKUを Standard
接続
左メニューの「接続」>「Bastion」を選択

「Bastion を構成する」で Developer SKU(無料)を選択
ミドルウェアの設定
NginxとCloudflareの設定を行います
Nginx
Nginxのインストール
sudo apt update && sudo apt install nginx -y
Nginxのインストールと起動
sudo dnf install -y nginx
sudo systemctl enable --now nginx
サイト用ディレクトリの作成
sudo mkdir -p /var/www/example.com
echo "<h1>Welcome to example.com (Azure Backup)</h1>" | sudo tee /var/www/example.com/index.html
sudo chown -R nginx:nginx /var/www/
sudo chcon -R -t httpd_sys_content_t /var/www/example.com
ディレクトリに 755、ファイルに 644 の権限を付与
sudo find /var/www -type d -exec chmod 755 {} \;
sudo find /var/www -type f -exec chmod 644 {} \;
Nginxの設定ファイル作成
sudo vi /etc/nginx/conf.d/example.conf
-------------------------------------
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
-------------------------------------
文法チェック
sudo nginx -t
エラーがなければ再起動
sudo systemctl restart nginx
cloudflaredのインストール
Cloudflareのリポジトリを追加
sudo dnf config-manager --add-repo https://pkg.cloudflare.com/cloudflared-ascii.repo
パッケージをインストール
sudo dnf install -y cloudflared
ログイン
cloudflared tunnel login
表示されたURLをブラウザで開き、自分のアカウントでログインする。
トンネルを作成(azure-static-backupは任意の名前)
cloudflared tunnel create azure-static-backup
以下の表示が出るのでUUIDをメモする
Created tunnel azure-static-backup with id <36文字のUUID>
以下のコマンドでも確認できる
cloudflared tunnel list
config.yml の作成
sudo mkdir -p /etc/cloudflared
sudo vi /etc/cloudflared/config.yml
--------------------------------------------------------------------------
tunnel: <36文字のUUID>
credentials-file: /etc/cloudflared/<36文字のUUID>.json
ingress:
- hostname: example.com
service: http://localhost:80
- service: http_status:404
--------------------------------------------------------------------------
認証ファイルがあることを確認
ls /home/azureuser/.cloudflared/
<36文字のUUID>.jsonがあればOK
移動
sudo cp /home/azureuser/.cloudflared/<36文字のUUID>.json /etc/cloudflared/
既存のサービス設定をリセット(念のため)
sudo cloudflared service uninstall
再インストールと起動
sudo cloudflared --config /etc/cloudflared/config.yml service install
sudo systemctl start cloudflared
状態確認
sudo systemctl status cloudflared
Active: active (running) と表示されればOK
GUIの設定
Cloudflareダッシュボード にログイン
対象のドメインの管理画面に入り、左メニューのDNS>レコード

現在設定されている CNAME レコード(オンプレミス用のトンネルIDを指しているもの)の [編集] をクリック
ターゲット欄を、今回作成したAzure用のUUIDに書き換える
<新規作成したトンネルのUUID>.cfargotunnel.com
[保存] をクリックして、サイトにアクセス後、切り替わっていることを確認する。
Azureで監視する
Azureポータルで「Application Insights」を検索し、任意の名前で作成

リソースグループ:<さっき作ったやつ>
地域: Japan east
ワークスペース:Defaultの新規のもの
トラップを作成する
左側の調査>有効からクラシックテストの追加
テスト名:<任意>
SKU URL ping
URL:オンプレミスで稼働中のドメイン ★切り替えるドメインを指定すると駄目なので後述

切り替え時の挙動の設定
切り替えが必要となった場合(オンプレ側がダウンした場合)に実行させる処理を作成する。
APIの準備
トークンの作成
ダッシュボード内右上の人型アイコン>プロフィール>APIトークン>トークンを作成する


作成したトークンをメモしておく
Record IDの取得
以下を適当なLinuxサーバで実行する。先程作成したVMで実行しても可。
Zone ID: 該当のドメインを選択して「概要」をスクロールすると表示されてる。
curl -X GET "https://api.cloudflare.com/client/v4/zones/{あなたのZoneID}/dns_records" \
-H "Authorization: Bearer {あなたのAPIトークン}" \
-H "Content-Type: application/json"
以下のようなjsonが返って来る
>{"result":[{"id":"XXXXXXXXXXXXXXXXXXXXXXXXXXX","name":……
idの「XXXXXXXXX」をメモしておく。これがRecord IDです。
Azure Logic Appsを構築する
リソースグループ:<さっき作ったやつ>
地域:
ログ分析を有効化:はい
Workflow Type:Stateful

左側の「アクセス制御(IAM)」から追加>ロールの割り当ての追加

メンバー:マネージドIDを選択して、「メンバーを選択する」からマネージドIDをLogic appにして、さっき作成したLogic appを選択

トリガーを「When an HTTP request is received」を設定

プルダウンからサブスクリプションIDと<さっき作ったリソースグループ>、<さっき作ったVM>を選択

下の+マークから「Delay」を追加
パラメータをCount:1、Unit:Minuteで設定

下の+マークから「HTTP」を追加
URI:https://api.cloudflare.com/client/v4/zones/{Zone_ID}/dns_records/{Record_ID}
Method: PUT
Headers:Authorization と Bearer APIトークン、Content-Typeとapplication/json
Body:以下を入れる
{
"type": "CNAME",
"name": "e-desuyo.com",
"content": "<Azure用に新規で作ったトンネルのUUID>.cfargotunnel.com",
"proxied": true
}
リソースグループのIAMを設定する
さっき作ったVMが所属するリソースグループを開く
左側の「アクセス制御(IAM)」から追加>ロールの割り当ての追加

メンバー:マネージドIDを選択して、「メンバーを選択する」からマネージドIDをLogic appにして、さっき作成したLogic appを選択

Logic appに戻る
さっき作ったApplication Insightsを開く
左メニューの監視>アラート>アクション グループ>作成

リソースグループ:<さっき作ったやつ>
リージョン:グローバル

アクションタブ>アクションタイプ:ロジック アプリ、「共通アラート スキーマを有効にします。」:はい

オンプレ側が復帰した場合の処理を追加する
ロジックアプリの修正
デザイナーを開き、トリガー(When an HTTP request is received)の直後に 「Condition」 ブロックを追加
左の欄をクリックして紫の「fx」を選択

パラメータを以下のように設定する
上部のテキスト欄にtriggerBody()?['data']?['essentials']?['monitorCondition']を入力
真ん中演算子は「=」、右はResolved

True側で+を押して、「HTTP」を追加する。
さらにそのHTTPの下に「仮想マシンの割り当て解除」を追加
内容は「仮想マシンの開始」と同じ

追加したHTTPの内容
さっき作ったHTTPと同じ内容で最後のBodyだけ以下のように変更
{
"type": "CNAME",
"name": "e-desuyo.com",
"content": "<オンプレ側のトンネルのUUID>.cfargotunnel.com",
"proxied": true
}
テスト
実際にサービスを停めるなりして動作テストする。
切り替えと復旧が動作すればOK
注意!
Azureでオンプレの死活監視を行っているが、オンプレがダウンした場合に監視先のURLはオンプレに繋がる用になってしまうので、復旧の検知ができない。
なので、Application Insights の監視先を、「オンプレミスサーバーに直結し、かつAzureに切り替わらない専用URL」 に変更する必要がある。
死活監視用トンネルの作成
Cloudflare で監視用サブドメインを作る
monitor.example.comのようにサブドメインを追加する
サービスはhttp://localhost:80






















