AWS Aurora PostgreSQLのメジャーバージョンアップ


## はじめに
メタップスアドベントカレンダー第一日目の記事です。

Aurora PostgreSQL11系がそろそろEOLを迎えるため、14系へメジャーバージョンアップを実施
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.VersionPolicy.html?utm_source=pocket_mylist#Aurora.VersionPolicy.MajorVersionLifetime

## 目次
- 事前準備
- メンテナンス化
- バージョンアップ
- Anylyze実行
- メンテナンス解除

## 事前準備

#### パラメータグループ作成
- Postgre14系のパラメーターグループ作成(terraform実行)
```terraform:aws_rds_cluster_parameter_group.tf
# aws_rds_cluster_parameter_group.foo-aurora-postgresql14:
resource "aws_rds_cluster_parameter_group" "foo-aurora-postgresql14" {
    description = "foo-aurora-postgresql14"
    family      = "aurora-postgresql14"
    name        = "foo-aurora-postgresql14"
    tags        = {}
    parameter {
        apply_method = "immediate"
        name         = "log_min_duration_statement"
        value        = "-1"
    }
    parameter {
        apply_method = "immediate"
        name         = "log_statement"
        value        = "none"
    }
}
```


```terraform:aws_db_parameter_group.tf
# aws_db_parameter_group.foo-aurora-postgresql14:
resource "aws_db_parameter_group" "foo-aurora-postgresql14" {
    description = "foo-aurora-postgresql14"
    family      = "aurora-postgresql14"
    name        = "foo-aurora-postgresql14"
    tags        = {}
}
```

#### ダウンタイム確認用スクリプト作成
- どの程度DB接続がダウンするか確認するため、ダウンタイム確認用のスクリプト作成
```bash:psqlping.sh
#!/bin/bash

if [ -z "${1}" ]; then
    echo "Specify hostname."
    exit
fi

pg_isready -h $1 > /dev/null 2>&1
if [ "${?}" = "0" ]; then
    echo -n "[pg_isready] OK"
fi

psql -c "SELECT 1" -h $1 -U foo > /dev/null 2>&1
if [ "${?}" = "0" ]; then
    echo  " [psql query execute] OK"
fi
```
- スクリプトファイルへ実行権限付与
```shell-session:コマンド
chmod +x psqlping.sh
```
- 実行時にパスワード入力を省略するようにしておく
参考　https://qiita.com/kabi5n/items/48b7701724f189c48814

## メンテナンス化
- メンテ用の503リスナールールを上位に移動(CLI実行)
```shell-session:コマンド
ALB_LISTENER_RULE_ARN=arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxxxxxxxxxx
aws elbv2 set-rule-priorities --rule-priorities RuleArn=${ALB_LISTENER_RULE_ARN},Priority=1 --no-cli-pager
```

## バージョンアップ
#### スナップショット取得
```bash:コマンド
CLUSTER_NAME_LIST=$(cat << EOS
foo-aurora-postgresql-cluster
bar-aurora-postgresql-cluster
baz-aurora-postgresql-cluster
EOS
)

for CLUSTER_NAME in ${CLUSTER_NAME_LIST}
do
aws rds create-db-cluster-snapshot --db-cluster-identifier ${CLUSTER_NAME} --db-cluster-snapshot-identifier ${CLUSTER_NAME}-20231113 --no-cli-pager
done
```
#### ダウンタイム確認スクリプト実行
```shell-session:コマンド
while true; do echo -n "$(date) "; ./psqlping.sh foo.ap-northeast-1.rds.amazonaws.com; sleep 0.5; done
```
#### バージョンアップ
今回は14.9を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314945/2494e8f6-f814-6f97-030d-9f372a42b9fb.png)


事前作成したパラメータグループを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314945/f6264e7e-dba4-bf1c-c388-8d35c2de5de0.png)


#### ダウンタイム結果
約12分　環境にもよる想定
```shell-session:結果
2023年  9月 22日 金曜日 02:44:49 UTC [pg_isready] OK [psql query execute] OK
2023年  9月 22日 金曜日 02:44:50 UTC 2023年  9月 22日 金曜日 02:44:50 UTC 2023年  9月 22日 金曜日 02:44:51 UTC 2023年  9月 22日
2023年  9月 22日 金曜日 02:56:47 UTC [pg_isready] OK [psql query execute] OK
```

## Anylyze実行
#### DB接続
```psql:コマンド
psql -h foo.ap-northeast-1.rds.amazonaws.com -U foo
```
```psql:コマンド
\c foo_db
```
#### Analyze
```sql:コマンド、結果
select current_timestamp;ANALYZE VERBOSE;select current_timestamp;

       current_timestamp       
 2023-09-22 13:03:21.496542+09
(1 行)
 2023-09-22 13:13:12.62939+09
(1 行)
```
## メンテナンス解除
- メンテ用の503リスナールールを下位に移動(CLI実行)
```shell-session:コマンド
ALB_LISTENER_RULE_ARN=arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxxxxxxxxxx
aws elbv2 set-rule-priorities --rule-priorities RuleArn=${ALB_LISTENER_RULE_ARN},Priority=1000 --no-cli-pager
```