Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AWS JDBC Driverに入れ替えたらSpring Bootが起動しなくなった話
Search
Yuki
March 20, 2024
1
1.1k
AWS JDBC Driverに入れ替えたら Spring Bootが起動しなくなった話
Yuki
March 20, 2024
Tweet
Share
More Decks by Yuki
See All by Yuki
大阪リージョンへのDR初設計
yukimatsumoto1987
0
240
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
Speed Design
sergeychernyshev
28
860
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
How to Ace a Technical Interview
jacobian
276
23k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
It's Worth the Effort
3n
184
28k
The Cult of Friendly URLs
andyhume
78
6.3k
GitHub's CSS Performance
jonrohan
1030
460k
Fireside Chat
paigeccino
37
3.3k
Scaling GitHub
holman
459
140k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.6k
Transcript
※本資料の内容は、個人の見解であり、所属する企業とは一切関係がありません。 AWS JDBC Driverに入れ替えたら Spring Bootが起動しなくなった話
普段は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 情報処理技術者試験委員 自己紹介
AWS JDBC Driverの説明
AWS JDBC Driverは、AWSが作成したJDBCドライバーのラッパーです。 Aurora特有の機能をアプリケーションがシームレスに使用できるように設計されています。 AWS JDBC Driverとは? GitHub -
awslabs/aws-advanced-jdbc-wrapper
具体的には、高速フェイルオーバー、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つのプラグインのお話
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のコードでプラグインを指定しているが 接続文字列で指定することもできる
Failover Pluginはコネクションを論理コネクションと物理コネクションに分けて、DBイン スタンス障害時には、フェイルオーバープロセスを実行し、障害の影響を軽減します。 Failover Pluginの仕組み • アプリケーションは論理コネクションに接 続する •
DBインスタンスへの接続は、物理コネク ションが担当する • 物理コネクションから通信の例外が発生 すると、フェイルオーバープロセスが実 行される。そこでは、ライターインスタン スの検出、DBの再接続などが行われる • 通常、アプリケーションエンジニアは論 理コネクションと物理コネクションを分け て意識することはない aws-advanced-jdbc-wrapper/docs/using-the-jdbc-driver/using-plugins/UsingTheFailoverPlugin.md
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
現在使用可能なAuroraのバージョンすべてで動作検証が公式に行われているわけで はないです。自身のバージョンできちんと動作検証を行ってください。 動作検証済みバージョン GitHub - awslabs/aws-advanced-jdbc-wrapper
Spring Bootが動かなくなった話
フェイルオーバーの時間を短縮させるため、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を使って いると思い込む 結構簡単に 移行できるかも!
AWS JDBC Driverに入れ替えたら、Spring Bootの起動に失敗するようになってし まった。 AWSアーキテクチャ図 AWS Secrets Manager
(DBのユーザー名とパスワード保管) Amazon Aurora (PostgreSQL) Amazon EC2 (Spring Boot) ①ユーザー名とパスワードを取得 ②接続 Application Load Balancer • Data Sourceの作成に失敗して いるぽいことは分かった • 最初はライブラリの依存関係 を疑っていた PoCでは 動いていたのに 何で!?
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
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)
AWS JDBC Driverは非常に有用なJDBCドライバーです。ただし、落とし穴も結構ある ので公式ドキュメントよく読み、PoCでしっかり検証してからご使用ください。 まとめ(教訓) • 公式ドキュメントやソースコードをよく読む • AWSアーキテクチャ図から、アプリ構成を読み取れると思い込まない
• バージョンの差異をちゃんと意識する • ちなみに、10秒ぐらいでフェイルオーバーできるようになりました
EOF