このトピックでは、仮想プライベートクラウド (VPC) を介してFunction ComputeからTair (Redis OSS-compatible) データベースへのアクセスを確立するためのガイダンスを提供します。 具体的には、関数でVPC関連の設定、およびデータベースのホワイトリストを設定して、Tair (Redis OSS-compatible) データベースにアクセスし、関連する操作を実行できます。 このトピックでは、Serverless Devsを使用して、Python 3ランタイムでTair (Redis OSS-compatible) データベースにアクセスする関数をデプロイします。
始める前に
作成するデータベースインスタンスが、データベースインスタンスにアクセスする必要がある関数と同じリージョンにあることを確認します。
Function Computeがサポートするゾーンにデータベースインスタンスを作成することを推奨します。 詳細については、「Function Computeが利用可能なゾーン」をご参照ください。
データベースインスタンスがFunction Computeでサポートされているゾーンにない場合、Function Computeと同じゾーンのVPCにvSwitchを作成し、関数のVPC設定でこのvSwitch IDを使用できます。 同じVPC内のvSwitchは、プライベートネットワークを介して相互に通信できます。 したがって、Function ComputeはvSwitchを使用して、他のゾーンにあるVPCのリソースにアクセスできます。 詳細については、「vSwitchがサポートされていないゾーンエラーが報告された場合はどうすればよいですか? 」をご参照ください。
手順
Serverless DevsとDockerをインストールし、AccessKey情報を設定します。
詳細については、「Serverless Devsと依存関係のインストール」および「Serverless Devsの設定」をご参照ください。
次のコマンドを実行して、プロジェクトを初期化します。
sudo s init
CLIで、ベンダーとしてAlibaba Cloudを指定し、クイックスタートモードを指定し、組み込みのPythonランタイムを選択します。 プロジェクト名とプロジェクトがデプロイされるリージョンを設定します。 この例では、start-fc-redis-pythonプロジェクトが中国 (杭州) リージョンにデプロイされています。
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd start-fc-redis-python
独自のビジネス要件に基づいてディレクトリファイルを変更します。
s.yamlファイルを編集します。 例:
edition: 3.0.0 name: hello-world-app access: "default" vars: # The global variables. region: "cn-hangzhou" resources: hello_world: component: fc3 # The component name. # actions: # The custom execution logic. For more information about actions, visit https://docs.serverless-devs.com/serverless-devs/yaml#%E8%A1%8C%E4%B8%BA%E6%8F%8F%E8%BF%B0actions. props: region: ${vars.region} # For information about how to use variables, visit https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC. functionName: "start-python-xbk4" description: 'hello world by serverless devs' runtime: "python3.9" code: ./code handler: index.handler memorySize: 128 timeout: 30 internetAccess: true vpcConfig: vpcId: vpc-bp11y195luy47h8cm**** # The ID of the VPC in which the database instance resides. securityGroupId: sg-bp1el3hto8hhkdup**** # The ID of the security group. vSwitchIds: - vsw-bp18vwna9x79koh3q**** # Make sure that the CIDR block of the vSwitch is added to the whitelist of the database instance. environmentVariables: REDIS_HOST: r-bp17w15ohdk7****.redis.rds.aliyuncs.com # The private endpoint of the database instance. REDIS_PASSWORD: 15**** # The password of the database instance. REDIS_PORT: 6379 # The private port of the database instance.
重要関数用に設定したvSwitchのCIDRブロックがデータベースインスタンスのホワイトリストに追加されていることを確認します。 詳細については、「データベースのIPアドレスホワイトリストの設定」をご参照ください。
index.pyコードファイルを編集します。 次のコードスニペットは例を示します。 コードロジックは、Redisからカウンターキーの値を読み取り、値を1だけ増やしてから、新しい値をRedisに書き戻すことです。
# -*- coding: utf-8 -*- import os import redis conn_pool = None def initializer(context): global conn_pool conn_pool = redis.ConnectionPool( host=os.environ['REDIS_HOST'], password=os.environ['REDIS_PASSWORD'], port=os.environ['REDIS_PORT'], db=1, decode_responses=True) def handler(event, context): global conn_pool r = redis.Redis(connection_pool=conn_pool) 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 counter
次のコマンドを実行してプロジェクトをビルドします。
sudo s build --use-docker
次のコマンドを実行して、プロジェクトをデプロイします。
sudo s deploy -y
次のコマンドを実行して、関数を呼び出します。
sudo s invoke -e "{}"
次のコードスニペットは、期待される出力を示しています。 返される結果の値が0から増加します。これは、カウンターキーの値がRedisから正常に読み取られたことを示します。
[2021-09-14T17:08:50.875] [INFO ] [S-CLI] - Start ... ========= FC invoke Logs begin ========= FC Initialize Start RequestId: ccd73383-048d-4c8d-834e-93da59b86a21 FC Initialize End RequestId: ccd73383-048d-4c8d-834e-93da59b86a21 FC Invoke Start RequestId: eccafc0a-493e-4f3e-9afa-45c0b84a2c0f counter: 0 FC Invoke End RequestId: eccafc0a-493e-4f3e-9afa-45c0b84a2c0f Duration: 27.51 ms, Billed Duration: 28 ms, Memory Size: 256 MB, Max Memory Used: 34.05 MB ========= FC invoke Logs end ========= FC Invoke Result: 0 End of method: invoke
データベースのIPアドレスホワイトリストの構成
IPアドレスホワイトリストを使用して、関数がデータベースにアクセスすることを許可します。 セキュリティグループモードを使用しないでください。 そうしないと、関数がデータベースへの接続に失敗し、ビジネスに影響を与えることがあります。
コンソールにログインします。
上部のナビゲーションバーで、インスタンスがデプロイされているリージョンを選択します。
[インスタンス] ページでインスタンスを見つけ、そのIDをクリックします。
インスタンス詳細ページの左側のナビゲーションウィンドウで、[ホワイトリスト設定] をクリックします。 [ホワイトリストの設定] タブで、変更するホワイトリストを見つけ、[操作] 列の [変更] をクリックします。
[ホワイトリストの変更] パネルで、インスタンスがバインドされているvSwitchのCIDRブロックを [ホワイトリスト] フィールドに入力し、[OK] をクリックします。
関連ドキュメント
Tair (Redis OSS-compatible) データベースへのアクセスの詳細については、「Function ComputeのPythonアクセスredisデータベース」をご参照ください。
Function Computeで設定されたvSwichesに関する情報を表示し、Function Compute vSwichesのCIDRブロックをApsaraDB RDS For MySQLデータベースのホワイトリストに追加する方法の詳細については、「ネットワーク設定の設定」および「IPアドレスホワイトリストの設定」をご参照ください。
このトピックで提供されるサンプルコードが期待どおりに実行されるように、Redisクライアントライブラリをインポートする必要があります。 サードパーティの依存関係をインストールする方法の詳細については、「関数のサードパーティの依存関係のインストール」をご参照ください。
設定されたvSwitchが指定されたゾーンにアクセスできない場合は、「vSwitch is in unsupported zone」エラーを解決するにはどうすればよいですか?」をご参照ください。 Tair (Redis OSS-compatible) データベースにアクセスしたときに発生する可能性のある一般的な例外の詳細については、「一般的なエラーとトラブルシューティング」をご参照ください。「 データベースアクセス障害のトラブルシューティング方法? 」を参照して、データベース接続障害のトラブルシューティングを行うこともできます。