Azure OpenAI ContentLogging の設定を抽出する

# 背景

Azure OpenAI 関連の申請で、不正使用監視の停止申請がある

これをすることで、監視を止めることが出来る。

[Azure OpenAI Limited Access Review:
Modified Abuse Monitoring ](https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR7en2Ais5pxKtso_Pz4b1_xUOE9MUTFMUlpBNk5IQlZWWkcyUEpWWEhGOCQlQCN0PWcu)

で、会社において、使ってる人に設定のスクリーンショットだせって話がきた。

面倒なので、script を用意したってだけ

## OpenAI 関連の申請は以下に詳しい

https://jpaiblog.github.io/blog/2023/04/21/RequestAccess-to-AzureOpenAIService/


# 出力イメージ

| サブスクリプション名 | サブスクリプションID | リソースグループ名 | リソース名 | 状況 ([不正使用監視詳細](https://jpaiblog.github.io/blog/2023/04/21/RequestAccess-to-AzureOpenAIService/)) | ContentLogging |
| --- | --- | --- | --- | --- | --- |
| Visual Studio Professional サブスクリプション | {subscription ID} | {resource group name} | {resource name} | 不正使用監視 by MS |  |

# Power Shell スクリプト

前提
- az cli が動く
- az account list が対象
    - az logout/login などでキャッシュ更新しておいたほうがよい
    - 権限がある場合のみ
- 結果は、$output_file に指定した、<code>results_ContentLogging.md</code> へ

```powershell: ContentLogging チェック用
# 出力ファイル
$output_file = "results_ContentLogging.md"

# 出力ファイルの存在をチェックし、存在しない場合は新規作成
if (-Not (Test-Path -Path $output_file)) {
    # ファイルが存在しない場合、新しく作成
    New-Item -Path $output_file -ItemType File
} else {
    # ファイルが存在する場合、内容をクリア
    Set-Content -Path $output_file -Value $null
}
# 現在のサブスクリプションIDを取得して保存
$initialSubscriptionId = az account show --query "id" -o tsv

# ヘッダー行を追加
Add-Content -Path $output_file -Value "| サブスクリプション名 | サブスクリプションID | リソースグループ名 | リソース名 | 状況 ([不正使用監視詳細](https://jpaiblog.github.io/blog/2023/04/21/RequestAccess-to-AzureOpenAIService/)) | ContentLogging |"
Add-Content -Path $output_file -Value "| --- | --- | --- | --- | --- | --- |"

# 全サブスクリプションを取得し、名前とIDのペアリストを取得
$subscriptions = az account list --query "[].{Name:name, Id:id}" -o tsv

foreach ($subscription in $subscriptions) {
    $subscriptionDetails = $subscription -split "`t"
    $subscriptionName = $subscriptionDetails[0]
    $subscriptionId = $subscriptionDetails[1]

    try {
        # サブスクリプションを設定
        $null = az account set --subscription $subscriptionId 2>&1

        if ($LASTEXITCODE -ne 0) {
            $errorMsg = "サブスクリプションの設定中にエラーが発生しました (エラーコード: $LASTEXITCODE)"
            Write-Host $errorMsg
            Add-Content -Path $output_file -Value "| $subscriptionName | $subscriptionId | - | - | アクセス権が不足しています | N/A |"
            continue
        }

        Write-Host "サブスクリプションを確認中: $subscriptionName ($subscriptionId)"

        # OpenAIサービスリソースのリストを取得 (kindが"OpenAI"のリソースのみ)
        $resources = az cognitiveservices account list --query "[?kind=='OpenAI'].{Name:name, ResourceGroup:resourceGroup}" -o tsv 2>&1

        if ($LASTEXITCODE -ne 0) {
            $errorMsg = "OpenAIリソースの取得中にエラーが発生しました (エラーコード: $LASTEXITCODE)"
            Write-Host $errorMsg
            Add-Content -Path $output_file -Value "| $subscriptionName | $subscriptionId | - | - | アクセス権が不足しています | N/A |"
            continue
        }

        if (-not $resources) {
            Write-Host "対象のサブスクリプションには OpenAI リソースがありません: $subscriptionId"
            Add-Content -Path $output_file -Value "| $subscriptionName | $subscriptionId | - | - | OpenAI リソースがありません | N/A |"
        } else {
            # 各リソースについて確認
            foreach ($resource in $resources) {
                $resourceDetails = $resource -split "`t"
                $resourceName = $resourceDetails[0]
                $resourceGroup = $resourceDetails[1]

                Write-Host "リソースを確認中: $resourceName (リソースグループ: $resourceGroup)"

                # ContentLoggingの確認
                $loggingStatus = az cognitiveservices account show --resource-group $resourceGroup --name $resourceName --query "properties.capabilities[?name=='ContentLogging'].value" -o tsv 2>&1

                if ($LASTEXITCODE -ne 0) {
                    Write-Host "ContentLoggingの確認中にエラーが発生しました。リソース: $resourceName (リソースグループ: $resourceGroup)"
                    Add-Content -Path $output_file -Value "| $subscriptionName | $subscriptionId | $resourceGroup | $resourceName | ContentLogging エラー (コード: $LASTEXITCODE) | N/A |"
                    continue
                }

                if ($loggingStatus -eq "") {
                    $loggingStatus = "未設定"
                }

                $status = if ($loggingStatus -eq "false") { "不正使用監視 無効化" } else { "不正使用監視 by MS" }
                Add-Content -Path $output_file -Value "| $subscriptionName | $subscriptionId | $resourceGroup | $resourceName | $status | $loggingStatus |"
            }
        }
    } catch {
        $errorMsg = "例外が発生しました。サブスクリプション $subscriptionId でのエラー: $_"
        Write-Host $errorMsg
        Add-Content -Path $output_file -Value "| $subscriptionName | $subscriptionId | - | - | エラー: $_ | N/A |"
    }
}

# サブスクリプションを初期状態に戻す
$null = az account set --subscription $initialSubscriptionId

Write-Host "ContentLogging が有効または未設定のサブスクリプションとそのリソースは $output_file に保存されました。"

```

# あとがき

そういえば、provisoned になってないか？も見れるようにしたいなぁ