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.3k
AWS JDBC Driverに入れ替えたら Spring Bootが起動しなくなった話
Yuki
March 20, 2024
Tweet
Share
More Decks by Yuki
See All by Yuki
大阪リージョンへのDR初設計
yukimatsumoto1987
0
270
Featured
See All Featured
The Language of Interfaces
destraynor
158
25k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Become a Pro
speakerdeck
PRO
29
5.4k
Art, The Web, and Tiny UX
lynnandtonic
301
21k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
How to Ace a Technical Interview
jacobian
278
23k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
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