AWS RDS MySQLにIAM認証を使用して接続する方法
AWS RDSのMySQLに接続する際、通常はユーザー名とパスワードを使用しますが、セキュリティを向上させるためにIAM認証を利用することができます。IAM認証を使用することで、MySQLのパスワードを管理する必要がなく、AWSのセキュリティベストプラクティスに従うことができます。
本記事では、boto3を使用してIAM認証を用いたMySQL接続方法を解説します。
目次
1. IAM認証を使用するメリット
✅ セキュリティ向上
- MySQLの固定パスワードを使わず、一時的なトークンで認証できる。
- AWS IAMのポリシー管理により、アクセス制御が容易。
✅ 認証管理の自動化
- ユーザーのローテーションや削除が容易。
- IAMロールを使えば、EC2やLambdaなどのAWSサービスからシームレスにアクセス可能。
2. RDS MySQLのIAM認証を有効化する
まず、RDSのMySQLインスタンスでIAM認証を有効にする必要があります。
🎯 IAM認証を有効にする手順:
- AWSコンソール → RDSのデータベース一覧へ移動。
- 対象のRDSインスタンスを選択。
- 変更 → パラメータグループを開く。
rds.iam_authentication
をenabled
に変更。- 変更を適用し、RDSを再起動。
💡 注意: IAM認証を有効にすると、
GRANT
コマンドでIAMユーザーをMySQLに登録する必要があります。
CREATE USER 'your-iam-username'@'%' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
GRANT ALL PRIVILEGES ON testdb.* TO 'your-iam-username'@'%';
FLUSH PRIVILEGES;
3. boto3を使ったIAM認証MySQL接続
AWSのboto3
ライブラリを使って、IAM認証でMySQLに接続するPythonスクリプトを作成します。
🎯 必要なライブラリをインストール
pip install boto3 pymysql
🎯 IAM認証トークンを使用してMySQLに接続
import boto3
import pymysql
import pandas as pd
# IAM認証情報の取得
cloud_provider_dictionary = {
"ACCESS_KEY_ID": cloud_provider_object.access_key_id,
"SECRET_ACCESS_KEY": cloud_provider_object.secret_access_key,
"TOKEN": cloud_provider_object.token
}
boto3_session_args = {
'aws_access_key_id': cloud_provider_dictionary["ACCESS_KEY_ID"],
'aws_secret_access_key': cloud_provider_dictionary["SECRET_ACCESS_KEY"],
'aws_session_token': cloud_provider_dictionary["TOKEN"],
'region_name': 'ap-northeast-1' # 東京リージョン
}
session = boto3.Session(**boto3_session_args)
# RDSのエンドポイント情報を取得
rds_client = session.client('rds')
db_instance_identifier = 'your-db-instance-identifier'
response = rds_client.describe_db_instances(DBInstanceIdentifier=db_instance_identifier)
rds_endpoint = response['DBInstances'][0]['Endpoint']['Address']
rds_port = response['DBInstances'][0]['Endpoint']['Port']
# IAM認証トークンの生成
rds_iam_user = 'your-iam-username'
auth_token = rds_client.generate_db_auth_token(DBHostname=rds_endpoint, Port=rds_port, DBUsername=rds_iam_user)
# MySQL接続設定
mysql_config = {
'host': rds_endpoint,
'port': rds_port,
'user': rds_iam_user,
'password': auth_token,
'database': 'testdb',
'ssl': {'ca': '/path/to/rds-combined-ca-bundle.pem'} # 必要に応じてSSL証明書を指定
}
# MySQLデータベースに接続してデータを取得
def fetch_data_from_mysql():
connection = pymysql.connect(**mysql_config)
try:
query = "SELECT * FROM user;"
data_frame = pd.read_sql(query, connection)
finally:
connection.close()
return data_frame
def main():
data_frame = fetch_data_from_mysql()
return data_frame
# 実行
data = main()
print(data)
4. IAMポリシーの設定
RDS IAM認証を使用する場合、MySQLユーザーに対応するIAMユーザー/ロールに適切なポリシーを付与する必要があります。
🎯 IAMポリシーの例(rds-db:connect
)
IAMユーザー/ロールに以下のポリシーを設定してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "rds-db:connect",
"Resource": "arn:aws:rds-db:ap-northeast-1:123456789012:dbuser:your-db-instance-identifier/your-iam-username"
}
]
}
arn:aws:rds-db:<region>:<account-id>:dbuser:<db-instance-id>/<iam-user>
your-db-instance-identifier
は RDS インスタンスの識別子を指定します。
5. まとめ
✅ AWS IAM認証を使用することで、MySQLの固定パスワードを管理する必要がなくなるため、セキュリティを向上できます。
✅ boto3.Session
を使って、一時的なIAM認証トークンを生成し、それをMySQLのパスワードとして利用します。
✅ IAMポリシーで適切なアクセス権を設定し、IAM認証を使って安全にMySQLへ接続できます。
これで、AWS RDS MySQLへのIAM認証を活用し、より安全でスケーラブルなシステムを構築できます!🎉