Windows PowerShell と AWS CLI で、すべてのパラメータグループから、指定パラメータの値をすべて取得するメモ

# はじめに
* すべてのRDSパラメータグループ対象に、特定のパラメータだけをすべて精査したい
    * 例えばSSL通信を強制しているものがないか等
* Windows PowerShell と AWS CLI で抽出してみます
* 愚痴
    * 過去にいた企業内で Mac なんてオサレなマシン提供された未来が見えない
    * jq？勝手に入れられるわけないでしょ？
    * 客も Windows 多いんだし、Word とか画面壊れるの嫌だし、Windows マンセー
    * Linux環境作ればいい?
        * それが出来れば、苦労はしねェ
# 処理の流れ
```
1. スタート
2. AWSプロファイルと出力ファイルを読み込む
3. 現在の年月日と時刻を取得
4. 出力ファイル名に年月日と時刻を追加
5. 出力ファイルが既に存在するか確認
   - 5.1. Yes: ユーザーにファイルを削除するか尋ねる
     - 5.1.1. Yes: ファイルを削除
     - 5.1.2. No: スクリプトを終了
   - 5.2. No: 次のステップへ
6. 特定のパラメータKey（$targetKeys）を指定
7. CSVヘッダを出力
8. DBパラメータグループとクラスタパラメータグループを対象にループ
   - 8.1. パラメータグループを取得
   - 8.2. 各パラメータグループに対してループ
     - 8.2.1. パラメータグループのパラメータを取得
     - 8.2.2. 各パラメータに対してループ
       - 8.2.2.1. パラメータKeyが$targetKeysに含まれている場合、パラメータグループタイプ、パラメータグループ名、パラメータKey、パラメータValueをCSVに出力
9. スクリプトを終了
```
# スクリプト
```
# AWSプロファイルと出力ファイルを読み込む
$profile = "AWS_PROFILE名を指定"
$outputFileBase = "出力ファイル名を指定"

# 現在の年月日と時刻をyyyymmddhhmm形式で取得
$date = Get-Date -Format "yyyyMMddHHmm"

# 出力ファイルに年月日と時刻を追加
$outputFile = "$outputFileBase-$date.csv"

# ファイルが既に存在する場合は削除の確認を行う
if (Test-Path $outputFile) {
    $delete = Read-Host "$outputFile already exists. Do you want to delete it? (y/n)"
    if ($delete -eq 'y') {
        Remove-Item $outputFile
    } else {
        Write-Output "Script terminated to avoid overwrite."
        return
    }
}

# 特定のパラメータKeyを複数指定
$targetKeys = 'myParameterKey1', 'myParameterKey2'

# CSVヘッダを出力
Add-Content -Path $outputFile -Value "ParameterGroupType,ParameterGroupName,ParameterKey,ParameterValue"

# DBパラメータグループとクラスタパラメータグループを対象にループ
$groupTypes = @("DB", "Cluster")
$groupTypesCount = $groupTypes.Count
$groupTypeIndex = 1
foreach ($groupType in $groupTypes) {
    Write-Output "$(Get-Date -Format "yyyy/MM/dd HH:mm:ss") Processing group type $groupTypeIndex of $groupTypesCount"
    $parameterGroups = if ($groupType -eq "DB") { 
        aws rds describe-db-parameter-groups --profile $profile | ConvertFrom-Json | Select-Object -Expand DBParameterGroups
    } else { 
        aws rds describe-db-cluster-parameter-groups --profile $profile | ConvertFrom-Json | Select-Object -Expand DBClusterParameterGroups
    }

    $parameterGroupsCount = $parameterGroups.Count
    $parameterGroupIndex = 1
    foreach ($group in $parameterGroups) {
        Write-Output "$(Get-Date -Format "yyyy/MM/dd HH:mm:ss") Processing parameter group $parameterGroupIndex of $parameterGroupsCount"
        $groupName = if ($groupType -eq "DB") { $group.DBParameterGroupName } else { $group.DBClusterParameterGroupName }
        $parameters = if ($groupType -eq "DB") { 
            aws rds describe-db-parameters --db-parameter-group-name $groupName --profile $profile | ConvertFrom-Json | Select-Object -Expand Parameters
        } else { 
            aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name $groupName --profile $profile | ConvertFrom-Json | Select-Object -Expand Parameters
        }

        $parametersCount = $parameters.Count
        $parameterIndex = 1
        foreach ($parameter in $parameters) {
            Write-Output "$(Get-Date -Format "yyyy/MM/dd HH:mm:ss") Processing parameter $parameterIndex of $parametersCount"
            if ($targetKeys -contains $parameter.ParameterName) {
               # JSONからParameterNameとParameterValueを取得し、CSVに出力
               $parameterKey = $parameter.ParameterName
               $parameterValue = $parameter.ParameterValue
               Add-Content -Path $outputFile -Value "$groupType,`"$groupName`",`"$parameterKey`",`"$parameterValue`""
            }
            $parameterIndex++
        }
        $parameterGroupIndex++
    }
    $groupTypeIndex++
}
```
# API 呼び出し回数
1. DBパラメータグループとクラスタパラメータグループを取得するための2回のAPI呼び出し（`aws rds describe-db-parameter-groups`と`aws rds describe-db-cluster-parameter-groups`）。
2. それぞれのパラメータグループに対して一つのAPI呼び出し（`aws rds describe-db-parameters`または`aws rds describe-db-cluster-parameters`）。パラメータグループの数は動的であり、その数がAPI呼び出しの回数を決定する。