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認証を有効にする手順:

  1. AWSコンソール → RDSのデータベース一覧へ移動。
  2. 対象のRDSインスタンスを選択。
  3. 変更パラメータグループを開く。
  4. rds.iam_authenticationenabled に変更。
  5. 変更を適用し、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認証を活用し、より安全でスケーラブルなシステムを構築できます!🎉


💬 参考資料

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です