Amazon Connect “オペレーション時間” 機能で実現する自動開閉局制御

### 目次

1. [アーキテクチャ全体像](#architecture)
2. [概要](#overview)
3. [詳細設計](#design)
4. [比較分析](#comparison)
5. [テスト・検証計画](#testing)
6. [注意点＆運用設計](#operation)
7. [まとめ＆拡張ポイント](#conclusion)

---

<a name="architecture"></a>

## アーキテクチャ全体像 🚀

```
顧客端末 ─▶ Route 53 ─▶ Amazon Connect インスタンス 
     │                     │
     │                     ├─ キュー設定（営業時間判定）
     │                     └─ コンタクトフロー（Check Hoursブロック）
     ▼                     │
  FAQ/IVR ←───────────────┘
```

こんな感じで、営業時間に応じてオペレーター対応かFAQガイダンスに振り分けるイメージです。

---

<a name="overview"></a>

## 1. 概要 👍

**“オペレーション時間”機能**って、要は定義した営業日・営業時間だけコールを受け付けて、それ以外は自動ガイダンスに切り替える仕組みです。

* 営業時間内 → オペレーター
* 営業時間外 → 自動IVR or 留守番ガイダンス

**ユースケース**としては…

* EC注文前後の問い合わせ
* 定期購入プランの変更や解約
* キャンペーン案内

みたいな場面で「営業時間忘れて夜中にかかってきても大変だよね？」って問題をスマートに解決できると思います。

---

<a name="design"></a>

## 2. 詳細設計 🛠️

### 2.1 活用パターン

* **パターンA：キュー設定**
  キューに直接営業時間カレンダーを紐付けて、一律制御。
* **パターンB：フロー内ブロック**
  コンタクトフローの任意箇所に時間判定ブロックを入れて、細かく分岐処理が可能。

---

### 2.2 設定箇所①：キュー設定

1. コンソール → **連絡先キュー** → 対象キュー
2. 「営業時間」タブでカレンダーを選ぶだけ。ラクチンですよね？
3. 保存しておしまい！

#### CloudFormation例

```yaml
Resources:
  SupportQueue:
    Type: AWS::Connect::Queue
    Properties:
      InstanceId: !Ref ConnectInstance
      Name: "CustomerSupportQueue"
      HoursOfOperationId: !Ref BusinessHoursJP
```

---

### 2.3 設定箇所②：コンタクトフロー内ブロック

1. コンソール → **Contact flows** → フロー編集
2. 「Check hours of operation」ブロックをポイッと配置
3. カレンダー選んで、Within／Outsideの分岐先を設定するだけ！

```xml
<CheckHoursOfOperation
  HoursOfOperationARN="arn:aws:connect:…:hours-of-operation/BusinessHoursJP"
  IfWithinHoursBranch="InsideFlow"
  IfOutsideHoursBranch="OutsideFlow"/>
```

フロー設計は少し慣れが必要だけど、時間外の対応をめっちゃ柔軟に作れるのが魅力です。

---

### 2.4 祝日カレンダー自動更新 Lambdaサンプル 🎉

```python
import boto3, requests, datetime, json

CONNECT_ID = "abcdefgh-1234-5678-..."
HOURS_ID   = "hours-01"
API_URL    = "https://holidays-jp.github.io/api/v1/date.json"

def lambda_handler(event, _):
    holidays = requests.get(API_URL).json()
    config = []
    for d in holidays:
        date = datetime.datetime.fromisoformat(d)
        config.append({
            "Day": date.strftime("%A").upper(),
            "StartTime": {"Hour":0, "Minute":0},
            "EndTime":   {"Hour":0, "Minute":0}
        })
    boto3.client("connect").update_hours_of_operation(
        InstanceId=CONNECT_ID,
        HoursOfOperationId=HOURS_ID,
        Config=config
    )
```

EventBridgeで月次トリガーすれば、祝日カレンダーはほぼメンテナンスフリーかなと思います。

---

<a name="comparison"></a>

## 3. 比較分析：キュー vs. フロー内ブロック 🔍

| 観点     | キュー設定             | フロー内ブロック             |
| ------ | ----------------- | -------------------- |
| 難易度    | ★★☆☆☆（ポチポチ設定するだけ） | ★★★★☆（フロー設計が必要）      |
| 運用性    | ★★★★☆（即時反映で楽）     | ★★★☆☆（流れをデプロイする必要アリ） |
| 拡張性    | ★★☆☆☆（起動／停止のみ）    | ★★★★★（複雑な分岐OK） |
| 保守性    | ★★★☆☆（シンプルで見通し良し） | ★★☆☆☆（ブロック増えると管理大変）  |
| テスト容易性 | ★★★★☆（時間判定だけテスト可） | ★★★☆☆（フロー全体の結合テスト必須） |

それぞれメリット・デメリットがありますが、「なるべくラクしたい！」ならキュー設定、「柔軟性重視！」ならフロー内ブロックかなと思います。

---

<a name="testing"></a>

## 4. テスト・検証計画 ✅

1. **単体テスト**

   * 平日・祝日・時間外で分岐動作チェック
2. **結合テスト**

   * IVR → キュー → オペレーターまでシナリオ実行
3. **シナリオテスト**

   * 祝日API更新後の動作確認
4. **負荷テスト**

   * ピーク時間の同時着信数チェック

「テスト大事！ミスるとお客さんに怒られますよね？」ってことで、しっかりやりましょう。

---

<a name="operation"></a>

## 5. 注意点＆運用設計 ⚙️

* **二重判定に注意**：キューとフロー両方設定すると意図しない分岐に…
* **多言語対応**：最初に言語判定してからカレンダー判定すると分かりやすいです
* **モニタリング**：

  * CloudWatch メトリクス `QueueAbandonedCount` や `ContactFlowErrorCount` を監視
  * 営業開始後10分で通話数が極端に少ないときはアラートを飛ばすと安心

---

<a name="conclusion"></a>

## 6. まとめ＆拡張ポイント 🌱

* **キュー設定**

  * 簡単・即時反映だが拡張性は控えめ
* **フロー内ブロック**

  * 柔軟性バツグンも保守とテストがちょっと大変

### 今後の拡張アイデア

* **AIチャットボット**：Lex＋Pollyで時間外にも会話対応！
* **セルフサービスポータル**：API連携で折り返しリクエストやFAQ表示
* **BI連携**：QuickSightで時間帯別通話トラフィックを可視化

ぜひ自社要件に合わせてカスタマイズしてみてください！