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

Function Compute:ApsaraDB RDS for MySQL へのアクセス

最終更新日:Jun 23, 2026

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

前提条件

操作手順

ステップ 1:データベースのホワイトリストの設定

シナリオ 1:同じ VPC

同じ VPC 内のデータベースにアクセスする場合、データベースインスタンスと関数が同じリージョンにあることを確認してください。Function Compute がサポートするゾーンにデータベースインスタンスを作成することを推奨します。詳細については、「Function Compute がサポートするゾーン」をご参照ください。ご利用のデータベースインスタンスがサポートされているゾーンにない場合は、関数と同じゾーンに vSwitch を作成し、その ID を関数の VPC 設定で指定できます。同じ VPC 内の vSwitch はプライベートネットワークを介して相互に通信できるため、関数はこの vSwitch を使用して VPC の他のゾーンのリソースにアクセスできます。詳細については、「「vSwitch is in unsupported zone」というエラーが表示された場合の対処方法」をご参照ください。

  1. Function Compute コンソールにログインし、Python Web 関数を作成します。関数詳細ページで、設定 タブを選択し、詳細設定 セクションの 変更 をクリックします。詳細設定 パネルで ネットワーク セクションを見つけ、関数の VPC アクセスを有効にし、送信先の VPC リソースを設定します。

    説明

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

    VPCvSwitchセキュリティグループを設定できます。Function Compute のマルチゾーンディザスタリカバリ機能を最大限に活用し、サービスの可用性を高めるために、2 つ以上のゾーンに vSwitch をデプロイすることを推奨します。現在のリージョンでサポートされているゾーンは、中国 (杭州) の h、i、j、k、f、g、b です。

  2. 関数詳細ページの 設定 タブに移動します。ネットワーク セクションで、関数に設定されている vSwitch の CIDR ブロックを取得します。

  3. 前のステップで取得した vSwitch の CIDR ブロックをデータベースのアクセスホワイトリストに追加します。

    重要

    セキュリティグループではなく、IP アドレスホワイトリストを使用して関数のアクセスを承認することを推奨します。セキュリティグループを使用すると、断続的な接続障害が発生し、サービスに影響を与える可能性があります。

    1. RDS インスタンスリストに移動し、リージョンを選択して、ターゲットインスタンスの ID をクリックします。

    2. 左側のナビゲーションウィンドウで、ホワイトリストとセキュリティグループ をクリックします。

      ホワイトリストの設定 ページで、現在の IP ホワイトリストモードを確認できます。

      説明

      古いインスタンスは高セキュリティモードで動作する場合があります。すべての新しいインスタンスは標準のホワイトリストモードを使用します。

    3. default グループの右側にある 変更 をクリックします。グループを変更する ダイアログボックスで、ステップ 2 で取得した vSwitch の IPv4 CIDR ブロックをホワイトリストに追加し、OK をクリックします。

    設定が完了すると、関数は内部エンドポイントを介して RDS データベースにアクセスできるようになります。

シナリオ 2:異なる VPC またはリージョン間

VPC とリージョンは論理的に分離されています。デフォルトでは、異なる VPC またはリージョン間でデータベースにアクセスすることはできません。これを有効にするには、関数に固定パブリック IP アドレスを設定します。システムは関数の VPC にパブリック NAT ゲートウェイを作成し、関数がパブリック IP アドレスを使用してインターネット経由でデータベースにアクセスできるようにします。

  1. Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[関数] をクリックします。リージョンを選択し、プロンプトに従って関数を作成します。

  2. 関数詳細ページで、設定 タブをクリックします。詳細設定 セクションで、変更 をクリックします。詳細設定 パネルで、ネットワーク セクションを見つけます。固定パブリック IP を有効にするには、固定パブリック IP アドレス を有効にし、関数がデフォルトで NIC のインターネットアクセスを許可する を無効にします。その後、デプロイ をクリックします。

  3. 関数詳細ページの 設定 タブに移動します。ネットワーク セクションで、関数に設定されている Elastic IP アドレス (EIP) を取得します。

  4. 前のステップで取得した EIP をデータベースのアクセスホワイトリストに追加します。

    重要

    セキュリティグループではなく、IP アドレスホワイトリストを使用して関数のアクセスを承認することを推奨します。セキュリティグループを使用すると、断続的な接続障害が発生し、サービスに影響を与える可能性があります。

    1. RDS インスタンスリストに移動し、リージョンを選択して、ターゲットインスタンスの ID をクリックします。

    2. 左側のナビゲーションウィンドウで、ホワイトリストとセキュリティグループ をクリックします。

      ホワイトリストの設定 ページで、現在の IP ホワイトリストモードを確認できます。

      説明

      古いインスタンスは高セキュリティモードで動作する場合があります。すべての新しいインスタンスは標準のホワイトリストモードを使用します。

    3. default グループの右側にある 変更 をクリックします。グループを変更する ダイアログボックスで、ステップ 3 で取得した固定パブリック IP アドレスをホワイトリストに追加し、OK をクリックします。

      ホワイトリストには、192.168.0.1 のような特定の IP アドレスや、192.168.0.0/24 のような CIDR ブロックを含めることができます。複数のエントリはカンマで区切ります。注意:ホワイトリストを 0.0.0.0/0 に設定すると、パブリックインターネットからのアクセスが許可され、127.0.0.1 に設定すると、すべての外部アクセスがブロックされます。新しいホワイトリストは約 1 分で有効になります。

    設定が完了すると、関数はパブリックエンドポイントを介して RDS データベースにアクセスできるようになります。

ステップ 2:関数から RDS へのアクセス

  1. 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):  # 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)
    
  2. 関数詳細ページで、設定 タブを選択し、詳細設定 を見つけ、その右側にある 変更 をクリックします。詳細設定 パネルで、環境変数 セクションを見つけ、次の環境変数を設定し、デプロイ をクリックします。

    パラメーター

    説明

    MYSQL_HOST

    rm-bp19u8e76ae****.mysql.rds.aliyuncs.com

    RDS インスタンスのエンドポイント。

    • 同じ VPC 内の RDS データベースにアクセスする場合は、この環境変数をデータベースの内部エンドポイントに設定します。

    • 異なる VPC またはリージョン間で RDS データベースにアクセスする場合は、この環境変数をデータベースのパブリックエンドポイントに設定します。

    RDS インスタンスリストで、ターゲット RDS インスタンスの ID をクリックします。左側のナビゲーションウィンドウで、データベースの接続 をクリックします。データベースの接続 ページで、データベースの内部またはパブリックエンドポイントを取得できます。

    MYSQL_DBNAME

    db_test

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

    MYSQL_PASSWORD

    *****

    データベースのパスワード。

    MYSQL_PORT

    3306

    データベースインスタンスのプライベートポート。

    MYSQL_USER

    dms_user_****

    RDS インスタンスで作成されたアカウントの名前。

  3. 関数詳細ページで、コード タブをクリックし、関数のテスト をクリックします。関数が正常に実行された後、返された結果を確認してクエリが完了したことを確認します。

    返された JSON データには、idusernameemailpassword_hashcreated_atupdated_at などのフィールドを持つユーザーレコードが含まれています。

関連情報

  • ApsaraDB RDS for MySQL データベースへのアクセスのその他の例については、「Function Compute Python accessing MySQL database」をご参照ください。

  • データベースにアクセスできない場合は、症状に基づいて問題をトラブルシューティングしてください。詳細については、「データベースアクセス失敗の一般的な原因」をご参照ください。

  • ApsaraDB RDS は、MySQL、SQL Server、PostgreSQL、MariaDB データベースエンジンをサポートしています。詳細については、「ApsaraDB RDS の概要」をご参照ください。

  • Serverless Devs コマンドラインツールを使用して関数を作成し、ApsaraDB RDS for MySQL データベースにアクセスするには、次の手順に従います。

    ここをクリックして Serverless Devs の手順を表示

    1. Serverless Devs と Docker をインストールし、認証情報を設定します。詳細については、「クイックスタート」をご参照ください。

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

      以下の s.yaml の例は、同じ VPC 内の RDS データベースにアクセスするためのものです。異なる VPC またはリージョン間でデータベースにアクセスする必要がある場合は、「シナリオ 2:異なる VPC またはリージョン間」をご参照ください。

      # ------------------------------------
      #   公式ドキュメント: 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-0t1m"
            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
              MYSQL_HOST: rm-bp1j1y7657640z5****.mysql.rds.aliyuncs.com  # データベースインスタンスの内部エンドポイント。
              MYSQL_PORT: "3306"  # データベースインスタンスのプライベートポート。
              MYSQL_USER: dms_user_****  # インスタンス内のデータベースのアカウント。
              MYSQL_PASSWORD: ****   # データベースアカウントのパスワード。
              MYSQL_DBNAME: db_test  # インスタンスで作成されたデータベースの名前。
    3. 次のコマンドを実行してプロジェクトをビルドします。

      sudo s build --use-docker
    4. 次のコマンドを実行してプロジェクトをデプロイします。

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

      説明

      関数に設定された vSwitch の CIDR ブロックまたは EIP が、データベースインスタンスのアクセスホワイトリストに追加されていることを確認してください。詳細については、「ステップ 1」をご参照ください。

      sudo s invoke -e "{}"