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

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

```
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 の公式ドキュメントには、[マスターユーザーに付与されている権限の一覧](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.MasterAccounts.html) が記載されていますが、ここに `SYSTEM_VARIABLES_ADMIN` や `SESSION_VARIABLES_ADMIN` はありませんし、システム変更を許可する権限付与はそもそも非推奨です。そこで、定期的に権限を削除するバッチを実行するようになったのかなと推察します。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/32918f93-8cb1-822d-fb0e-278db6646dfb.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",
}

```

## 参考記事
- [Why is SYSTEM_VARIABLES_ADMIN privilige deleted every 10 minutes in AWS RDS (MYSQL)?](https://repost.aws/questions/QUD9yaiLT2Q9CoWSrOclktuA/why-is-system-variables-admin-privilige-deleted-every-10-minutes-in-aws-rds-mysql) →最初の解決者になりました！
- [マスターユーザーアカウント権限](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.MasterAccounts.html)

## English

[Why is SYSTEM_VARIABLES_ADMIN privilige deleted every 10 minutes in AWS RDS (MYSQL)?](https://repost.aws/questions/QUD9yaiLT2Q9CoWSrOclktuA/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.