您可以参考本文提供的函数计算访问云数据库 RDS SQL Server 版的操作指导,在函数中配置专有网络VPC相关信息并在数据库中配置白名单,实现VPC内数据库的访问和操作。本文以Python 3为例,介绍如何使用Serverless Devs部署函数来访问云数据库 RDS SQL Server 版。
前提条件
- 重要
请确保您所创建的数据库实例与需要访问该数据库实例的函数在同一地域。
建议您在函数计算支持的可用区创建数据库实例。更多信息,请参见函数计算支持的可用区。
如果您的数据库实例不在函数计算支持的可用区内,可以通过在您的VPC环境中创建一个与函数计算相同可用区的vSwitch,并在函数的VPC配置中设置此vSwitch ID。由于同一VPC内不同vSwitch之间私网互通,因此函数计算可以通过该vSwitch访问在其他可用区的VPC内的资源。具体步骤,请参见遇到vSwitch is in unsupported zone的错误怎么办?。
创建名为users的表。
本文index.py示例代码中代码逻辑为查询名为users的数据库表中的所有数据,因此,需要提前创建该表。
操作步骤
安装Serverless Devs和Docker,并添加密钥信息。
具体操作,请参见安装Serverless Devs工具及依赖和添加密钥信息。
执行以下命令初始化项目。
sudo s init
根据界面提示,依次选择阿里云厂商、快速创建模式和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: # 全局变量 region: "cn-hangzhou" resources: hello_world: component: fc3 # 组件名称,Serverless Devs 工具本身类似于一种游戏机,不具备具体的业务能力,组件类似于游戏卡,用户通过向游戏机中插入不同的游戏卡实现不同的功能,即通过使用不同的组件实现不同的具体业务能力 props: region: ${vars.region} # 关于变量的使用方法,可以参考: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**** # 数据库实例所在的VPC ID securityGroupId: sg-bp1el3hto8hhkdup**** # 安全组ID vSwitchIds: - vsw-bp116uemmj7fniubi**** # 请确保该vSwitch对应的网段已配置到数据库实例访问白名单中 environmentVariables: MSSQL_SERVER: rm-bp1gmz41ws982****.sqlserver.rds.aliyuncs.com # 数据库接入点 MSSQL_PORT: "1433" # 数据库端口 MSSQL_USER: sqlserver**** # 数据库用户名称 MSSQL_PASSWORD: z**** # 数据库用户密码 MSSQL_DATABASE: z**** # 数据库名称
重要请确保您为函数配置的交换机网段已添加到数据库实例访问白名单中。具体操作,请参见配置数据库IP访问白名单。
编辑index.py代码文件,示例如下,代码逻辑为查询数据库的名称为users的表中的所有数据。
# -*- coding: utf-8 -*- import logging import pymssql # 需先安装pymssql库 import os logger = logging.getLogger() # 创建数据库连接 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: # 查询user表的所有记录 cursor.execute("SELECT * FROM users") result = cursor.fetchone() logger.info(result) return result finally: # 关闭数据库链接 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实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏单击白名单与安全组。
在白名单设置页面,可查看当前的IP白名单模式。
说明较早创建的实例可能采用高安全模式。新创建的实例都采用通用白名单模式。
- 在默认显示的白名单设置页签,找到default白名单分组,在其右侧,单击修改。
- 在修改白名单分组对话框,修改组内白名单,单击确定。重要 此处填写的IP地址,需为在函数计算服务的网络配置中添加的vSwitch的IP段。
更多信息
更多访问RDS SQL Server数据库的示例,请参见函数计算Python访问SQL Server数据库。
关于如何查看函数计算配置的交换机信息以及如何在RDS MySQL数据库放行函数计算的交换机网段,请分别参见配置网络和SQL Server设置白名单。
如果您的数据库访问失败,需根据问题现象进行排查,详情请参见数据库访问失败的常见原因。