您可以参考本文提供的函数计算访问云数据库 Redis 版的操作指导,在函数中配置专有网络VPC相关信息并在数据库中配置白名单,实现VPC内的Redis数据库访问和操作。本文以Python 3为例,介绍如何使用Serverless Devs部署函数来访问Redis数据库。
前提条件
请确保您所创建的数据库实例与需要访问该数据库实例的函数在同一地域。
建议您在函数计算支持的可用区创建数据库实例。更多信息,请参见函数计算支持的可用区。
如果您的数据库实例不在函数计算支持的可用区内,可以通过在您的VPC环境中创建一个与函数计算相同可用区的vSwitch,并在函数计算的服务的VPC配置中设置此vSwitch ID。由于同一VPC内不同vSwitch之间私网互通,因此函数计算可以通过该vSwitch访问在其他可用区的VPC内的资源。具体步骤,请参见遇到vSwitch is in unsupported zone的错误怎么办?。
操作步骤
安装Serverless Devs和Docker,并添加密钥信息。
具体操作,请参见安装Serverless Devs工具及依赖和添加密钥信息。
执行以下命令初始化项目。
sudo s init
根据界面提示,依次选择阿里云厂商、快速创建模式和Python内置运行时,设置工程名称以及选择项目部署地域等,本文示例为在杭州地域下部署start-fc-redis-python项目。
执行以下命令进入项目。
cd start-fc-redis-python
根据实际情况修改目录文件。
编辑s.yaml文件,示例如下。
edition: 3.0.0 name: hello-world-app access: "default" vars: # 全局变量 region: "cn-hangzhou" resources: hello_world: component: fc3 # 组件名称 # actions: # 自定义执行逻辑,关于actions 的使用,可以参考:https://docs.serverless-devs.com/serverless-devs/yaml#%E8%A1%8C%E4%B8%BA%E6%8F%8F%E8%BF%B0actions 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-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**** # 数据库实例所在的VPC ID securityGroupId: sg-bp1el3hto8hhkdup**** # 安全组ID vSwitchIds: - vsw-bp18vwna9x79koh3q**** # 请确保该vSwitch对应的网段已配置到数据库实例访问白名单中 environmentVariables: REDIS_HOST: r-bp17w15ohdk7****.redis.rds.aliyuncs.com # 数据库实例的私网地址。 REDIS_PASSWORD: 15**** # 数据库实例的密码。 REDIS_PORT: 6379 # 数据库实例的私网端口。
重要请确保您为函数配置的交换机网段已添加到数据库实例访问白名单中。具体操作,请参见配置数据库访问IP地址白名单。
编辑index.py代码文件,示例如下,代码逻辑为从Redis中读取一个名称为counter的键的值,将其加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中名称为counter的键的值。
[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地址白名单
- 登录Redis管理控制台。
- 在顶部菜单栏的左上角,选择实例所属的地域。
- 在实例列表页,单击目标实例ID。
在实例详情页面的左侧导航栏,选择白名单配置,在白名单设置页签,找到目标白名单分组,单击右侧操作列的修改。
在弹出的修改白名单分组面板中,在组内白名单输入框输入目标实例绑定的vSwitch的IP地址段,然后单击确定。
更多信息
更多访问Redis数据库的示例,请参见函数计算Python访问Redis数据库。
关于如何查看函数计算配置的交换机信息以及如何在RDS MySQL数据库放行函数计算的交换机网段,请分别参见配置网络和设置IP白名单。
本文提供的示例代码,需要导入Redis客户端库,关于安装第三方依赖的步骤,请参见为函数安装第三方依赖。
如果您配置的vSwitch无法访问指定可用区,请参见遇到vSwitch is in unsupported zone的错误怎么办?。更多关于访问Redis数据库的异常案例,请参见常见报错。如果您遇到的异常问题还未解决,需要根据问题现象进行排查,详情请参见数据库访问失败的常见原因。