いろいろ試した結果、とりあえずそういう結論に落ち着いたので覚書。
SUPER権限について
MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.2.1 MySQL で提供される権限
https://dev.mysql.com/doc/refman/5.6/ja/privileges-provided.html
SUPER 権限によって、アカウントはほかのアカウントに属するスレッドを強制終了するための CHANGE MASTER TO、KILL、または mysqladmin kill (自分のスレッドは常に強制終了できます)、PURGE BINARY LOGS、グローバルシステム変数を変更するための SET GLOBAL を使用した構成変更、mysqladmin debug コマンド、ロギングの有効化または無効化、read_only システム変数が有効な場合の更新の実行、スレーブサーバー上でのレプリケーションの開始と停止、ストアドプログラムおよびビューの DEFINER 属性内のすべてのアカウントの指定を使用することができ、ユーザーは max_connections システム変数によって制御される接続制限に達している場合でも (一度) 接続することができます。
バイナリロギングを有効にした場合にストアドファンクションを作成または変更するとき、セクション20.7「ストアドプログラムのバイナリロギング」に記載されているように SUPER 権限がやはり必要になることがあります。
RDSの挙動
以下の設定でRDSのインスタンスを作成した。
1 2 3 4 5 6 7 8 9 |
Instance specifications - DB engine: MySQL Community Edition - License model: general-public-license - DB engine version: MySQL 5.7.23 - [*] Only enable options eligible for RDS Free Usage Tier - DB instance class: db.t2.micro - 1 vCPU, 1 GiB RAM - Multi-AZ deployment [*] No - Storage type: General Purpose (SSD) - Allocated storage: 20 GiB (Minimum: 20 GiB, Maximum: 20 GiB) |
インスタンス作成直後のマスターユーザの権限は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
mysql> select * from mysql.user where user = 'user1'\G *************************** 1. row *************************** Host: % User: user1 Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: Y Shutdown_priv: N Process_priv: Y File_priv: N Grant_priv: Y References_priv: Y Index_priv: Y Alter_priv: Y Show_db_priv: Y Super_priv: N Create_tmp_table_priv: Y Lock_tables_priv: Y Execute_priv: Y Repl_slave_priv: Y Repl_client_priv: Y Create_view_priv: Y Show_view_priv: Y Create_routine_priv: Y Alter_routine_priv: Y Create_user_priv: Y Event_priv: Y Trigger_priv: Y Create_tablespace_priv: N ssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0 max_updates: 0 max_connections: 0 max_user_connections: 0 plugin: mysql_native_password authentication_string: ***** password_expired: N password_last_changed: 2018-12-21 01:47:26 password_lifetime: NULL account_locked: N 1 row in set (0.00 sec) |
その後、マスターユーザへSUPER権限の付与を試みるが失敗する。RDSではワイルドカードを%
と表記しろというアドバイス記事をネットで見つけたので試してみるも通らず。
1 2 3 4 |
mysql> GRANT SUPER ON *.* to user1; ERROR 1045 (28000): Access denied for user 'user1'@'%' (using password: YES) mysql> GRANT SUPER ON `%`.* to user1; ERROR 1045 (28000): Access denied for user 'user1'@'%' (using password: YES) |
新規ユーザを作成してSUPER権限の付与を試みるが、権限を付与する側にSUPER権限が付与されていないので当然失敗する。
AWSのドキュメントを漁ると、SUPER権限を付与する方法ではなく、バイナリログ記録が有効なときに、SUPER 権限なしで関数、プロシージャ、トリガーを有効にする方法については言及されている。
Amazon RDS MySQL の関数
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-mysql-functions/?nc1=h_ls
ネットで先人の知恵を煽ると以下の記事がヒット。
[RDS (MySQL)] Super権限操作で出たエラー | ハックノート
https://hacknote.jp/archives/28810/
RDSではSuper権限が付与されたユーザはAWS側が管理用に確保しているrdsadminというユーザのみになっており、自身で作成したユーザにはSuper権限が付与されていません(付与することもできません)。
AWS再入門 Amazon RDS編 | DevelopersIO
https://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws-re-entering-rds/
Amazon RDSでは、DBに対して管理者権限ではログインできません。そのため管理者権限を使用した操作が必須である場合は、その操作を回避するかRDSの採用をやめる必要があります。
ただし、本来は管理者権限でしか実行できない操作をストアドプロシージャやAWSCLIで使用できる場合があります。MySQLの場合、CHANGE MASTER、KILL等がSUPER権限でしか実行できません。しかし、CHANGE MASTERであればmysql.rds_set_external_masterプロシージャ、KILLであればmysql.rds_killプロシージャやmysql.rds_kill_queryプロシージャで同等の操作が可能です。
管理者権限が必要な場合は、代替コマンドが用意されているか確認しましょう。
SUPER権限は付与できないっぽい。