このトピックでは、仮想プライベートクラウド (VPC) を介してFunction ComputeからApsaraDB RDS for SQL Serverデータベースへのアクセスを確立するためのガイダンスを提供します。 具体的には、ApsaraDB RDS for SQL Serverデータベースにアクセスし、関連する操作を実行するために、関数およびデータベースのホワイトリストでVPC関連の設定を構成できます。 このトピックでは、Serverless Devsを使用して、Python 3ランタイムでApsaraDB RDS for SQL Serverデータベースにアクセスする関数をデプロイします。
始める前に
ApsaraDB RDS for SQL Serverインスタンスの作成
重要作成するデータベースインスタンスが、データベースインスタンスにアクセスする必要がある関数と同じリージョンにあることを確認します。
Function Computeがサポートするゾーンにデータベースインスタンスを作成することを推奨します。 詳細については、「Function Computeが利用可能なゾーン」をご参照ください。
データベースインスタンスがFunction Computeでサポートされているゾーンにない場合、Function Computeと同じゾーンのVPCにvSwitchを作成し、関数のVPC設定でこのvSwitch IDを使用できます。 同じVPC内のvSwitchは、プライベートネットワークを介して相互に通信できます。 したがって、Function ComputeはvSwitchを使用して、他のゾーンにあるVPCのリソースにアクセスできます。 詳細については、「vSwitchがサポートされていないゾーンエラーが報告された場合はどうすればよいですか?」をご参照ください。
usersという名前のテーブルを作成します。
このトピックのindex.pyのサンプルコードでは、usersデータベーステーブル内のすべてのデータが照会されます。 したがって、事前にテーブルを作成する必要があります。
手順
Serverless DevsとDockerをインストールし、AccessKey情報を設定します。
詳細については、「Serverless Devsと依存関係のインストール」および「Serverless Devsの設定」をご参照ください。
次のコマンドを実行して、プロジェクトを初期化します。
sudo s init
CLIで、ベンダーとしてAlibaba Cloudを指定し、クイックスタートモードを指定し、組み込みのPythonランタイムを選択します。 プロジェクト名とプロジェクトがデプロイされるリージョンを設定します。 この例では、start-fc-sql-server-pythonプロジェクトが中国 (杭州) リージョンにデプロイされています。
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd start-fc-sql-server-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 name of the component. Serverless Devs is similar to a game console and does not have specific business capabilities without components. A component is similar to a game card. You can insert different game cards into the game console to play different games. Similarly, you can use different components to implement different business capabilities. 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-xt8f" description: 'hello world by serverless devs' runtime: "python3.9" code: ./code handler: index.handler memorySize: 128 timeout: 30 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-bp116uemmj7fniubi**** # Make sure that the CIDR block of the vSwitch is added to the whitelist of the database instance. environmentVariables: MSSQL_SERVER: rm-bp1gmz41ws982****.sqlserver.rds.aliyuncs.com # The database endpoint. MSSQL_PORT: "1433" # The port of the database. MSSQL_USER: sqlserver**** # The name of the database user. MSSQL_PASSWORD: z**** # The password of the database user. MSSQL_DATABASE: z**** # The name of the database.
重要関数用に設定したvSwitchのCIDRブロックがデータベースインスタンスのホワイトリストに追加されていることを確認します。 詳細については、「データベースのIPアドレスホワイトリストの設定」をご参照ください。
index.pyコードファイルを編集します。 次のコードスニペットは例を示します。 コードロジックは、ユーザーテーブルのすべてのデータを読み取ることです。
# -*- coding: utf-8 -*- import logging import pymssql # You need to install the pymssql library first. import os logger = logging.getLogger() # Create a database connection. def getConnection(): try: conn = 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 conn except Exception as e: logger.error(e) logger.error( "ERROR: Unexpected error: Could not connect to SQL Server instance.") raise Exception(str(e)) def handler(event, context): conn = getConnection() try: with conn.cursor() as cursor: # Query all data in the users table. cursor.execute("SELECT * FROM users") result = cursor.fetchone() logger.info(result) return result finally: # Close the database connection. conn.close()
次のコマンドを実行してプロジェクトをビルドします。
sudo s build --use-docker
次のコマンドを実行して、プロジェクトをデプロイします。
sudo s deploy -y
次のコマンドを実行して、関数を呼び出します。
sudo s invoke -e "{}"
次のコードスニペットは、期待される出力を示しています。 次の応答は、データベースのusersテーブルからデータが正常に読み取られたことを示します。
========= FC invoke Logs begin ========= FunctionCompute python3 runtime inited. FC Invoke Start RequestId: 1-65d404e6-15b9013a-67628c1019d2 2024-02-20T01:48:22.181Z 1-65d404e6-15b9013a-67628c1019d2 [INFO] None FC Invoke End RequestId: 1-65d404e6-15b9013a-67628c1019d2 Duration: 90.16 ms, Billed Duration: 91 ms, Memory Size: 128 MB, Max Memory Used: 16.54 MB ========= FC invoke Logs end ========= Invoke instanceId: c-65d404de-15f440b6-75331892ecca Code Checksum: 18155960032536767495 Qualifier: LATEST RequestId: 1-65d404e6-15b9013a-67628c1019d2 Invoke Result: null [hello_world] completed (0.32s)
データベースのIPアドレスホワイトリストの構成
IPアドレスホワイトリストを使用して、関数がデータベースにアクセスすることを許可します。 セキュリティグループモードを使用しないでください。 そうしないと、関数がデータベースへの接続に失敗し、ビジネスに影響を与えることがあります。
[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。
左側のナビゲーションウィンドウで、ホワイトリストとセキュリティグループ.をクリックします。
ホワイトリストの設定 タブで、IPアドレスホワイトリストのモードを表示できます。
説明既存のRDSインスタンスは、拡張ホワイトリストモードで実行できます。 すべての新しいRDSインスタンスは標準ホワイトリストモードで実行されます。
表示される [ホワイトリストの設定] タブで、[デフォルト] ホワイトリストグループを見つけ、[変更] をクリックします。
[ホワイトリストの編集] ダイアログボックスで、[IPアドレス] を設定し、[OK] をクリックします。
重要ネットワークをFunction Computeに設定するときに追加するvSwitchのCIDRブロックに属するIPアドレスを指定する必要があります。
より多くの情報
ApsaraDB RDS For SQL Serverデータベースへのアクセスの詳細については、「Function ComputeのPython access sql serverデータベース」をご参照ください。
Function Computeで設定されたvSwichesに関する情報を表示し、Function Compute vSwichesのCIDRブロックをApsaraDB RDS For MySQLデータベースのホワイトリストに追加する方法の詳細については、「ネットワーク設定の設定」および「IPアドレスホワイトリストの設定」をご参照ください。
「データベースアクセス障害のトラブルシューティング方法?」を参照して、データベース接続障害のトラブルシューティングを行うことができます。