0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Part3】Azure OpenAI Serviceを使ってみた!セキュリティと運用のベストプラクティス

Last updated at Posted at 2025-10-31

前回は、Azure OpenAI Serviceの実践的な使い方とプロンプトのコツについて解説しました。
Part3では、セキュリティ設定、コンテンツフィルタリング、監視とトラブルシューティング、運用のベストプラクティスについて詳しく解説していきます。

シリーズ構成

  • Part1:基本知識と環境構築
  • Part2:実際の使い方とプロンプトのコツ
  • Part3:セキュリティと運用のベストプラクティス(本記事)

安全に使うために - コンテンツフィルタリング

Azure OpenAIには、有害なコンテンツを防ぐフィルター機能が標準装備されています。

デフォルトでフィルタリングされるもの

Azure OpenAIは、以下のカテゴリで自動的にコンテンツをフィルタリングします:

  • 暴力:暴力的な内容や描写
  • 自傷行為:自傷行為を促す内容
  • 性的:性的に露骨な内容
  • ヘイト:差別的・攻撃的な内容

フィルタリングのレベル

各カテゴリには、4段階の重大度があります:

  • 安全:問題なし
  • :軽微な問題
  • :中程度の問題
  • :深刻な問題

デフォルトでは、「中」以上がブロックされます。

カスタムフィルターを設定する

業務要件に応じて、フィルターをカスタマイズできます。

  1. Azure AI Foundryポータルで「コンテンツフィルター」を選択

  2. 「+ コンテンツフィルターの作成」をクリック

  3. 各カテゴリのしきい値を設定:

    • ブロックなし:フィルタリングしない
    • 低以上をブロック:低・中・高をブロック
    • 中以上をブロック:中・高をブロック(デフォルト)
    • 高のみブロック:高のみブロック
  4. フィルターに名前をつけて保存

  5. デプロイメントに適用

フィルターに引っかかるとこうなる

プロンプトまたはレスポンスがフィルターに引っかかると、こんなエラーが返ります:

{
  "error": {
    "code": "content_filter",
    "message": "コンテンツフィルターによってブロックされました",
    "innererror": {
      "code": "ResponsibleAIPolicyViolation",
      "content_filter_result": {
        "hate": {
          "filtered": true,
          "severity": "high"
        }
      }
    }
  }
}

フィルターのベストプラクティス

  1. 開発環境では緩めに:テスト時はフィルターを緩めて動作確認
  2. 本番環境では適切に:ビジネス要件に応じて適切なレベルに設定
  3. ログを確認:どのようなコンテンツがブロックされているか定期的に確認
  4. ユーザーへの説明:フィルターでブロックされた場合、ユーザーに適切にフィードバック

監視とトラブルシューティング

本番運用では、適切な監視とエラー対応が重要です。

Azure Monitorで監視する

  1. Azure Portalで対象のAzure OpenAIリソースを開く
  2. 「監視」→「メトリック」を選択
  3. 以下のメトリックを監視:

重要なメトリック

  • 総呼び出し数:どれくらい使われてる?
  • 生成トークン数:コスト管理の指標
  • 処理時間:パフォーマンスの監視
  • エラー率:問題の早期発見
  • トークンレート制限エラー:TPMの不足を検出

アラートを設定する

重要なメトリックにアラートを設定しましょう。

  1. メトリックビューで「新しいアラートルール」をクリック

  2. 条件を設定:

    • エラー率が5%を超えたら
    • 処理時間が10秒を超えたら
    • トークンレート制限エラーが発生したら
  3. アクションを設定:

    • メール通知
    • Teamsへの通知
    • Azure Functionsの実行

よくあるエラーと対処法

429 Too Many Requests

原因:レート制限(TPM)の超過

対処法

import time
from openai import RateLimitError

def call_openai_with_retry(client, max_retries=3):
    for i in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4o-deployment",
                messages=[...]
            )
            return response
        except RateLimitError as e:
            if i < max_retries - 1:
                wait_time = 2 ** i  # 指数バックオフ
                print(f"レート制限エラー。{wait_time}秒待機...")
                time.sleep(wait_time)
            else:
                raise

または、TPMを増やす:

  1. Azure AI Foundryで「デプロイ」を開く
  2. デプロイメントを選択して「編集」
  3. TPMを増やして保存

401 Unauthorized

原因:APIキーが間違っているか期限切れ

対処法

  1. Azure Portalで「キーとエンドポイント」を確認
  2. キーを再生成
  3. アプリケーションの環境変数を更新

404 Not Found

原因:デプロイメント名またはエンドポイントが間違っている

対処法

  • デプロイメント名を確認(モデル名ではなく、デプロイ時につけた名前)
  • エンドポイントURLを確認

Content Filter Error

原因:コンテンツフィルターに引っかかった

対処法

  1. プロンプトを見直して、問題のある表現を修正
  2. 必要に応じてカスタムフィルターで調整
  3. ユーザーに適切なフィードバックを返す
from openai import APIError

try:
    response = client.chat.completions.create(...)
except APIError as e:
    if "content_filter" in str(e):
        print("申し訳ございません。入力内容が当社のポリシーに反するため、処理できませんでした。")
    else:
        raise

ログの有効化

詳細なログを取得して、問題の原因を特定しやすくします。

  1. Azure Portalでリソースを開く
  2. 「診断設定」→「+ 診断設定を追加する」
  3. ログカテゴリを選択:
    • RequestResponse:リクエストとレスポンスの詳細
    • Audit:誰がいつアクセスしたか
  4. 送信先を選択:
    • Log Analytics:クエリで分析
    • ストレージアカウント:長期保存
    • Event Hub:リアルタイム処理

Log Analyticsでクエリを実行

// 過去24時間のエラーを確認
AzureDiagnostics
| where TimeGenerated > ago(24h)
| where ResultType == "Failed"
| project TimeGenerated, OperationName, ResultSignature, properties_s
| order by TimeGenerated desc

// レート制限エラーの発生頻度
AzureDiagnostics
| where TimeGenerated > ago(7d)
| where ResultType == "Failed"
| where ResultSignature contains "429"
| summarize count() by bin(TimeGenerated, 1h)
| render timechart

セキュリティのベストプラクティス

ネットワークセキュリティ

プライベートエンドポイントを使う

パブリックインターネットを経由せずにアクセスできます。

  1. Azure OpenAIリソースで「ネットワーク」を選択
  2. 「ファイアウォールと仮想ネットワーク」で「選択されたネットワークとプライベートエンドポイント」を選択
  3. 「+ プライベートエンドポイント」をクリック
  4. 以下を設定:
    • サブスクリプション
    • リソースグループ
    • 名前
    • リージョン
  5. VNetとサブネットを選択
  6. プライベートDNSゾーンの統合を有効化
  7. 作成

これで、VNet内からのみアクセス可能になります。

IP制限を設定する

特定のIPアドレスからのみアクセスを許可できます。

  1. 「ネットワーク」→「ファイアウォールと仮想ネットワーク」
  2. 「選択されたネットワーク」を選択
  3. 「+ クライアントIPアドレスを追加」または手動でIP範囲を追加
  4. 保存

アクセス制御(RBAC)

適切なロールを割り当てて、最小権限の原則に従います。

主なロール

  • Cognitive Services OpenAI Contributor:フルアクセス(開発者向け)
  • Cognitive Services OpenAI User:読み取りとAPI呼び出し(アプリケーション向け)
  • Cognitive Services User:API呼び出しのみ(最小権限)

ロールの割り当て方

  1. Azure Portalでリソースを開く
  2. 「アクセス制御(IAM)」を選択
  3. 「+ 追加」→「ロールの割り当ての追加」
  4. ロールを選択
  5. メンバーを選択(ユーザー、グループ、サービスプリンシパル)
  6. 確認して割り当て

Managed Identityを使う

APIキーの代わりにManaged Identityを使うと、キー管理が不要になります。

システム割り当てマネージドIDの有効化

  1. アプリケーション(App Service、Azure Functions等)で「ID」を選択
  2. 「システム割り当て」タブで「オン」に設定
  3. 保存

Azure OpenAIへのアクセス許可

  1. Azure OpenAIリソースで「アクセス制御(IAM)」を開く
  2. ロールの割り当てで、アプリケーションのマネージドIDに「Cognitive Services OpenAI User」を割り当て

コードでの使用

from azure.identity import DefaultAzureCredential
from openai import AzureOpenAI

# Managed Identityで認証
credential = DefaultAzureCredential()
token = credential.get_token("https://cognitiveservices.azure.com/.default")

client = AzureOpenAI(
    azure_ad_token=token.token,
    api_version="2024-08-01-preview",
    azure_endpoint="https://your-resource-name.openai.azure.com/"
)

# 通常通り使用
response = client.chat.completions.create(...)

データ保護

データの地理的配置

  • 日本リージョンを選択:データを日本国内に保持
  • データ主権:各国の法規制に準拠

データの利用ポリシー

重要:Azure OpenAIに送信されたデータは、Microsoftのモデル学習には使用されません。
これは、通常のOpenAI APIとの大きな違いです。

カスタマーマネージドキー(CMK)

より高度な暗号化制御が必要な場合は、CMKを使用できます。

  1. Azure Key Vaultを作成
  2. 暗号化キーを作成
  3. Azure OpenAIリソースで「暗号化」を選択
  4. 「カスタマーマネージドキー」を有効化
  5. Key Vaultとキーを選択

APIキーのローテーション

セキュリティのため、定期的にAPIキーをローテーションします。

ダウンタイムなしでローテーションする方法

Azure OpenAIには2つのキー(Key1とKey2)があります。

  1. 現在Key1を使用中
  2. Key2を再生成
  3. アプリケーションをKey2に切り替え
  4. すべてのアプリケーションが切り替わったことを確認
  5. Key1を再生成

これで、ダウンタイムなしでキーをローテーションできます。

本番運用のベストプラクティス

環境分離

開発・ステージング・本番環境を分離しましょう。

開発環境(Dev)
├─ リソースグループ: rg-openai-dev
└─ Azure OpenAI: openai-dev

ステージング環境(Staging)
├─ リソースグループ: rg-openai-staging
└─ Azure OpenAI: openai-staging

本番環境(Prod)
├─ リソースグループ: rg-openai-prod
└─ Azure OpenAI: openai-prod

コスト管理

予算アラートを設定

  1. Azure Portalで「コスト管理 + 課金」を開く
  2. 「予算」→「+ 追加」
  3. スコープを選択(サブスクリプション、リソースグループ)
  4. 予算額を設定
  5. アラート条件を設定(例:予算の80%に達したら)
  6. 通知先メールアドレスを設定

タグでコスト追跡

リソースにタグをつけて、コストを追跡しやすくします。

Environment: Production
Project: ChatBot
CostCenter: Engineering

デプロイメント戦略

ブルー・グリーンデプロイメント

新しいモデルバージョンをテストしてから切り替えます。

  1. 新しいデプロイメント(Green)を作成
  2. 少量のトラフィックをGreenに流してテスト
  3. 問題なければ、すべてのトラフィックをGreenに切り替え
  4. 古いデプロイメント(Blue)を削除

カナリアリリース

段階的にトラフィックを新しいバージョンに移行します。

import random

def get_deployment_name():
    # 10%のトラフィックを新しいデプロイメントに
    if random.random() < 0.1:
        return "gpt-4o-deployment-v2"
    else:
        return "gpt-4o-deployment-v1"

deployment = get_deployment_name()
response = client.chat.completions.create(
    model=deployment,
    messages=[...]
)

障害対策

フォールバック戦略

プライマリのデプロイメントが失敗したら、セカンダリにフォールバックします。

def call_openai_with_fallback(client, primary_deployment, fallback_deployment):
    try:
        return client.chat.completions.create(
            model=primary_deployment,
            messages=[...]
        )
    except Exception as e:
        print(f"プライマリ失敗: {e}. フォールバックを試行...")
        return client.chat.completions.create(
            model=fallback_deployment,
            messages=[...]
        )

マルチリージョン構成

高可用性が必要な場合は、複数のリージョンにデプロイします。

プライマリ: 東日本リージョン
セカンダリ: 米国東部リージョン

Azure Traffic ManagerやAzure Front Doorで負荷分散・フェイルオーバーを実現できます。

まとめ(Part3)

Part3では、Azure OpenAI Serviceのセキュリティと運用について解説しました。

押さえておきたいポイント

  1. コンテンツフィルタリング

    • デフォルトで有効
    • カスタマイズ可能
    • ログで確認
  2. 監視とトラブルシューティング

    • Azure Monitorで監視
    • アラート設定は必須
    • よくあるエラーの対処法を把握
  3. セキュリティ

    • プライベートエンドポイントの活用
    • Managed Identityでキー管理不要
    • APIキーのローテーション
  4. 本番運用

    • 環境分離
    • コスト管理
    • 障害対策

シリーズ全体のまとめ

全3回を通して、Azure OpenAI Serviceの基本から実践、そして運用まで解説しました。

Part1基本知識と環境構築
Part2実際の使い方とプロンプトのコツ
Part3:セキュリティと運用のベストプラクティス

実際に触ってみて、Azure OpenAI Serviceは企業での利用に適した、安全で強力なサービスだと感じました。
特に、セキュリティ面での配慮とAzure環境との統合のしやすさが魅力です。

この記事シリーズが、これからAzure OpenAI Serviceを使ってみようと思っている方の参考になれば嬉しいです!

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?