こんにちは、ライクル事業部 エンジニアの菊池@kichionです
去年(2021年)からフロントエンド環境の立ち上げを行い、現在はバックエンドに戻ってきて技術負債の解消などを中心にシステム改善を行っています
現在システムのリプレイスなどでデータ設計から見直すこともあり、イベントデータをRDB(MySQL)のトリガーで生成しようと取り組んでいたところで罠のようなAWS RDSの仕様に引っかかってしまったのでその内容を紹介します
前提
AWS RDS(MySQL)
AWSで使えるRDBサービスです
ライクルではデータベースエンジンでMySQL(Auroraではない)を利用しています
記事を書いている時点ではver 5.7.33を利用しています
バックアップ
AWS RDSではいくつかバックアップ方式があります
- 自動バックアップ
- 手動バックアップ
- AWS Backup
ライクルでは 自動バックアップ
を採用しています
各バックアップの詳細についてはclassmethodさんの記事がとても参考になりますのでそちらを御覧ください
事件
イベントデータのテーブル及びそのテーブルレコードを作るためのトリガーを検証環境RDSに反映して問題ないことを確認した後に本番環境へ反映しようとしたら
You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) handling *****.sql
「おや?」 何やらエラーメッセージが表示されてトリガーが作成されません
調査
ライクルではAWS CDKによる構成管理を行っているため、基本的には環境ごとの差分は定義の差でしか発生しないはずです
ひとまず「パラメータグループ」の設定差を見ますが、違いは観測できません…
(SHOW VARIABLE
で実際にRDBの設定値を見ても有効な差分はありませんでした)
DDLを実行するユーザの権限にも注目しましたが、検証環境と本番環境でユーザの権限に差はありませんでした
他の違いを見てみると「自動バックアップ有無」「インスタンスタイプ」しかありません
原因
Googleの海で原因・解決策を探していたら一つの記事にたどり着きました
Amazon RDS はマネージド型サービスです。SYS アクセス (SUPER 権限) は提供されていません。MySQL DB インスタンスでバイナリログが有効になっている場合は、DB インスタンス用に作成するカスタム DB パラメータグループで log_bin_trust_function_creators パラメータを true に設定します。
バイナリログを有効にした覚えはありません…が
MySQL DB インスタンスで自動バックアップを有効にすると、バイナリログ記録も有効になります。トリガーの作成時に、次のエラーメッセージが表示されることがあります:「エラー 1419 (HY000): SUPER 権限を持っておらず、バイナリログが有効になっています (安全性の低いlog_bin_trust_function_creators 変数の使用をお勧めします)」
「これだっ…!」
解決
本番環境では自動バックアップが有効になっているため、log_bin_trust_function_creators
パラメータを true に設定しないといけない
検証
実際に検証環境でこの事象が再現できるか確認してみました
- 自動バックアップをONにする
- トリガー作成のDDLを流す
- 作成時エラーが出ることを確認
- パラメータグループの
log_bin_trust_function_creators
: true に設定 - RDS再起動
- トリガー作成のDDLを流す
- 作成できることを確認
見事にトリガー作成ができました
ちなみに自動バックアップをOFFにするとすぐさまトリガー作成ができるようになるので即時で影響があるようでした
まとめ
RDSで自動バックアップが有効になっている場合のトリガー・ストアド作成はパラメータグループの設定 および RDSの再起動が必要になるので注意が必要です!という話でした
AWS公式のドキュメントにも自動バックアップとバイナリログの関係性について言及されていそうな内容が見当たらず「これは罠だっ…!」と変にテンションが上ってしまいましたがハマると怖い内容だったのでいい知見が得られました