AWS RDSの（クラスタ）パラメータグループの差分移行

# 最初に謝辞

この記事の内容は[サーバーワークスさんの記事](https://blog.serverworks.co.jp/aws-cli/parameter-group-migration)と同等です。
アレンジした部分はありますが、やってることの本質はまるで変わってないです。
動作原理とかの細かい説明はそちらをご覧ください。

> どなたかのお役に立てれば幸いです。

お役に立ちまくりましたありがとうございます。

# デフォルトDBパラメータグループ
元記事では仮のDBグループを作ってから表示させていましたが、DBエンジン名の前に `default.` を付ければ使用したことがなくても表示させることができます。

DBエンジン名の一覧を出してー

```bash
aws rds describe-db-engine-versions \
--query "DBEngineVersions[].DBParameterGroupFamily" \
--output text | uniq
```

DBエンジン名の前に `default.` を付けて中身の表示

```bash
aws rds describe-db-parameters \
--db-parameter-group-name default.aurora-mysql5.7 \
--query "Parameters[].[ParameterName,ParameterValue]" \
--output text
```

# デフォルトDBクラスタパラメータグループ

クラスタを作成できるDBエンジンであれば同等の処理で表示させることができます。
`describe-db-parameters` を `describe-db-cluster-parameters` に、`--db-parameter-group-name` を `--db-cluster-parameter-group-name` に変えるだけですね。

```bash
aws rds describe-db-cluster-parameters \
--db-cluster-parameter-group-name default.aurora-mysql5.7 \
--query "Parameters[].[ParameterName,ParameterValue]" \
--output text
```

# 差分の確認

元記事では一旦ファイルを作成して `sdiff` をしていましたが、`bash` ならこんな感じ
```bash
sdiff -s <(これ) <(それ)
```
でコマンドを渡せますので、そのままAWS CLIのコマンドを引き渡せます。

```bash
sdiff -s <(aws rds describe-db-parameters --db-parameter-group-name default.aurora-mysql5.7 --query "Parameters[].[ParameterName,ParameterValue]" --output text) <(aws rds describe-db-parameters --db-parameter-group-name my-custom-db-parameter --query "Parameters[].[ParameterName,ParameterValue]" --output text)
```

```bash
sdiff -s <(aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name default.aurora-mysql5.7 --query "Parameters[].[ParameterName,ParameterValue]" --output text) <(aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name my-custom-db-cluster-parameter --query "Parameters[].[ParameterName,ParameterValue]" --output text)
```

# 差分の反映

上記の差分確認を利用できます。

```bash
sdiff -s <(aws rds describe-db-parameters --db-parameter-group-name default.aurora-mysql5.7 --query "Parameters[].[ParameterName,ParameterValue]" --output text) <(aws rds describe-db-parameters --db-parameter-group-name my-custom-db-parameter --query "Parameters[].[ParameterName,ParameterValue]" --output text) | while read line
do
   pname=$(echo $line | awk '{print $1}')
   pvalue=$(echo $line | awk '{print $5}')
   aws rds modify-db-parameter-group \
   --db-parameter-group-name my-custom-new-db-parameter \
   --parameters ParameterName=$pname,ParameterValue=$pvalue,ApplyMethod=immediate
done
```

```bash
sdiff -s <(aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name default.aurora-mysql5.7 --query "Parameters[].[ParameterName,ParameterValue]" --output text) <(aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name my-custom-db-cluster-parameter --query "Parameters[].[ParameterName,ParameterValue]" --output text) | while read line
do
   pname=$(echo $line | awk '{print $1}')
   pvalue=$(echo $line | awk '{print $5}')
   aws rds modify-db-cluster-parameter-group \
   --db-cluster-parameter-group-name my-custom-new-db-cluster-parameter \
   --parameters ParameterName=$pname,ParameterValue=$pvalue,ApplyMethod=immediate
done
```

# 設定確認
入れ子が深いし長いしでアレなので元のままの方が良い気もしますが、テンポラリファイルを作るのが嫌いな人、他にもいますでしょ？
`sdiff` の時と同様に
```bash
diff <(これ) <(それ)
```
できるので、そこに新旧の `sdiff` を突っ込む感じでイケます。

```bash
diff <(sdiff -s <(aws rds describe-db-parameters --db-parameter-group-name default.aurora-mysql5.7 --query "Parameters[].[ParameterName,ParameterValue]" --output text) <(aws rds describe-db-parameters --db-parameter-group-name my-custom-db-parameter --query "Parameters[].[ParameterName,ParameterValue]" --output text)) <(sdiff -s <(aws rds describe-db-parameters --db-parameter-group-name default.aurora-mysql8.0 --query "Parameters[].[ParameterName,ParameterValue]" --output text) <(aws rds describe-db-parameters --db-parameter-group-name my-custom-new-db-parameter --query "Parameters[].[ParameterName,ParameterValue]" --output text))
```

```bash
diff <(sdiff -s <(aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name default.aurora-mysql5.7 --query "Parameters[].[ParameterName,ParameterValue]" --output text) <(aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name my-custom-db-cluster-parameter --query "Parameters[].[ParameterName,ParameterValue]" --output text)) <(sdiff -s <(aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name default.aurora-mysql8.0 --query "Parameters[].[ParameterName,ParameterValue]" --output text) <(aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name my-custom-new-db-cluster-parameter --query "Parameters[].[ParameterName,ParameterValue]" --output text))
```