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

Function Compute:Redis へのアクセスのベストプラクティス

最終更新日:Sep 22, 2025

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

前提条件

Redis インスタンスを作成する

手順

ステップ 1: データベースのホワイトリストを構成する

シナリオ 1: 同じ VPC 内の Redis データベースにアクセスする

重要
  • 作成するデータベースインスタンスが、データベースインスタンスにアクセスする必要がある関数と同じリージョンにあることを確認します。

  • Function Compute でサポートされているゾーンにデータベースインスタンスを作成します。 詳細については、「Function Compute でサポートされているゾーン」をご参照ください。

  • データベースインスタンスが Function Compute でサポートされているゾーンにデプロイされていない場合は、VPC に vSwitch を作成します。 vSwitch は Function Compute と同じゾーンにある必要があります。 また、Function Compute の指定されたサービスの VPC 構成で vSwitch ID を指定する必要があります。 プライベートネットワークは同じ VPC 内の異なる vSwitch 間で相互に通信できるため、Function Compute は vSwitch を介して他のゾーンの VPC 内のリソースにアクセスできます。 詳細については、「vSwitch がサポートされていないゾーンにある場合のエラーが発生した場合の対処方法」をご参照ください。

  1. Tair (Redis OSS-compatible) コンソール にログインし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックし、[インスタンス情報] をクリックして、Redis インスタンスの VPC 情報を表示します。

    image

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

    説明

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

    image

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

    image

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

    重要

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

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

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

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

      image

構成が完了すると、関数はデータベースの内部エンドポイントを介して Redis データベースにアクセスできます。

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

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

  1. Tair (Redis OSS-compatible) コンソール にログインし、[インスタンス情報] をクリックして、Redis インスタンスの 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. 管理コンソール にログイン し、上部でリージョンを選択し、ターゲットインスタンス ID をクリックします。

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

    3. 表示される [ホワイトリストグループの変更] パネルで、[ホワイトリストグループの IP アドレス] ダイアログボックスのホワイトリストに固定パブリック IP アドレスを構成し、[OK] をクリックします。

      image

構成が完了すると、関数はデータベースのパブリックエンドポイントを介して Redis データベースにアクセスできます。

ステップ 2: 関数で Redis にアクセスする

  1. Function Compute コンソール にログインし、関数リストでターゲット関数を見つけ、関数の詳細ページの [コード] タブをクリックし、コードエディタに次のサンプルコードを記述します。

    from flask import Flask,jsonify
    import os
    import redis
    
    app = Flask(__name__)
    
    # Redis シングルトン接続を格納するためのグローバル変数
    _redis_connection = None
    
    # データベース接続を作成する (シングルトンパターン)
    def getConnection():
        global _redis_connection
        try:
            # 接続が既に存在し、切断されていない場合は、それを直接返す
            if _redis_connection is not None:
                try:
                    # 接続が有効かどうかをテストする (単純な ping コマンド)
                    if _redis_connection.ping():
                        return _redis_connection
                except redis.ConnectionError:
                    # 接続が切断されている場合は、それをリセットする
                    _redis_connection = None
    
            # 接続が存在しないか、切断されている場合は、再作成する
            _redis_connection = redis.Redis(
                host=os.environ['REDIS_HOST'],
                password=os.environ['REDIS_PASSWORD'],
                port=os.environ['REDIS_PORT'],
                db=1,
                decode_responses=True
            )
            # 新しい接続が成功したかどうかをテストする
            if not _redis_connection.ping():
                raise Exception("Redis 接続の作成後に失敗しました。")
            return _redis_connection
        except Exception as e:
            print(f"Redis 接続の初期化に失敗しました: {e}")
            raise
    
    @app.route('/', defaults={'path': ''})
    @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
    def hello_world(path):
        try:
            r = getConnection()
            counter = r.get('counter')
            if counter is None:
                counter = 0
            else:
                counter = int(counter)
            print('counter: ' + str(counter))
            r.set('counter', str(counter + 1))
            return str(counter)
        except Exception as e:
            print(f"エラーが発生しました: {e}")
            return jsonify({"error": str(e)}), 500
       
    
    if __name__ == '__main__':
            app.run(host='0.0.0.0',port=9000)
    
  2. [関数の詳細] ページで、[構成] > [環境変数] を選択し、[編集] をクリックし、[環境変数] パネルで次の環境変数を構成します。

    環境変数名

    環境変数値

    説明

    REDIS_HOST

    r-bp*****.redis.rds.aliyuncs.com

    データベースインスタンスのエンドポイントです。 [同一 VPC 内の Redis データベース] シナリオを選択した場合は、この環境変数をデータベースの VPC エンドポイントに設定します。 [VPC またはリージョン間の Redis データベース] シナリオを選択した場合は、この環境変数をデータベースのパブリックエンドポイントに設定します。

    [インスタンスリスト] にアクセスし、上部のナビゲーションバーでリージョンを選択し、ターゲットインスタンス ID をクリックします。 左側のナビゲーションウィンドウで、[インスタンス情報] をクリックします。 [接続情報] セクションで、データベースに接続するための接続アドレス情報を取得します。

    image

    REDIS_PASSWORD

    *****

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

    REDIS_PORT

    6379

    データベースのポート番号

  3. Redis データベースに初期値を設定します。 関数の詳細ページで、[コード] タブをクリックし、[関数のテスト] をクリックし、正常に実行された後に返された結果を確認します。

    image

詳細情報

  • Tair (Redis OSS-compatible) へのアクセスのその他の例については、「Function Compute Python accessing Tair (Redis OSS-compatible)」をご参照ください。

  • Tair (Redis OSS-compatible) へのアクセスに関するその他の例外ケースについては、「一般的なエラー」をご参照ください。

  • 発生した例外の問題が解決しない場合は、問題の症状に基づいてトラブルシューティングを行う必要があります。 詳細については、「データベースアクセス障害の一般的な原因」をご参照ください。

  • Serverless Devs コマンドラインツールを使用して関数を作成し、Tair (Redis OSS-compatible) データベースにアクセスする場合は、次の手順をご参照ください。

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

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

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

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

      # ------------------------------------
      #   公式マニュアル: 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"  # RDS データベースに同じ VPC 内でアクセスすることを選択した場合は、関数が RDS データベースと同じリージョンにデプロイされていることを確認してください
      
      resources:
        hello_world:
          component: fc3 
          actions:       
            pre-${regex('deploy|local')}: 
              - component: fc3 build 
          props:
            region: ${vars.region}              
            functionName: "start-python-redis"
            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
              REDIS_HOST: r-bp*****.redis.rds.aliyuncs.com  # データベースエンドポイント
              REDIS_PASSWORD: *****     # データベースパスワード
              REDIS_PORT: "6379"         # データベースポート
             

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

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

      requirements.txt ファイルで指定されている依存関係は次のとおりです。

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

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

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

      説明

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

      sudo s invoke -e "{}"