CloudWatch Synthetics Canaryで24時間365日のWebサイト監視を実現する方法

## 概要
AWS CloudWatch Synthetics Canaryを使って、Webサイトの可用性とパフォーマンスを自動監視する方法を詳しく解説。Synthetics（シンセティクス）とCanary（カナリア）という用語の意味から、基本的な設定、実践的な活用まで、初心者にも分かりやすく説明します。

## 目次
1. [CloudWatch Synthetics Canaryとは](#cloudwatch-synthetics-canaryとは)
2. [Synthetics（シンセティクス）とCanary（カナリア）の意味](#syntheticsシンセティクスとcanaryカナリアの意味)
3. [Canaryでできることと主要な機能](#canaryでできることと主要な機能)
4. [料金体系と他の監視サービスとの比較](#料金体系と他の監視サービスとの比較)
5. [実際にCanaryを作成してみよう](#実際にcanaryを作成してみよう)
6. [監視結果の確認とアラート設定](#監視結果の確認とアラート設定)
7. [実践的な活用例とベストプラクティス](#実践的な活用例とベストプラクティス)
8. [終わりに](#終わりに)

## CloudWatch Synthetics Canaryとは

AWS CloudWatch Synthetics Canaryは、Webサイトやウェブアプリケーションを継続的に監視するためのAWSのマネージドサービスです。実際のユーザーがWebサイトにアクセスしたときと同じような動作を自動化し、24時間365日、定期的にWebサイトの状態をチェックしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071751/f8d200e0-d14a-4181-a495-876208955499.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4071751/ae223da9-2423-43b7-8e4f-e97589ae737d.png)


このサービスは2020年にAWSから正式リリースされ、従来の監視方法では発見が困難だった問題を事前に検出できる画期的なツールとして注目されています。特に、エンドユーザーの体験そのものを監視できる点が大きな特徴です。

## Synthetics（シンセティクス）とCanary（カナリア）の意味

### Synthetics（シンセティクス）とは

「Synthetics」は英語で「合成の」「人工の」という意味です。ITの監視分野では「**合成監視**」や「**シンセティック監視**」と呼ばれ、実際のユーザーアクセスを人工的に模擬した監視手法を指します。

従来の監視は「サーバーが稼働しているか」「CPUの使用率はどうか」といったシステム側の指標を見ていましたが、Synthetics監視では「実際のユーザーが同じようにアクセスしたらどうなるか」を人工的に再現して確認します。

### Canary（カナリア）とは

「Canary」は「カナリア」という鳥の名前です。これは炭鉱で有毒ガスの検知に使われていたカナリアの故事に由来します。カナリアは有毒ガスに敏感で、危険を早期に察知できることから、「**早期警告システム**」や「**問題の前兆を検知するもの**」という意味で使われるようになりました。

【挿絵候補】：炭鉱のカナリアから着想を得たCanary監視の概念図

ITの世界では、システムに問題が発生する前に異常を検知する監視手法を「Canary監視」と呼びます。AWS CloudWatch Synthetics Canaryも、ユーザーが問題に気づく前に異常を検知する「早期警告システム」として機能します。

## Canaryでできることと主要な機能

AWS CloudWatch Synthetics Canaryは、以下のような監視を自動化できます：

### 基本的な監視機能

**URLの可用性チェック**
- 指定したWebページが正常にアクセスできるかを定期的に確認
- HTTPステータスコード、応答時間、コンテンツの内容を監視

**マルチステップの動作監視**
- ログイン → 商品検索 → 購入といった一連の操作を自動実行
- 実際のユーザージャーニーをシミュレーション

### 高度な機能

**スクリーンショット機能**
- 問題発生時のWebページの状態を画像として自動保存
- 視覚的な不具合も検出可能

**HAR（HTTP Archive）ファイル生成**
- ネットワーク通信の詳細なログを記録
- パフォーマンスボトルネックの特定に活用

**複数地点からの監視**
- 世界各地のAWSリージョンから同時監視
- 地域ごとのアクセス状況の比較が可能

### 監視対象の例

| 監視対象 | 具体例 | 検出できる問題 |
|---------|-------|---------------|
| ECサイト | ログイン→商品検索→カート追加 | 決済システムの障害 |
| 企業サイト | トップページ→問い合わせフォーム | フォーム送信エラー |
| WebAPI | APIエンドポイントへのリクエスト | レスポンス時間の劣化 |
| ダッシュボード | 管理画面へのログイン→データ表示 | 認証システムの不具合 |

## 料金体系と他の監視サービスとの比較

### CloudWatch Synthetics の料金

AWS CloudWatch Syntheticsの料金は実行回数ベースで課金されます（2025年6月時点東京リージョン）：

- **1回の実行あたり**: $0.0019
- **月額固定費**: なし
- **無料利用枠**: 月100回まで無料

例えば、5分間隔で24時間監視する場合：
- 1日の実行回数: 288回（24時間 × 12回/時間）  
- 1ヶ月の実行回数: 約8,640回
- 月額料金: (8,640 - 100) × $0.0019 = 約$16.23

AWS公式ドキュメント ( https://aws.amazon.com/cloudwatch/pricing/ ) によると、この価格設定により、小規模から大規模まで幅広い用途に対応できるとされています。

### 他サービスとの比較

| サービス | 月額料金目安 | 特徴 | 適用場面 |
|---------|-------------|------|---------|
| CloudWatch Synthetics | 1,500円〜 | AWSネイティブ、スクリーンショット機能 | AWS環境メイン |
| 外部監視サービス | 3,000円〜 | 豊富な機能、サポート充実 | 包括的な監視 |
| Pingdom | 1,000円〜 | シンプル、使いやすい | 基本的な監視 |
| New Relic | 5,000円〜 | APM連携、詳細分析 | 本格的な監視 |

## 実際にCanaryを作成してみよう

ここでは、AWS Management Consoleを使ってCanaryを作成する手順を説明します。

### 前提条件

- AWSアカウントとIAMユーザーが設定済み
- CloudWatch Syntheticsの権限を持つIAMロール
- 監視対象のWebサイトURL

### Step 1: CloudWatch Syntheticsサービスにアクセス

```bash
# AWS CLIでリージョンを確認（オプション）  
aws configure get region
```

AWS Management Consoleにログイン後、CloudWatch > Synthetics > Canaries の順に移動します。

【挿絵候補】：AWS Management ConsoleのCloudWatch Synthetics画面

### Step 2: Canaryの基本設定

「Create canary」ボタンをクリックし、以下を設定します：

**基本情報**
- **Name**: `my-website-monitor`（英数字とハイフンのみ）
- **Description**: `メインWebサイトの監視用Canary`

**監視設定**
- **Application or endpoint URL**: 監視したいWebサイトのURL
- **Script**: 「URL monitoring」を選択（基本的な監視の場合）

### Step 3: 実行スケジュールの設定

**スケジュール設定**
- **How often**: `5 minutes`（5分間隔での監視）
- **Start time**: `Now`（即座に開始）
- **How long**: `Continuously`（継続的に実行）

AWS公式ドキュメント ( https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries.html ) によると、最短1分間隔から最長1時間間隔まで設定可能です。

### Step 4: データ保存設定

**S3バケット設定**
- **S3 bucket**: CloudWatch Syntheticsが自動で作成するバケットを使用
- **Prefix**: `canary-results/`（結果ファイルの保存先）

**データ保存期間**
- **CloudWatch metrics**: 15ヶ月
- **S3 artifacts**: 30日

### Step 5: IAMロールの設定

**IAMロール**
- 「Create a new role」を選択（初回の場合）
- ロール名: `CloudWatchSyntheticsRole-my-website-monitor`

このロールには以下の権限が自動で付与されます：
- CloudWatch Logsへの書き込み権限
- S3バケットへの読み書き権限
- Lambda関数の実行権限

### Step 6: Canaryの作成と動作確認

「Create canary」をクリックして作成完了です。作成後、数分で最初の監視結果が表示されます。

```bash
# AWS CLIでCanaryの状態確認（オプション）
aws synthetics describe-canaries --name my-website-monitor
```

## 監視結果の確認とアラート設定

### 監視結果の確認方法

Canaryが作成されると、CloudWatch Syntheticsのダッシュボードで結果を確認できます。

**主要な監視指標**
- **Success rate**: 成功率（％）
- **Duration**: 応答時間（ミリ秒）
- **Screenshot**: エラー時のスクリーンショット
- **Logs**: 詳細なログ情報

### CloudWatch Alarmsとの連携

問題発生時の自動通知を設定するため、CloudWatch Alarmsと連携します：

**アラーム設定例**
```bash
# 成功率が90%を下回った場合のアラーム作成
aws cloudwatch put-metric-alarm \
  --alarm-name "Website-Availability-Low" \
  --alarm-description "Webサイトの可用性が低下" \
  --metric-name SuccessPercent \
  --namespace CloudWatchSynthetics \
  --statistic Average \
  --period 300 \
  --threshold 90 \
  --comparison-operator LessThanThreshold \
  --evaluation-periods 1
```

### SNS通知の設定

```bash
# SNSトピック作成
aws sns create-topic --name website-alerts

# メール通知先を追加
aws sns subscribe \
  --topic-arn arn:aws:sns:ap-northeast-1:123456789012:website-alerts \
  --protocol email \
  --notification-endpoint your-email@example.com
```

## 実践的な活用例とベストプラクティス

### ECサイトでの活用例

オンラインストアを運営する企業での実際の活用例をご紹介します：

**監視対象フロー**
1. トップページアクセス
2. 商品カテゴリページ表示
3. 商品詳細ページ表示  
4. カートに商品追加
5. 決済画面表示（実際の決済は行わない）

**カスタムスクリプト例**
```javascript
const synthetics = require('Synthetics');
const log = require('SyntheticsLogger');

const flowBuilderBlueprint = async function () {
    // トップページにアクセス
    await synthetics.executeStep('loadHomePage', async function() {
        await synthetics.getPage().goto('https://example-store.com');
    });
    
    // 商品検索
    await synthetics.executeStep('searchProduct', async function() {
        await synthetics.getPage().type('#search-box', 'ノートパソコン');
        await synthetics.getPage().click('#search-button');
    });
    
    // 商品詳細確認
    await synthetics.executeStep('viewProduct', async function() {
        await synthetics.getPage().click('.product-link:first-child');
        await synthetics.getPage().waitForSelector('#product-price');
    });
};

exports.handler = async () => {
    return await synthetics.executeStep('flowBuilder', flowBuilderBlueprint);
};
```

### ベストプラクティス

**1. 適切な監視間隔の設定**
- 重要なサービス: 1-5分間隔
- 一般的なWebサイト: 5-15分間隔  
- 開発環境: 30分-1時間間隔

**2. 複数地点からの監視**
```bash
# 複数リージョンでのCanary作成例
regions=("us-east-1" "ap-northeast-1" "eu-west-1")
for region in "${regions[@]}"; do
    aws synthetics create-canary \
        --name "website-monitor-${region}" \
        --region "${region}" \
        # その他のパラメータ...
done
```

**3. エラー処理とリトライ機能**
一時的なネットワークエラーを考慮し、適切なリトライ設定を行います：

```javascript
// リトライ機能付きのスクリプト例
const maxRetries = 3;
let retryCount = 0;

while (retryCount < maxRetries) {
    try {
        await synthetics.getPage().goto(url, {waitUntil: 'networkidle0'});
        break; // 成功した場合はループを抜ける
    } catch (error) {
        retryCount++;
        if (retryCount >= maxRetries) {
            throw error; // 最大リトライ回数に達したらエラーを投げる
        }
        await new Promise(resolve => setTimeout(resolve, 1000)); // 1秒待機
    }
}
```

**4. セキュリティ対策**
- 認証情報はAWS Secrets Managerで管理
- IAMロールは最小権限の原則を適用
- S3バケットのアクセス制御を適切に設定

### 運用上の注意点

**コスト最適化**
- 不要なCanaryは定期的に削除
- 開発環境での過度な監視は避ける
- S3のライフサイクルポリシーを設定してストレージコストを削減

**False Positiveの対策**
- 適切なタイムアウト値の設定
- ネットワーク遅延を考慮した閾値設定
- メンテナンス時間帯のアラート除外設定

## 終わりに

AWS CloudWatch Synthetics Canaryは、従来のサーバー監視では検出できなかった「ユーザー体験」の問題を事前に発見できる強力なツールです。Synthetics（合成監視）とCanary（早期警告）という名前の通り、人工的にユーザーの行動を再現し、問題を早期に検知することで、実際のユーザーが不具合に遭遇する前に対処できます。

特に以下のような場面で威力を発揮します：
- ECサイトの決済フローの監視
- 重要なWebアプリケーションの可用性監視  
- 複数地域からのアクセス性確認
- パフォーマンス劣化の早期発見

今回紹介した基本的な設定から始めて、徐々にカスタムスクリプトやアラート設定を拡張していくことをお勧めします。まずは重要なWebページから監視を開始し、運用に慣れてから監視範囲を拡大していきましょう。

次のステップとして、カスタムスクリプトの作成やCloudFormationを使った自動化にもチャレンジしてみてください。継続的な監視により、より安定したWebサービスの提供が実現できるはずです。

## 参考文献・参考サイト

- 「Amazon CloudWatch Synthetics User Guide」AWS Documentation, https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries.html
- 「CloudWatch pricing」AWS Documentation, https://aws.amazon.com/cloudwatch/pricing/
- 「Using synthetic monitoring」AWS Documentation, https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_Canaries_Create.html
- 「Best practices for Amazon CloudWatch Synthetics」AWS Documentation, https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Synthetics_best_practices.html