Aurora Data APIが使いたくてPostgres 13以下からメジャーアップグレードする人は気を付けろ

# TL;DR

- Aurora Data APIがServerless V1以外でも使えるようになったので試したい
- Postgres 14.8 以降である必要があるのでアップグレードしたが、なぜか接続できない
- [ユーザーパスワードが `scram-sha-256`じゃないとだめ](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html#data-api.limitations:~:text=For%20Aurora%20PostgreSQL%20version%2014%20and%20higher%20databases%2C%20Data%20API%20only%20supports%20scram%2Dsha%2D256%20for%20password%20encryption.)なのが原因。
  - [Postgres 13まではデフォルトが`md5`](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Appendix.PostgreSQL.CommonDBATasks.Roles.html#PostgreSQL_Password_Encryption_configuration:~:text=Aurora%20PostgreSQL%2013%20%E2%80%94-,%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AF%20md5,-Aurora%20PostgreSQL%20DB)なのでアップグレードしたDBではまりやすい



## Aurora Data API

* HTTP経由でDBにクエリ実行が可能
  * LambdaでのDBアクセスに使用することで最大接続数の問題の回避
    * 今までだとRDS Proxyを使ったソリューションだったが、Data APIでも可能に
  * AWS AppSync
    * よりお手軽にGraphQL とDBへの接続が可能に
* 今まではServerless V1でのみ実行可能だった

https://aws.amazon.com/jp/about-aws/whats-new/2023/12/amazon-aurora-postgresql-rds-data-api/


https://dev.classmethod.jp/articles/rds-data-api-now-supported-in-serverless-v2-and-provisioned-amazon-aurora-postgresql/

https://aws.amazon.com/jp/blogs/database/introducing-the-data-api-for-amazon-aurora-serverless-v2-and-amazon-aurora-provisioned-clusters/

運用の中でAuroraに対してクエリ実行したい場合があるが、そのためにわざわざ接続するサーバーとドライバーを用意しないといけないのが運用上のオーバヘッドを生んでいるので、Data APIはぜひ活用したい機能でした。

## 困ったこと

現在使用しているAuroraクラスターはもともとはPostgres 13で、Postgresql14.6に上げました。

Data APIは14.8からなので、14.9へマイナーバージョンアップをして早速使ってみたところ、以下のようなエラーが。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372042/44d49bbd-96b5-8e65-bc7d-8a1c70d4370c.png)


```
19:46:11	select * from information_schema.tables	error	ERROR: password authentication failed for user "postgres"; SQLState: 28P01	288 ミリ秒
```

しかし、Secret Managerのリソースは正しく作られており、その認証情報でほかのDBツールからは接続できる状態でした。

DBのアップグレード時になにかあったのかもと思い、再度スナップショットからやり直したりしましたが、変わらず。。

## サポートに聞いてみた

サポートに聞いたところ、ユーザーのパスワードの暗号化に問題があることがわかりました

rds_tools拡張機能をインストールし、以下のクエリを打つことでパスワードの暗号化方式を確認可能です

```
CREATE EXTENSION rds_tools;

SELECT * FROM 
      rds_tools.role_password_encryption_type();
```

実際に、以下の手順に書かれている形で、scram-sha-256へ変更したところ、正常にクエリが実行できることを確認しました

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Appendix.PostgreSQL.CommonDBATasks.Roles.html#PostgreSQL_Password_Encryption_configuration.preliminary 


このことは、ドキュメントにも書かれていました。

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html#data-api.limitations 
```
For Aurora PostgreSQL version 14 and higher databases, Data API only supports scram-sha-256 for password encryption.
```

### なぜmd5だったのか？

Postgres 13までは、パラメータグループでの `password_encryption`のデフォルト値 `md5`になっており、そのまま普通にユーザー作成をするとmd5で作成されてしまいます。

PostgreSQL 14 ではデフォルトがscram-sha-256に変わっており、PostgreSQL 14以降で作成したユーザーではこの問題は起こりません。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Appendix.PostgreSQL.CommonDBATasks.Roles.html#PostgreSQL_Password_Encryption_configuration.preliminary:~:text=Aurora%20PostgreSQL%2013%20%E2%80%94%20%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AF%20md5




## まとめ

* Aurora Data APIは暗号化形式が `scram-sha-256`のユーザーじゃないと認証が通らない
* Postgresql13まではデフォルトがmd5なので、アップグレードしたDBではまりやすい

結果的にユーザーのセキュリティ向上にもなったので、良い経験でした

一方でコンソール上の表示だけでは、原因はわからなかったのでそこがわかる形になると有り難いなと思います。

## 余談

RDSコンソールからクエリエディタを起動すると、DB接続のためのSecret作成から実施できるのですが、この作成時にもエラーが出ました。。

```
Minified Redux error #7; visit https://redux.js.org/Errors?code=7  for the full message or use the non-minified dev environment for full errors. 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372042/bf8a9741-6735-102f-e6f1-cb932600fccc.png)

こちらは、Secret自体の作成は成功するため、クエリ実行への影響はありません

これに関してもサポートに問い合わせを行い、以下のような回答をもらっています。そのうち修正されると思いますが、取り急ぎここで、記録しておきます

```
当方の環境でも"新しいデータベース認証情報を追加します"にて以下のエラーが表示されることを確認いたしました。
こちら AWS 起因の問題であると認識しており、担当部署にフィードバックいたしました。ご不便をおかけして申し訳ございません。
なお、修正される時期などの将来の予定につきましてはご案内ができかねます点、何卒ご容赦いただきたく存じます。
また、シークレットは正常に登録されており、クエリエディタのご利用にも影響ないものと認識しておりますため、下記エラーはご放念いただきご利用いただけますと幸いでございます。
```