Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS JDBC Driverに入れ替えたら Spring Bootが起動しなくなった話

Yuki
March 20, 2024
300

AWS JDBC Driverに入れ替えたら Spring Bootが起動しなくなった話

Yuki

March 20, 2024
Tweet

Transcript

  1. 普段はITアーキテクトとしてチームリード、設計、実装を行っております。 • 名前: 松本 祐樹 • ロール: ITアーキテクト(主にAWS) • AWS歴:

    6年 • クラウド系認定資格:  AWS: 12認定  Google Cloud: 11認定  Azure: Solutions Architect Expert, Administrator Associate • IPA系:  DB, AP, FE • Japan AWS All Certifications Engineer • IPA 情報処理技術者試験委員  自己紹介
  2. 具体的には、高速フェイルオーバー、AuroraのIAM認証、Secrets Manager統合など の機能をプラグインとして提供しております。  AWS JDBC Driverの機能 • AWS Secrets

    Manager Plugin • Host Monitoring Plugin • IAM Authentication Plugin • Failover Plugin • Aurora Connection Tracker Plugin • Driver Metadata Connection Plugin • Read Write Splitting Plugin • Federated Authentication Plugin aws-advanced-jdbc-wrapper/docs/Documentation.md 今回は、この2つのプラグインのお話
  3. AWS Secrets Manager PluginはSecrets Managerに登録されているDBのユーザー 名とパスワードを使用してAuroraにアクセスように、簡単に設定できます。  AWS Secrets Manager

    Pluginの仕組み aws-advanced-jdbc- wrapper/examples/AWSDriverExample/src/main/java/software/amazon /AwsSecretsManagerConnectionPluginPostgresqlExample.java • アプリケーションに設定するだけで、Secrets Managerからアクセス情報を取ってアクセス できる(Secrets ManagerへのIAMのアクセス 許可は必要) AWS Secrets Manager (DBのユーザー名とパスワード保管) Amazon Aurora Amazon EC2 ①ユーザー名とパスワードを取得 ②接続 接続文字列でAWS JDBC Driverを指定 プロパティでリージョンとSecrets ManagerのSecret IDを指定 (Springならapplication.propertiesでの指定も可) ExampleではJavaのコードでプラグインを指定しているが 接続文字列で指定することもできる
  4. Failover Pluginはコネクションを論理コネクションと物理コネクションに分けて、DBイン スタンス障害時には、フェイルオーバープロセスを実行し、障害の影響を軽減します。  Failover Pluginの仕組み • アプリケーションは論理コネクションに接 続する •

    DBインスタンスへの接続は、物理コネク ションが担当する • 物理コネクションから通信の例外が発生 すると、フェイルオーバープロセスが実 行される。そこでは、ライターインスタン スの検出、DBの再接続などが行われる • 通常、アプリケーションエンジニアは論 理コネクションと物理コネクションを分け て意識することはない aws-advanced-jdbc-wrapper/docs/using-the-jdbc-driver/using-plugins/UsingTheFailoverPlugin.md
  5. Aurora Global DBのフェイルオーバー、RDS Blue/Green Deploymentはサポート外 です。またRDS Proxyとの同時使用は非推奨です。  使用上の注意点 •

    GitHubのTopページに注意点が 大きく書かれています • ただし、プラグインごとの注意点 もあるので、プラグインの説明も 読んでおくこと Read Write Splitting Pluginは、 Springの@Transactional(readOnly = True)と相性が悪く、パフォーマンス の劣化が起きる可能性がある GitHub - awslabs/aws-advanced-jdbc-wrapper
  6. フェイルオーバーの時間を短縮させるため、5年ほど運用されている、Spring Bootで作 成されたアプリケーションにAWS JDBC Driverを導入しようとしました。  AWSアーキテクチャ図 AWS Secrets Manager

    (DBのユーザー名とパスワード保管) Amazon Aurora (PostgreSQL) Amazon EC2 (Spring Boot) ①ユーザー名とパスワードを取得 ②接続 Application Load Balancer • 単純なSpring BootのWebアプ リケーション • この図を見て、AWS Secrets Manager JDBC Libraryを使って いると思い込む 結構簡単に 移行できるかも!
  7. AWS JDBC Driverに入れ替えたら、Spring Bootの起動に失敗するようになってし まった。  AWSアーキテクチャ図 AWS Secrets Manager

    (DBのユーザー名とパスワード保管) Amazon Aurora (PostgreSQL) Amazon EC2 (Spring Boot) ①ユーザー名とパスワードを取得 ②接続 Application Load Balancer • Data Sourceの作成に失敗して いるぽいことは分かった • 最初はライブラリの依存関係 を疑っていた PoCでは 動いていたのに 何で!?
  8. AWS Secrets Managerに登録されていたDBのユーザー名とパスワードは、AWS JDBC Driverが読み込むことができる形式でなかった。  エラー原因 その1 • AWS

    Secrets Manager Pluginが想定す るシークレットの形式ではなかった • AWS Secrets Manager JDBC Libraryを 使っていなかった • Spring Bootの@Configurationのクラス で、Data Sourceをゴリゴリ作っていた • AWS Secrets Manager JDBC Libraryで も同様の形式を利用しているので Secrets Managerは問題がないと誤認 • 新しいシークレットを作成し、AWS Secrets Manager Pluginが読み込める ようにした AWS Secrets Manager 実際に保管されていたシークレットの形式 • user_name: AAAAAAA • password: XXXXXXX aws-advanced-jdbc-wrapper/docs/using-the-jdbc-driver/using- plugins/UsingTheAwsSecretsManagerPlugin.md
  9. Failover Pluginは、aurora_db_instance_identifierというAurora独自関数を利用 している。この関数をサポートしていないバージョンのAuroraを利用していた。  エラー原因 その2 • aurora_db_instance_identifier関 数をサポートしていないバージョ ンのAuroraを使用していたことが

    原因だった • フェイルオーバープロセスでは、 aurora_db_instance_identifier関 数やaurora_replica_status関数を 利用して、DNSを利用せずフェイ ルオーバー先のDBインスタンス を発見している • Auroraのバージョンアップを行う ことで解決した aurora_db_instance_identifier - Amazon Aurora Amazon Aurora (PostgreSQL)
  10. EOF