Function Compute では、状態は異なる実行環境インスタンス間で共有されません。データベースを介して構造化データを永続化することで、状態の共有を実装できます。Function Compute からクラウドデータベースにアクセスすることで、データクエリやデータ挿入などの操作を実行できます。このトピックでは、Python 3 を例として使用して、同じ VPC 内または VPC とリージョンを跨いで ApsaraDB RDS for SQL Server にアクセスする方法について説明します。
前提条件
このトピックのサンプルコード index.py のロジックは、users という名前のデータベーステーブルのすべてのデータをクエリします。実際の状況に合わせてテーブル名を変更し、テーブルに少なくとも 1 つのレコードがあることを確認してください。
手順
ステップ 1:データベースのホワイトリストを設定する
シナリオ 1:同じ VPC 内の SQL Server データベースにアクセスする
作成するデータベースインスタンスが、データベースインスタンスにアクセスする必要がある関数と同じリージョンにあることを確認してください。
Function Compute でサポートされているゾーンにデータベースインスタンスを作成します。詳細については、「Function Compute でサポートされているゾーン」をご参照ください。
データベースインスタンスが Function Compute でサポートされているゾーンにデプロイされていない場合は、VPC に vSwitch を作成します。 vSwitch は Function Compute と同じゾーンにある必要があります。さらに、Function Compute の指定されたサービスの VPC 構成で vSwitch ID を指定する必要があります。プライベートネットワークは同じ VPC 内の異なる vSwitch 間で相互に通信できるため、Function Compute は vSwitch を介して VPC 内の他のゾーンのリソースにアクセスできます。詳細な手順については、「「vSwitch is in unsupported zone」エラーを解決するにはどうすればよいですか?」をご参照ください。
RDS 管理コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックし、[基本情報] をクリックし、[VPC] の横にある [接続の詳細を表示] をクリックして、SQL Server の VPC 情報を表示します。

Function Compute コンソール にログインし、Python Web 関数を作成し、関数の VPC アクセスを有効にし、ターゲット VPC リソースを構成します。
説明関数に構成された VPC が、データベースインスタンスにバインドされている VPC と同じであることを確認してください。

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

前の手順で取得した vSwitch の CIDR ブロックをアクセスホワイトリストに追加します。
重要IP アドレスホワイトリストを使用して、関数がデータベースにアクセスすることを承認します。セキュリティグループモードを使用しないでください。そうしないと、関数がデータベースに接続できない場合があり、ビジネスに影響します。
RDS 管理コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックします。
インスタンス詳細ページの左側のナビゲーションウィンドウで、[ホワイトリストとセキュリティグループ] をクリックします。 [ホワイトリスト設定] タブで、ターゲットホワイトリストテンプレート名を見つけ、右側の [変更] をクリックします。
表示される [ホワイトリストグループの変更] パネルで、[ホワイトリスト] フィールドにターゲットインスタンスにバインドされている vSwitch の CIDR ブロックを入力し、[OK] をクリックします。

構成が完了すると、関数はデータベースの内部ネットワークアドレスを介して SQL Server データベースにアクセスできます。
シナリオ 2:VPC またはリージョンを跨いで SQL Server データベースにアクセスする
異なる VPC とリージョンは、互いに完全に論理的に分離されています。通常の状況では、VPC やリージョンを跨いでデータベースにアクセスすることはできません。 VPC またはリージョンを跨いでデータベースにアクセスする必要がある場合は、関数に固定パブリック IP アドレスを構成できます。この場合、システムは関数にバインドされている VPC にパブリック NAT ゲートウェイを作成し、パブリック IP アドレスを介してデータベースにアクセスできるようにします。
RDS 管理コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックし、[基本情報] をクリックし、[VPC] の横にある [接続の詳細を表示] をクリックして、SQL Server の VPC 情報を表示します。

Function Compute コンソール にログインし、Python Web 関数を作成します。関数の詳細ページで、 を選択します。 [ネットワーク] パネルで、関数に固定パブリック IP アドレスを構成し、[デプロイ] をクリックします。

表示される [固定パブリック IP 構成] ダイアログボックスで、チェックボックスをオンにして [OK] をクリックします。構成が完了したら、[デフォルト NIC がインターネットにアクセスすることを許可する] パラメーターを [いいえ] に設定して、構成された固定パブリック IP アドレスを有効にします。詳細については、「固定パブリック IP アドレスを構成する」をご参照ください。
説明[デフォルト NIC がインターネットにアクセスすることを許可する] パラメーターを [いいえ] に設定すると、固定パブリック IP アドレスが有効になります。 Function Compute はデフォルトのネットワークインターフェースカード(NIC)を無効にし、トラフィックが VPC にバインドされている NIC を介してインターネットにアクセスするように強制します。
関数の詳細ページで、 を選択し、[ネットワーク] ページで、関数に構成されている固定パブリック IP アドレスを取得します。

前の手順で取得した固定パブリック IP アドレスをアクセスホワイトリストに追加します。
重要IP アドレスホワイトリストを使用して、関数がデータベースにアクセスすることを承認します。セキュリティグループモードを使用しないでください。そうしないと、関数がデータベースに接続できない場合があり、ビジネスに影響します。
RDS 管理コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックします。
左側のナビゲーションウィンドウで、[ホワイトリストとセキュリティグループ] をクリックします。 [ホワイトリスト設定] タブで、ターゲットホワイトリストテンプレート名を見つけ、右側の [変更] をクリックします。
表示される [ホワイトリストグループの変更] パネルで、[ホワイトリスト] フィールドにバインドする固定パブリック IP アドレスを入力し、[OK] をクリックします。

構成が完了すると、関数はデータベースのパブリックネットワークアドレスを介して SQL Server データベースにアクセスできます。
ステップ 2:関数で SQL Server データベースにアクセスする
Function Compute コンソール にログインし、関数リストでターゲット関数を見つけ、関数の詳細ページの [コード] タブをクリックし、データベーステーブルに基づいてコードエディターに次のサンプルコードを記述します。
from flask import Flask, jsonify import os import pymssql # pymssqlライブラリを最初にインストールする必要があります from datetime import datetime app = Flask(__name__) # データベースシングルトン接続を格納するグローバル変数 _mssql_connection = None # データベース接続を作成する(シングルトンパターン) def getConnection(): global _mssql_connection try: # 接続が既に存在し、切断されていない場合は、それを直接返します if _mssql_connection is not None: try: # 接続が有効かどうかをテストします(簡単なコマンドテスト) with _mssql_connection.cursor() as cursor: cursor.execute("SELECT 1") # 接続状態をテストするための簡単なクエリ result = cursor.fetchone() if result and result[0] == 1: return _mssql_connection except pymssql.OperationalError: # 接続が切断されている場合は、リセットします _mssql_connection = None # 接続が存在しないか、切断されている場合は、再作成します _mssql_connection = pymssql.connect( host=os.environ['MSSQL_SERVER'], port=int(os.environ['MSSQL_PORT']), user=os.environ['MSSQL_USER'], password=os.environ['MSSQL_PASSWORD'], database=os.environ['MSSQL_DATABASE'], charset='utf8' ) return _mssql_connection except Exception as e: print(f"ERROR: 予期しないエラー:SQL Server インスタンスに接続できませんでした:{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 テーブルは実際のテーブル名に応じて変更します cursor.execute("SELECT * FROM users") 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 finally: # シングルトンパターンを使用しているため、接続を閉じる必要はありません pass if __name__ == '__main__': app.run(host='0.0.0.0', port=9000)関数の必要な依存関係をインストールします:
pip3 install -t . pymssql、[コードのデプロイ] をクリックして、依存関係を有効にします。詳細な手順については、「コンソールの Web IDE ターミナルを介して依存関係をインストールする」をご参照ください。[関数の詳細] ページで、 を選択し、[編集] をクリックし、[環境変数] パネルで次の環境変数を構成します。
環境変数名
環境変数値
説明
MSSQL_SERVER
rm-bp*****wn.sqlserver.rds.aliyuncs.com
データベースインスタンスのアクセスアドレス。 同じ VPC 内の SQL Server データベース シナリオを選択した場合は、この環境変数値をデータベースの内部ネットワークアドレスに設定します。 VPC またはリージョンを跨いで SQL Server データベースにアクセスする シナリオを選択した場合は、この環境変数値をデータベースの外部ネットワークアドレスに設定します。
インスタンスリスト にアクセスし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックします。左側のナビゲーションウィンドウで、[データベース接続] をクリックします。 [データベース接続] 情報エリアで、データベースに接続するための接続アドレス情報を取得します。
MSSQL_PORT
1433
データベースの内部ネットワークポート番号
MSSQL_USER
*****
SQL Server インスタンスで作成されたアカウント名。
MSSQL_PASSWORD
*****
データベースにログインするために使用されるパスワード。
MSSQL_DATABASE
*****
インスタンスで作成されたデータベースの名前。
関数の詳細ページで、[コード] タブをクリックし、[関数のテスト] をクリックし、正常に実行された後に返された結果を表示します。

詳細情報
RDS SQL Server データベースにアクセスするその他の例については、「Function Compute Python が SQL Server データベースにアクセスする」をご参照ください。
Function Compute に構成されている vSwitch 情報を表示する方法、および RDS MySQL データベースで Function Compute の vSwitch CIDR ブロックを許可する方法については、「ネットワークを構成する」と「SQL Server のホワイトリストを構成する」をそれぞれご参照ください。
データベースアクセスに失敗した場合は、問題の症状に基づいてトラブルシューティングを行う必要があります。詳細については、「データベースアクセス失敗の一般的な原因」をご参照ください。
Serverless Devs コマンドラインツールを使用して ApsaraDB RDS for SQL Server で関数を作成し、データベースにアクセスする場合は、次の手順をご参照ください。