Function Compute では、状態は異なる実行環境インスタンス間で共有されません。データベースを使用して構造化データを永続化することで、状態の共有を実現できます。Function Compute を使用すると、クラウドデータベースに対してデータクエリやデータ挿入などの操作を実行できます。このトピックでは、Python 関数を例として使用して、同じ VPC 内または VPC とリージョンを跨いで ApsaraDB RDS for MySQL にアクセスする方法について説明します。
前提条件
このトピックのサンプルコード index.py のロジックは、users という名前のデータベーステーブルのすべてのデータをクエリすることです。実際の状況に合わせてテーブル名を変更し、テーブルに少なくとも 1 つのレコードがあることを確認してください。
手順
ステップ 1: データベースのホワイトリストを構成する
シナリオ 1: 同じ VPC 内の RDS データベースにアクセスする
同じ VPC 内のデータベースにアクセスする場合、データベースインスタンスと関数が同じリージョンにあることを確認してください。Function Compute がサポートするゾーンにデータベースインスタンスを作成することをお勧めします。詳細については、「Function Compute がサポートするゾーン」をご参照ください。データベースインスタンスが Function Compute でサポートされていないゾーンにある場合は、Function Compute と同じゾーンの VPC に vSwitch を作成し、関数の VPC 構成でこの vSwitch ID を使用できます。同じ VPC 内の vSwitch はプライベートネットワークを介して相互に通信できます。そのため、Function Compute は vSwitch を使用して、他のゾーンにある VPC のリソースにアクセスできます。詳細については、「vSwitch がサポートされていないゾーンにある場合のエラーが発生した場合の対処方法」をご参照ください。
Function Compute コンソール にログインし、Python Web 関数を作成し、関数の VPC アクセスを有効にして、ターゲット VPC リソースを構成します。
説明関数に構成された VPC が、データベースインスタンスが接続されている VPC と同じであることを確認してください。

関数の詳細ページで、 を選択し、[ネットワーク] ページで、関数構成の vSwitch の CIDR ブロックを取得します。

前のステップで取得した vSwitch の CIDR ブロックをデータベースアクセスホワイトリストに追加します。
重要IP アドレスホワイトリストを使用して、関数がデータベースにアクセスすることを承認します。セキュリティグループモードを使用しないでください。そうしないと、関数がデータベースに接続できない場合があり、ビジネスに影響します。
RDS インスタンスリスト にアクセスし、上部でリージョンを選択して、ターゲットインスタンス ID をクリックします。
左側のナビゲーションバーで、ホワイトリストとセキュリティグループ をクリックします。
ホワイトリストの設定 ページで、現在の IP ホワイトリストモードを表示できます。
説明既存の RDS インスタンスは、拡張ホワイトリストモードで実行される場合があります。すべての新しい RDS インスタンスは、標準ホワイトリストモードで実行されます。
[変更] グループの右側にある [デフォルト] をクリックします。表示される [ホワイトリストグループの変更] ダイアログボックスで、ステップ 2 で取得した vSwitch の IPv4 CIDR ブロックをホワイトリストに構成し、[OK] をクリックします。

構成が完了すると、関数はデータベースの内部エンドポイントを介して RDS データベースにアクセスできます。
シナリオ 2: VPC またはリージョンを跨いで RDS データベースにアクセスする
異なる VPC とリージョンは、互いに完全に論理的に分離されています。一般に、VPC やリージョンを跨いでデータベースにアクセスすることはできません。 VPC またはリージョンを跨いでデータベースにアクセスする必要がある場合は、関数に固定パブリック IP アドレスを構成できます。この場合、システムは関数が接続されている VPC にパブリック NAT ゲートウェイを作成します。パブリックゲートウェイを使用して、パブリック IP アドレスを介してデータベースにアクセスできます。
Function Compute コンソール にログインします。左側のナビゲーションウィンドウで、[関数] をクリックし、リージョンを選択して、プロンプトに従って 関数を作成 します。
関数の詳細ページで、 を選択します。[ネットワーク] パネルで、関数の固定パブリック IP アドレスを構成し、[デプロイ] をクリックします。

表示される [固定パブリック IP 構成] ダイアログボックスで、プロンプトのチェックボックスをオンにして、[OK] をクリックします。構成が完了したら、[デフォルトの NIC がインターネットにアクセスすることを許可する] パラメーターを [いいえ] に設定して、構成済みの固定パブリック IP アドレスを有効にします。
関数の詳細ページで、 を選択し、[ネットワーク] ページで、関数に構成されている固定パブリック IP アドレスを取得します。

前のステップで取得した関数の固定パブリック IP アドレスをデータベースアクセスホワイトリストに追加します。
重要IP アドレスホワイトリストを使用して、関数がデータベースにアクセスすることを承認します。セキュリティグループモードを使用しないでください。そうしないと、関数がデータベースに接続できない場合があり、ビジネスに影響します。
RDS インスタンスリスト にアクセスし、上部でリージョンを選択して、ターゲットインスタンス ID をクリックします。
左側のナビゲーションバーで、ホワイトリストとセキュリティグループ をクリックします。
ホワイトリストの設定 ページで、現在の IP ホワイトリストモードを表示できます。
説明既存の RDS インスタンスは、拡張ホワイトリストモードで実行される場合があります。すべての新しい RDS インスタンスは、標準ホワイトリストモードで実行されます。
[変更] グループの右側にある [デフォルト] をクリックします。表示される [ホワイトリストグループの変更] ダイアログボックスで、ステップ 2 で取得した vSwitch の IPv4 CIDR ブロックをホワイトリストに構成し、[OK] をクリックします。

構成が完了すると、関数はデータベースのパブリックエンドポイントを介して RDS データベースにアクセスできます。
ステップ 2: 関数で RDS にアクセスする
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 テーブルのすべてのレコードをクエリする。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): # 日付タイプのフィールドを処理する 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': 'ユーザーが見つかりません'}), 404 except Exception as e: logging.error(f"データベース操作中にエラーが発生しました: {e}") return jsonify({'error': 'データベースエラー'}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=9000)関数の詳細ページで、 を選択し、[編集] をクリックして、[環境変数] パネルで次の環境変数を構成します。
環境変数名
環境変数値
説明
MYSQL_HOST
rm-bp19u8e76ae****.mysql.rds.aliyuncs.com
データベースインスタンスのエンドポイント。
同じ VPC 内の RDS データベース シナリオを選択した場合は、この環境変数をデータベースの内部エンドポイントに設定します。
VPC またはリージョンを跨いで RDS データベースにアクセスする シナリオを選択した場合は、この環境変数をデータベースのパブリックエンドポイントに設定します。
RDS インスタンスリスト で、ターゲット RDS インスタンス ID をクリックします。左側のナビゲーションウィンドウで、[データベース接続] をクリックします。[データベース接続] ページで、データベースの内部エンドポイントまたはパブリックエンドポイントを取得します。
MYSQL_DBNAME
db_test
RDS インスタンスに作成されたデータベースの名前。
MYSQL_PASSWORD
*****
データベースアカウントのパスワード。
MYSQL_PORT
3306
データベースインスタンスのプライベートポート。
MYSQL_USER
dms_user_****
RDS インスタンスへの接続に使用するアカウントのユーザー名。
関数の詳細ページで、[コード] タブをクリックし、[関数のテスト] をクリックして、正常に実行された後に返された結果を表示します。テーブルクエリ操作は正常に完了しました。

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