すべてのプロダクト
Search
ドキュメントセンター

Function Compute:RDS SQL Server へのアクセスのベストプラクティス

最終更新日:Jun 10, 2025

Function Compute では、状態は異なる実行環境インスタンス間で共有されません。データベースを介して構造化データを永続化することで、状態の共有を実装できます。Function Compute からクラウドデータベースにアクセスすることで、データクエリやデータ挿入などの操作を実行できます。このトピックでは、Python 3 を例として使用して、同じ VPC 内または VPC とリージョンを跨いで ApsaraDB RDS for SQL Server にアクセスする方法について説明します。

前提条件

  • RDS 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」エラーを解決するにはどうすればよいですか?」をご参照ください。

  1. RDS 管理コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックし、[基本情報] をクリックし、[VPC] の横にある [接続の詳細を表示] をクリックして、SQL Server の VPC 情報を表示します。

    image

  2. Function Compute コンソール にログインし、Python Web 関数を作成し、関数の VPC アクセスを有効にし、ターゲット VPC リソースを構成します。

    説明

    関数に構成された VPC が、データベースインスタンスにバインドされている VPC と同じであることを確認してください。

    image

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

    image

  4. 前の手順で取得した vSwitch の CIDR ブロックをアクセスホワイトリストに追加します。

    重要

    IP アドレスホワイトリストを使用して、関数がデータベースにアクセスすることを承認します。セキュリティグループモードを使用しないでください。そうしないと、関数がデータベースに接続できない場合があり、ビジネスに影響します。

    1. RDS 管理コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックします。

    2. インスタンス詳細ページの左側のナビゲーションウィンドウで、[ホワイトリストとセキュリティグループ] をクリックします。 [ホワイトリスト設定] タブで、ターゲットホワイトリストテンプレート名を見つけ、右側の [変更] をクリックします。

    3. 表示される [ホワイトリストグループの変更] パネルで、[ホワイトリスト] フィールドにターゲットインスタンスにバインドされている vSwitch の CIDR ブロックを入力し、[OK] をクリックします。

      image

構成が完了すると、関数はデータベースの内部ネットワークアドレスを介して SQL Server データベースにアクセスできます。

シナリオ 2:VPC またはリージョンを跨いで SQL Server データベースにアクセスする

異なる VPC とリージョンは、互いに完全に論理的に分離されています。通常の状況では、VPC やリージョンを跨いでデータベースにアクセスすることはできません。 VPC またはリージョンを跨いでデータベースにアクセスする必要がある場合は、関数に固定パブリック IP アドレスを構成できます。この場合、システムは関数にバインドされている VPC にパブリック NAT ゲートウェイを作成し、パブリック IP アドレスを介してデータベースにアクセスできるようにします。

  1. RDS 管理コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックし、[基本情報] をクリックし、[VPC] の横にある [接続の詳細を表示] をクリックして、SQL Server の VPC 情報を表示します。

    image

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

    image

  3. 表示される [固定パブリック IP 構成] ダイアログボックスで、チェックボックスをオンにして [OK] をクリックします。構成が完了したら、[デフォルト NIC がインターネットにアクセスすることを許可する] パラメーターを [いいえ] に設定して、構成された固定パブリック IP アドレスを有効にします。詳細については、「固定パブリック IP アドレスを構成する」をご参照ください。

    説明

    [デフォルト NIC がインターネットにアクセスすることを許可する] パラメーターを [いいえ] に設定すると、固定パブリック IP アドレスが有効になります。 Function Compute はデフォルトのネットワークインターフェースカード(NIC)を無効にし、トラフィックが VPC にバインドされている NIC を介してインターネットにアクセスするように強制します。

  4. 関数の詳細ページで、[構成] > [ネットワーク] を選択し、[ネットワーク] ページで、関数に構成されている固定パブリック IP アドレスを取得します。

    image

  5. 前の手順で取得した固定パブリック IP アドレスをアクセスホワイトリストに追加します。

    重要

    IP アドレスホワイトリストを使用して、関数がデータベースにアクセスすることを承認します。セキュリティグループモードを使用しないでください。そうしないと、関数がデータベースに接続できない場合があり、ビジネスに影響します。

    1. RDS 管理コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックします。

    2. 左側のナビゲーションウィンドウで、[ホワイトリストとセキュリティグループ] をクリックします。 [ホワイトリスト設定] タブで、ターゲットホワイトリストテンプレート名を見つけ、右側の [変更] をクリックします。

    3. 表示される [ホワイトリストグループの変更] パネルで、[ホワイトリスト] フィールドにバインドする固定パブリック IP アドレスを入力し、[OK] をクリックします。

      image

構成が完了すると、関数はデータベースのパブリックネットワークアドレスを介して SQL Server データベースにアクセスできます。

ステップ 2:関数で SQL Server データベースにアクセスする

  1. 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)
    
  2. 関数の必要な依存関係をインストールします:pip3 install -t . pymssql[コードのデプロイ] をクリックして、依存関係を有効にします。詳細な手順については、「コンソールの Web IDE ターミナルを介して依存関係をインストールする」をご参照ください。

  3. [関数の詳細] ページで、[構成] > [環境変数] を選択し、[編集] をクリックし、[環境変数] パネルで次の環境変数を構成します。

    環境変数名

    環境変数値

    説明

    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

    *****

    インスタンスで作成されたデータベースの名前。

  4. 関数の詳細ページで、[コード] タブをクリックし、[関数のテスト] をクリックし、正常に実行された後に返された結果を表示します。

    image

詳細情報

  • 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 で関数を作成し、データベースにアクセスする場合は、次の手順をご参照ください。

    ここをクリックして Serverless Devs の操作手順を表示する

    1. Serverless Devs と Docker をインストールし、キー情報を追加します。 具体的な操作については、「クイックスタート」をご参照ください。

    2. コードディレクトリ mycode を作成し、s.yaml ファイルとコードファイル app.py を準備します。 s.yaml ファイルの例を以下に示します。 app.py のサンプルコードについては、「ステップ 2:関数で SQL Server データベースにアクセスする」で提供されているサンプルコードをご参照ください。

      次の s.yaml の例は、同じ VPC 内の SQL Server データベースにアクセスするシナリオに適用されます。 VPC やリージョンを跨いでデータベースにアクセスする必要がある場合は、「シナリオ 2:VPC またはリージョンを跨いで SQL Server データベースにアクセスする」をご参照ください。

      # ------------------------------------
      #   公式マニュアル:https://manual.serverless-devs.com/user-guide/aliyun/#fc3
      #   ヒント:https://manual.serverless-devs.com/user-guide/tips/
      #   ご質問がある場合は、DingTalk グループ 33947367 に参加して技術サポートを受けてください。
      # ------------------------------------
      edition: 3.0.0
      name: hello-world-app
      access: "default"
      
      vars: # グローバル変数
        region: "cn-hangzhou"  # 同じ VPC 内の RDS データベースにアクセスすることを選択した場合は、関数が RDS データベースと同じリージョンにデプロイされていることを確認してください
      
      resources:
        hello_world:
          component: fc3 
          actions:       
            pre-${regex('deploy|local')}: 
              - component: fc3 build 
          props:
            region: ${vars.region}              
            functionName: "start-python-sqlServer"
            runtime: custom.debian10
            description: 'hello world by serverless devs'
            timeout: 10
            memorySize: 512
            cpu: 0.5
            diskSize: 512
            code: ./code
            customRuntimeConfig:
              port: 9000
              command:
                - python3
                - app.py
            internetAccess: true
            vpcConfig:
              vpcId: vpc-bp1dxqii29fpkc8pw**** # データベースインスタンスが配置されている VPC ID
              securityGroupId: sg-bp12ly2ie92ixrfc**** # セキュリティグループ ID
              vSwitchIds: 
                 - vsw-bp1ty76ijntee9z83**** # この vSwitch の CIDR ブロックがデータベースインスタンスアクセスホワイトリストに構成されていることを確認してください
            environmentVariables:
              PYTHONPATH: /code/python
              PATH: /code/python/bin:/var/fc/lang/python3.10/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
              MSSQL_SERVER: rm-*****.sqlserver.rds.aliyuncs.com  # データベースエンドポイント
              MSSQL_USER: ******   # SQL Server インスタンスで作成されたアカウント名
              MSSQL_PASSWORD: *****     # データベースパスワード
              MSSQL_DATABASE: *****     # インスタンスで作成されたデータベースの名前。
              MSSQL_PORT:1433 # データベースポート番号
            triggers:
              - name: httpTrigger
                type: http
                config:
                  authType: anonymous
                  methods:
                    - GET
                    - POST
      
      
      

      コードのディレクトリ構造は次のとおりです。

      ├── code
      │ ├── app.py
      │ └── requirements.txt
      └── s.yaml

      requirements.txt ファイルで指定されている依存関係を以下に示します。

      flask==2.2.5
      pymssql==2.3.2
    3. プロジェクトをビルドするには、次のコマンドを実行します。

      sudo s build --use-docker
    4. 次のコマンドを実行して、関数をデプロイします。

      sudo s deploy -y
    5. 次のコマンドを実行して、関数を呼び出します。

      説明

      関数の構成に使用した vSwitch の CIDR ブロックが、データベースインスタンス アクセス ホワイトリストに追加されていることを確認してください。具体的な操作については、「手順 5」をご参照ください。

      sudo s invoke -e "{}"