軽い内容だけど備忘録として。
要はRDSのMySQLでは、プロセスを殺すためのKILLが使えないよーっておはなし。
KILLできない
例えばSleepプロセスを、root以外の管理ユーザーから殺したいと思ってKILLコマンドを許可する SUPER 権限をそのユーザーに与えたかったのだけど、それができない。
1 2 |
mysql> GRANT SUPER ON *.* TO `admin`@`%`; ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES) |
今の設定がどうなってるか確認してみると、そもそもroot(※インスタンス起動時に登録したマスターユーザー)にSUPER権限が与えられていない。
1 2 3 4 5 6 7 8 |
mysql> SELECT User, Host, Process_priv, Super_priv FROM user; |----------+-----------+--------------+------------+ | User | Host | Process_priv | Super_priv | +----------+-----------+--------------+------------+ | rdsadmin | localhost | Y | Y | | root | % | Y | N | | admin | % | Y | N | +----------+-----------+--------------|------------+ |
試しに他のユーザーのプロセスをKILLしてみる
1 2 |
mysql> KILL 751914; ERROR 1095 (HY000): You are not owner of thread 751914 |
やっぱりダメぽい…。
どうするか
AWS公式のドキュメントでこんなのを見つけた。
mysql.rds_kill – Amazon Relational Database Service
どうやらKILLが使えない代替策で mysql.rds_kill を使えってことらしい。
1 2 |
mysql> CALL mysql.rds_kill(751914); Query OK, 0 rows affected (0.00 sec) |
うまくいった。
これを一般ユーザーで使えるようにするためには、一般的なストアドプロシージャの許可と同じようにする。
1 2 |
mysql> GRANT Execute ON PROCEDURE `mysql`.`rds_kill` TO `admin`@`%`; mysql> FLUSH PRIVILEGES; |
補足
上表のユーザーリストで rdsadmin となっているのはAWSがRDSインスタンスの監視に使うユーザーであり、私たちはログインできない。
推測になるが、これらRDS管理系のシステム仕様上SUPER権限はユーザーに与えられていないのだろう。そういった類の特権処理について、AWS側の制約により実行できないものは別途ストアドプロシージャが提供されていて、これを介して使うことができるようだ。
それらのストアドプロシージャーはこのRDSのリファレンスページに纏められている。
所感
シェルからKILLを流し込むスクリプトなど、他の環境で使っていたものを流用するときは十分注意したいです。こういった制約とその代替策がいかにもAWSらしいような、そんな気がします。