Function Compute では、実行インスタンスはステートレスであり、データを共有しません。データベースを使用して構造化データを永続化し、状態を共有できます。Function Compute をクラウドデータベースに接続することで、データのクエリや挿入などの操作を実行できます。このトピックでは、Python 関数を例に、同一 VPC または異なる VPC やリージョンから ApsaraDB RDS for MySQL インスタンスに接続する方法を説明します。
前提条件
ApsaraDB RDS for MySQL インスタンスが作成されていること。詳細については、「」または「ApsaraDB RDS for MySQL インスタンスの作成」をご参照ください。
インスタンス用のデータベースとアカウントが作成されていること。詳細については、「データベースとアカウントの作成」をご参照ください。
このトピックのサンプルコード `index.py` は、`users` という名前のデータベーステーブルからすべてのデータをクエリします。必要に応じてテーブル名を変更できます。テーブルに少なくとも 1 つのレコードが含まれていることを確認してください。
操作手順
ステップ 1:データベースのホワイトリストの設定
同一 VPC
同一 VPC 内のデータベースインスタンスに接続するには、関数と ApsaraDB RDS インスタンスが同じリージョンにあることを確認してください。Function Compute がサポートするゾーンにデータベースインスタンスを作成することを推奨します。詳細については、「サポートされているゾーン」をご参照ください。ご利用のデータベースインスタンスがサポートされているゾーンにない場合は、関数と同じゾーンにある VPC に vSwitch を作成できます。その後、関数の VPC 設定でこの vSwitch ID を指定します。同一 VPC 内の vSwitch はプライベートネットワーク経由で通信できるため、関数はこの vSwitch を使用して他のゾーンのリソースにアクセスできます。詳細な手順については、「「vSwitch is in unsupported zone」というエラーが表示された場合の対処法」をご参照ください。
Function Compute コンソールにログインし、「Python Web 関数の作成」に従って関数を作成します。関数の詳細ページで、設定 タブをクリックします。詳細設定 セクションで、変更 をクリックします。詳細設定 パネルで、ネットワーク セクションを見つけ、関数の VPC アクセスを有効にし、ターゲット VPC リソースを設定します。
説明関数に設定された VPC が、ご利用のデータベースインスタンスに関連付けられている VPC と同じであることを確認してください。

関数の詳細ページで、設定 タブをクリックします。ネットワーク セクションで、関数に設定されている vSwitch の CIDR ブロックを取得します。
前のステップで取得した vSwitch の CIDR ブロックをデータベースのアクセスホワイトリストに追加します。
重要関数のデータベースへのアクセスを許可するには、IP アドレスホワイトリストを使用する必要があります。権限付与にセキュリティグループを使用しないでください。セキュリティグループを使用すると、断続的な接続障害が発生し、サービスが中断される可能性があります。
RDS インスタンスリストに移動します。ページ上部でリージョンを選択し、ターゲットインスタンスの ID をクリックします。
左側のナビゲーションウィンドウで、ホワイトリストとセキュリティグループ をクリックします。
ホワイトリストの設定 ページで、現在の IP ホワイトリストモードを確認できます。
説明以前に作成されたインスタンスは、高セキュリティホワイトリストモードを使用している場合があります。すべての新しいインスタンスは、標準ホワイトリストモードを使用します。
default グループの右側にある 変更 をクリックします。グループを変更する ダイアログボックスで、ステップ 2 で取得した vSwitch の IPv4 CIDR ブロックをホワイトリストに追加します。その後、OK をクリックします。

設定が完了すると、関数は内部エンドポイントを使用して ApsaraDB RDS データベースに接続できます。
異なる VPC またはリージョン
VPC とリージョンは論理的に分離されているため、デフォルトでは VPC 間またはリージョン間の直接的なデータベース接続はできません。異なる VPC またはリージョンからデータベースに接続するには、関数に固定パブリック IP アドレスを割り当てることができます。これにより、関数の VPC に NAT Gateway がプロビジョニングされ、関数は設定された IP アドレスを介してインターネット経由でデータベースにアクセスできるようになります。
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[関数] をクリックします。リージョンを選択し、プロンプトに従って関数を作成します。
関数の詳細ページで、設定 タブをクリックします。詳細設定 セクションで、変更 をクリックします。詳細設定 パネルで、ネットワーク セクションを見つけます。固定パブリック IP アドレス を有効にし、関数がデフォルトで NIC のインターネットアクセスを許可する を無効にして、固定パブリック IP アドレスを有効化します。その後、デプロイ をクリックします。
関数の詳細ページで、設定 タブをクリックします。ネットワーク セクションで、関数に割り当てられた Elastic IP アドレス (EIP) を取得します。
前のステップで取得した EIP をデータベースのアクセスホワイトリストに追加します。
重要関数のデータベースへのアクセスを許可するには、IP アドレスホワイトリストを使用する必要があります。権限付与にセキュリティグループを使用しないでください。セキュリティグループを使用すると、断続的な接続障害が発生し、サービスが中断される可能性があります。
RDS インスタンスリストに移動します。ページ上部でリージョンを選択し、ターゲットインスタンスの ID をクリックします。
左側のナビゲーションウィンドウで、ホワイトリストとセキュリティグループ をクリックします。
ホワイトリストの設定 ページで、現在の IP ホワイトリストモードを確認できます。
説明以前に作成されたインスタンスは、高セキュリティホワイトリストモードを使用している場合があります。すべての新しいインスタンスは、標準ホワイトリストモードを使用します。
default グループの右側にある 変更 をクリックします。グループを変更する ダイアログボックスで、ステップ 3 で取得した EIP をホワイトリストに追加します。その後、OK をクリックします。

設定が完了すると、関数はパブリックエンドポイントを使用して ApsaraDB RDS データベースに接続できます。
ステップ 2:データベースへのアクセス
Function Compute コンソールにログインします。関数リストでご利用の関数を見つけます。関数の詳細ページで、コード タブをクリックし、コードエディタに次のサンプルコードを入力します。
from flask import Flask, jsonify import pymysql import os from datetime import datetime import logging app = Flask(__name__) # シングルトンの MySQL 接続を格納するグローバル変数。 _mysql_connection = None # データベース接続を作成します (シングルトンパターン)。 def getConnection(): global _mysql_connection try: # 接続が存在し、アクティブな場合は、それを返します。 if _mysql_connection is not None: try: # 簡単なクエリで接続が有効かどうかをテストします。 with _mysql_connection.cursor() as cursor: cursor.execute("SELECT 1") # 接続を検証するための軽量なクエリ。 result = cursor.fetchone() if result and result[0] == 1: return _mysql_connection except pymysql.OperationalError: # 接続が切断されている場合は、リセットします。 _mysql_connection = None # 接続が存在しないか、切断されている場合は、新しい接続を作成します。 _mysql_connection = pymysql.connect( host=os.environ['MYSQL_HOST'], port=int(os.environ['MYSQL_PORT']), user=os.environ['MYSQL_USER'], password=os.environ['MYSQL_PASSWORD'], db=os.environ['MYSQL_DBNAME'] ) return _mysql_connection except Exception as e: logging.error(f"データベース接続中にエラーが発生しました: {e}") raise @app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): conn = getConnection() try: with conn.cursor() as cursor: # 'users' テーブルからすべてのレコードをクエリします。必要に応じてテーブル名を変更してください。 sql = "SELECT * FROM users" cursor.execute(sql) result = cursor.fetchall() columns = [desc[0] for desc in cursor.description] # 列名のリストを取得します。 # クエリ結果を辞書のリストに変換します。 users = [] for row in result: user = {} for idx, column_name in enumerate(columns): value = row[idx] if isinstance(value, datetime): # datetime フィールドを処理します。 user[column_name] = value.strftime('%Y-%m-%d %H:%M:%S') else: user[column_name] = value users.append(user) if users: # すべてのユーザーを含む JSON 応答を返します。 return jsonify(users), 200 else: # ユーザーが見つからない場合は、404 エラーを返します。 return jsonify({'error': 'No users found'}), 404 except Exception as e: logging.error(f"データベース操作中にエラーが発生しました: {e}") return jsonify({'error': 'Database error'}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=9000)関数の詳細ページで、設定 タブをクリックします。詳細設定 セクションで、変更 をクリックします。詳細設定 パネルで、環境変数 セクションを見つけ、次の環境変数を設定します。その後、デプロイ をクリックします。
パラメーター
値
説明
MYSQL_HOST
rm-bp19u8e76ae****.mysql.rds.aliyuncs.com
データベースインスタンスのエンドポイント。
同一 VPC 内の ApsaraDB RDS インスタンスに接続するには、この環境変数をデータベースの内部エンドポイントに設定します。
異なる VPC またはリージョンから ApsaraDB RDS インスタンスに接続するには、この環境変数をデータベースのパブリックエンドポイントに設定します。
RDS インスタンスリストに移動し、ターゲットの ApsaraDB RDS インスタンスの ID をクリックします。左側のナビゲーションウィンドウで、データベースの接続 をクリックします。データベースの接続 ページで、データベースの内部またはパブリックエンドポイントを取得できます。
MYSQL_DBNAME
db_test
ApsaraDB RDS インスタンスで作成したデータベースの名前。
MYSQL_PASSWORD
*****
データベースアカウントのパスワード。
MYSQL_PORT
3306
データベースインスタンスの内部ポート。
MYSQL_USER
dms_user_****
ApsaraDB RDS インスタンスで作成したアカウントの名前。
関数の詳細ページで、コード タブをクリックします。関数のテスト をクリックします。関数が正常に実行されると、返された結果はクエリが成功したことを示します。

関連情報
ApsaraDB RDS for MySQL データベースへの接続方法のその他の例については、「Python 関数を MySQL データベースに接続する」をご参照ください。
データベース接続が失敗した場合は、その症状に基づいて問題をトラブルシューティングします。詳細については、「データベース接続失敗の一般的な原因」をご参照ください。
ApsaraDB RDS は、MySQL、SQL Server、PostgreSQL、および MariaDB データベースエンジンをサポートしています。詳細については、「ApsaraDB RDS とは」をご参照ください。
Serverless Devs コマンドラインツールを使用して関数を作成し、ApsaraDB RDS for MySQL データベースに接続するには、次の手順に従います。