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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Yuki Yuki
March 20, 2024
1.7k

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

Avatar for Yuki

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