LoginSignup
0
0

AWS RDS MySQLで権限がリセットされるようになったので対処しました

Last updated at Posted at 2024-05-12

はじめに

突然、本番環境で下記のエラーが出るようになりました。

django.db.utils.OperationalError:
(1227, 'Access denied; you need (at least one of)
the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s)
for this operation')

本番環境において、使用していた主な技術スタックは下記の通りです。

  • AWS RDS (MySQL)
  • Django

試したこと

1. ユーザーに権限を付与した

とりあえず you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) と書かれているので、素直に与えてみました。

MySQL
MySQL [(none)]> SHOW GRANTS;
| Grants for username@%                      
+--------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, ...中略..., DROP ROLE ON *.* TO `admin`@`%` WITH GRANT OPTION |

MySQL [(none)]> GRANT SESSION_VARIABLES_ADMIN ON *.* TO `username`@`%` WITH GRANT OPTION;
MySQL [(none)]> SHOW GRANTS;

| Grants for username@%                      
+--------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, ...中略..., DROP ROLE ON *.* TO `admin`@`%` WITH GRANT OPTION |
| GRANT SESSION_VARIABLES_ADMIN ON *.* TO `username`@`%` WITH GRANT OPTION |

これで、権限の付与は完了。エラーも解消されました。しかし…

2. 数分後にまた同じエラーが発生した

どういうわけか、数分後にまた同じエラーが発生してしまいました。再度、権限を確認してみると、

MySQL
MySQL [(none)]> SHOW GRANTS;
| Grants for username@%                      
+--------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, ...中略..., DROP ROLE ON *.* TO `admin`@`%` WITH GRANT OPTION |

と、権限が元の状態に戻っていました。その後、何度か権限の内容を変えながらリトライしてみましたが、いずれも結果は同じでした。

3. AWS RDSのドキュメントを読んだのち、方針を転換

AWS RDS の公式ドキュメントには、マスターユーザーに付与されている権限の一覧 が記載されていますが、ここに SYSTEM_VARIABLES_ADMINSESSION_VARIABLES_ADMIN はありませんし、システム変更を許可する権限付与はそもそも非推奨です。そこで、定期的に権限を削除するバッチを実行するようになったのかなと推察します。
image.png

「権限を与える」ことは断念し、「権限がなくても済む記述に変更する」 という方針に変更することにしました。

結論: Djangoの設定を修正した

base.py
DATABASES["default"]["OPTIONS"] = {
    "init_command": "SET sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1",
    "charset": "utf8mb4",
}

という記述をしており、 SET sql_mode='STRICT_TRANS_TABLES を実行するためにシステムアクセス権限が必要となっていたので、 init_command の行をコメントアウトしました。

base.py
DATABASES["default"]["OPTIONS"] = {
    # "init_command": "SET sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1",
    "charset": "utf8mb4",
}

参考記事

English

Why is SYSTEM_VARIABLES_ADMIN privilige deleted every 10 minutes in AWS RDS (MYSQL)?

I have a similar error in my Django application.
I had given the MySQL user SYSTEM_VALIABLES_ADMIN permission, but AWS RDS changed their specs and this permission is reset every 5-10 minutes.

So I checked my Django configuration.
I looked for where it was using the SYSTEM_VALIABLES_ADMIN permission and found the following code

DATABASES["default"]["OPTIONS"] = {
    "init_command": "SET sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1",
    "charset": "utf8mb4",
}

SET sql_mode='STRICT_TRANS_TABLES', innodb_strict_mode=1
requires the SYSTEM_VALIABLES_ADMIN permission.

I have resolved the error by commenting out this init_command.

Instead, I set innodb_strict_mode=1 using the AWS RDS parameter group feature.

I hope this helps you all.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0