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

Function Compute:ApsaraDB RDS for MySQL への接続

最終更新日:Apr 21, 2026

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」というエラーが表示された場合の対処法」をご参照ください。

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

    説明

    関数に設定された VPC が、ご利用のデータベースインスタンスに関連付けられている VPC と同じであることを確認してください。

    image

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

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

    重要

    関数のデータベースへのアクセスを許可するには、IP アドレスホワイトリストを使用する必要があります。権限付与にセキュリティグループを使用しないでください。セキュリティグループを使用すると、断続的な接続障害が発生し、サービスが中断される可能性があります。

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

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

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

      説明

      以前に作成されたインスタンスは、高セキュリティホワイトリストモードを使用している場合があります。すべての新しいインスタンスは、標準ホワイトリストモードを使用します。

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

      image

    設定が完了すると、関数は内部エンドポイントを使用して ApsaraDB RDS データベースに接続できます。

異なる VPC またはリージョン

VPC とリージョンは論理的に分離されているため、デフォルトでは VPC 間またはリージョン間の直接的なデータベース接続はできません。異なる VPC またはリージョンからデータベースに接続するには、関数に固定パブリック IP アドレスを割り当てることができます。これにより、関数の VPC に NAT Gateway がプロビジョニングされ、関数は設定された IP アドレスを介してインターネット経由でデータベースにアクセスできるようになります。

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

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

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

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

    重要

    関数のデータベースへのアクセスを許可するには、IP アドレスホワイトリストを使用する必要があります。権限付与にセキュリティグループを使用しないでください。セキュリティグループを使用すると、断続的な接続障害が発生し、サービスが中断される可能性があります。

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

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

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

      説明

      以前に作成されたインスタンスは、高セキュリティホワイトリストモードを使用している場合があります。すべての新しいインスタンスは、標準ホワイトリストモードを使用します。

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

      image

    設定が完了すると、関数はパブリックエンドポイントを使用して ApsaraDB RDS データベースに接続できます。

ステップ 2:データベースへのアクセス

  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' テーブルからすべてのレコードをクエリします。必要に応じてテーブル名を変更してください。
                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)
    
  2. 関数の詳細ページで、設定 タブをクリックします。詳細設定 セクションで、変更 をクリックします。詳細設定 パネルで、環境変数 セクションを見つけ、次の環境変数を設定します。その後、デプロイ をクリックします。

    パラメーター

    説明

    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 インスタンスで作成したアカウントの名前。

  3. 関数の詳細ページで、コード タブをクリックします。関数のテスト をクリックします。関数が正常に実行されると、返された結果はクエリが成功したことを示します。

    image

関連情報

  • ApsaraDB RDS for MySQL データベースへの接続方法のその他の例については、「Python 関数を MySQL データベースに接続する」をご参照ください。

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

  • 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 間またはリージョン間で RDS データベースにアクセスする」をご参照ください。

      # ------------------------------------
      #   公式ドキュメント: 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 内の ApsaraDB 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 ブロックまたは固定パブリック IP アドレスが、データベースインスタンスのアクセスホワイトリストに追加されていることを確認してください。詳細については、「ステップ 1:データベースのホワイトリストの設定」をご参照ください。

      sudo s invoke -e "{}"