AWS Identity Access Management (IAM) 認証を使用して Amazon Relational Database Service (Amazon RDS) for MySQL インスタンスに接続すると、“Access Denied” エラーが表示されます。
簡単な説明
エラーメッセージは、IAM ロールのアクセス許可が不十分であったり、IAM 認証が無効であったり、データベースユーザーの構成ミスがあったり、接続文字列にエラーがあったりする場合に発生する可能性があります。次のようなエラーメッセージが表示される場合があります。
"ERROR 1045 (28000): Access denied for user 'root'@'10.0.4.253' (using password: YES)"
AWS Support-TroubleshootRDSiamAuthentication ランブックを使用して、Amazon RDS インスタンスでの IAM 認証に必要な設定を自動的に検証します。次に、解決策を実行してこのエラーを解決します。
解決策
IAM ロールのアクセス許可が不十分である
IAM データベース認証を使用して Amazon RDS for MySQL インスタンスに接続するには、rds-db:connect アクションにアクセスできる必要があります。詳細については、「IAM データベースアクセス用の IAM ポリシーの作成と使用」を参照してください。
Amazon リソースネーム (ARN) を指定するだけでなく、必ず正しいリソース ID を使用してください。DB インスタンスのリソース ID を見つけるには、次の手順を実行します。
- Aurora と RDS コンソールを開きます。
- ナビゲーションペインで [データベース] をクリックします。
- 次に、[設定] タブをクリックします。
注: リソース ID は [設定] セクションにあります。詳細については、「IAM データベースアクセス用の IAM ポリシーの作成と使用」を参照してください。
SCP ポリシーを使用する場合は、そのポリシーで DB インスタンスへの接続が許可されていることを確認してください。詳細については、「Creating, updating, and deleting service control policies」(サービスコントロールポリシーの作成、更新、削除) を参照してください。
IAM 認証を有効にする
デフォルトでは、データベースインスタンスでは IAM 認証は無効になっています。Amazon RDS for MySQL インスタンスまたは Aurora DB クラスターの設定を確認し、IAM 認証が有効になっていることを確認してください。
注: [すぐに適用] を選択すると、保留中のすべての変更は、メンテナンスウィンドウ中ではなく、すぐに有効になります。このアクションにより、Amazon RDS for MySQL インスタンスが長期間中断される可能性があります。詳細については、「[Using the Apply Immediately setting]」([すぐに適用] 設定の使用) (http://スケジュール変更設定の使用) を参照してください。
データベースユーザーに構成ミスがある
AWSAuthenticationPlugin プラグインは Amazon RDS for MySQL のユーザーを認証します。IAM 認証を使用して Amazon RDS for MySQL インスタンスに接続するには、AWSAuthenticationPlugin を使用します。
このプラグインが IAM ロールに関連付けられていることを確認するには、次のコマンドを実行します。
select user,plugin,host from mysql.user where user like '%db-user-name%';
注: **db-user-name ** をデータベースの実際のユーザー名に置き換えてください。
出力例:
+------+-------------------------+------+
| user | plugin | host |
+------+-------------------------+------+
| root | AWSAuthenticationPlugin | % |
+------+-------------------------+------+
1 row in set (0.00 sec)
IAM ロールが特定のホストを使用している場合は、そのホスト名を使用する必要があります。指定したデータベースにアクセスするための正しいアクセス許可があることも確認してください。
ユーザーに付与されたアクセス許可を確認するには、次のコマンドを実行します。
show grants for <user>;
注: user を実際のユーザー名に置き換えてください。
他のユーザーにアクセス許可を付与するには、次のコマンドを実行します。
grant select on <mydb>.<mytable> to <user>;
注: 実際のものでそれぞれ、mydb をデータベースインスタンス名に、mytable をテーブル名に、user をユーザー名に置き換えてください。
詳細については、MySQL のウェブサイトで「GRANT statement」(GRANT ステートメント) を参照してください。
接続文字列が誤っている
Amazon RDS for MySQL データベースに接続するには、接続文字列で --enable-cleartext-plugin パラメータを使用します。--enable-cleartext-plugin パラメータは、認証トークンとして機能します。そのため、データベースに接続してデータベースユーザーを設定するときは、AWSAuthenticationPlugin を使用する必要があります。AWSAuthenticationPlugin を正しく設定しないと、IAM 認証を使用してデータベースに接続したときに Access Denied エラーが表示されます。
次の接続文字列の例を使用してください。
mysql -h <endpoint> -P 3306 --enable-cleartext-plugin --user=RDSConnect --password=$
注: endpoint をアクセスする DB インスタンスのホスト名に置き換えてください。
MariaDB クライアントを使用する場合、--enable-cleartext-plugin パラメータは必要ありません。代わりに、最初にトークンを環境変数に保存してください。次に、MySQL DB インスタンスに接続するときに環境変数を使用します。
次の例を参照してください。
RDSHOST="rdsmysql.123456789012.us-west-2.rds.amazonaws.com"TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-west-2 --username db-user-name)"
mysql --host=$RDSHOST --port=3306 --enable-cleartext-plugin --user=db-user-name --password=$TOKEN
環境変数を使用して MySQL DB インスタンスに接続する方法の詳細については、「DB インスタンスへの接続」を参照してください。
関連情報
ユーザーが IAM 認証情報を使用して Amazon RDS MySQL DB インスタンスへの認証を行えるようにする方法を教えてください
IAM データベース認証
MariaDB、MySQL、および PostgreSQL の IAM データベース認証