このトピックでは、仮想プライベートクラウド (VPC) 経由でFunction ComputeからApsaraDB RDS for MySQLデータベースへのアクセスを実装するためのガイダンスを提供します。 具体的には、ApsaraDB RDS for MySQLデータベースにアクセスし、関連する操作を実行するために、関数およびデータベースのホワイトリストで仮想プライベートクラウド (VPC) 関連の設定を設定できます。 このトピックでは、Serverless Devsを使用して、Python 3ランタイムでApsaraDB RDS for MySQLデータベースにアクセスする関数をデプロイします。
始める前に
ApsaraDB RDS for MySQLインスタンスの作成
重要作成するデータベースインスタンスが、データベースインスタンスにアクセスする必要がある関数と同じリージョンにあることを確認します。
Function Computeがサポートするゾーンにデータベースインスタンスを作成することを推奨します。 詳細については、「Function Computeが利用可能なゾーン」をご参照ください。
データベースインスタンスがFunction Computeでサポートされているゾーンにない場合、Function Computeと同じゾーンのVPCにvSwitchを作成し、関数のVPC設定でこのvSwitch IDを使用できます。 同じVPC内のvSwitchは、プライベートネットワークを介して相互に通信できます。 したがって、Function ComputeはvSwitchを使用して、他のゾーンにあるVPCのリソースにアクセスできます。 詳細については、「」をご参照ください。vSwitchがサポートされていないゾーンエラーが報告された場合はどうすればよいですか?
作成したデータベースにuserという名前のテーブルを作成します。
このトピックのindex.pyのサンプルコードのロジックは、ユーザーデータベーステーブル内のすべてのデータを照会することです。 したがって、事前にテーブルを作成する必要があります。
手順
Serverless DevsとDockerをインストールし、AccessKey情報を設定します。
詳細については、「Serverless Devsと依存関係のインストール」および「Serverless Devsの設定」をご参照ください。
次のコマンドを実行して、プロジェクトを初期化します。
sudo s init
CLIで、ベンダーとしてAlibaba Cloudを指定し、クイックスタートモードを指定し、組み込みのPythonランタイムを選択します。 プロジェクト名とプロジェクトがデプロイされるリージョンを設定します。 この例では、start-fc-mysql-pythonプロジェクトが中国 (杭州) リージョンにデプロイされています。
次のコマンドを実行して、プロジェクトディレクトリに移動します。
cd start-fc3-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-0t1m" description: 'hello world by serverless devs' runtime: "python3.9" code: ./code handler: index.handler memorySize: 128 timeout: 30 internetAccess: true vpcConfig: vpcId: vpc-bp11y195luy47h8c**** # The ID of the VPC in which the database instance resides. securityGroupId: sg-bp1el3hto8hhkdu**** # The security group ID. vSwitchIds: - vsw-bp116uemmj7fniub**** # Make sure that the CIDR block of the vSwitch is added to the whitelist of the database instance. environmentVariables: PYTHONPATH: /code/python MYSQL_HOST: rm-bp19j9og672d4****.mysql.rds.aliyuncs.com # The private endpoint of the database instance. MYSQL_PORT: "3306" # The private port of the database instance. MYSQL_USER: z***** # The database created in the database instance. MYSQL_PASSWORD: 1**** # The password of the account that is used to access the database instance. MYSQL_DBNAME: db**** # The name of the database created in the database instance.
重要関数用に設定したvSwitchのCIDRブロックがデータベースインスタンスのホワイトリストに追加されていることを確認します。 詳細については、「データベースのIPアドレスホワイトリストの設定」をご参照ください。
index.pyファイルを編集します。 次のコードスニペットは、例を示しています。 コードロジックは、ユーザーテーブル内のすべてのデータを照会します。
# -*- coding: utf-8 -*- import pymysql # You need to install the pymysql library first. import os import logging def handler(event, context): # Obtain the information used to connect the ApsaraDB RDS for MySQL database. In most cases, such information can be obtained by using environment variables or Key Management Service (KMS). db_host = os.environ['MYSQL_HOST'] db_port = int(os.environ['MYSQL_PORT']) db_user = os.environ['MYSQL_USER'] db_password = os.environ['MYSQL_PASSWORD'] db_name = os.environ['MYSQL_DBNAME'] # Establish a database connection. connection = pymysql.connect(host=db_host, port=db_port, user=db_user, password=db_password, db=db_name) try: with connection.cursor() as cursor: # Query all data records in the user table. sql = "SELECT * FROM user" cursor.execute(sql) result = cursor.fetchall() for row in result: print(f"User: {row}") except Exception as e: logging.error(f"Error occurred during database operation: {e}") finally: # Close the database connection. connection.close() return 'Finished querying the user table'
次のコマンドを実行してプロジェクトをビルドします。
sudo s build --use-docker
次のコマンドを実行して、プロジェクトをデプロイします。
sudo s deploy -y
次のコマンドを実行して、関数を呼び出します。
sudo s invoke -e "{}"
次のコードスニペットは、期待される出力を示しています。 返された結果は、ユーザーテーブルへのアクセスが成功したことを示します。
========= FC invoke Logs begin ========= FC Invoke Start RequestId: 1-65d2b4b4-1502c418-30faff838bec FC Invoke End RequestId: 1-65d2b4b4-1502c418-30faff838bec Duration: 35.37 ms, Billed Duration: 36 ms, Memory Size: 128 MB, Max Memory Used: 14.16 MB ========= FC invoke Logs end ========= Invoke instanceId: c-65d2b45f-15f440b6-a01ef0d32d36 Code Checksum: 8737553540873826675 Qualifier: LATEST RequestId: 1-65d2b4b4-1502c418-30faff838bec Invoke Result: Finished querying the user table > [hello_world] completed (0.25s)
データベースのIPアドレスホワイトリストの構成
IPアドレスホワイトリストを使用して、関数がデータベースにアクセスすることを許可します。 セキュリティグループモードを使用しないでください。 そうしないと、関数がデータベースへの接続に失敗し、ビジネスに影響を与えることがあります。
[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。
左側のナビゲーションウィンドウで、ホワイトリストとセキュリティグループ をクリックします。
ホワイトリストの設定 タブで、IPアドレスホワイトリストのモードを表示できます。
説明既存のRDSインスタンスは、拡張ホワイトリストモードで実行できます。 すべての新しいRDSインスタンスは標準ホワイトリストモードで実行されます。
ホワイトリスト設定タブで、デフォルトホワイトリストグループを見つけ、変更をクリックします。
ホワイトリストの編集ダイアログボックスでIPアドレスのコンテンツを変更し、OK をクリックします。
重要Function Computeで関数用に設定したvSwitchのCIDRブロックを入力します。
詳細情報
ApsaraDB RDS For MySQLデータベースへのアクセスの詳細については、「Function ComputeでのmysqlへのPythonアクセス」をご参照ください。
Function Computeで設定されたvSwichesに関する情報を表示し、Function Compute vSwichesのCIDRブロックをApsaraDB RDS For MySQLデータベースのホワイトリストに追加する方法の詳細については、「ネットワーク設定の設定」および「IPアドレスホワイトリストの設定」をご参照ください。
「データベースアクセス障害のトラブルシューティング方法?」を参照して、データベース接続障害のトラブルシューティングを行うことができます。