访问数据库是指在函数计算中通过函数调用数据库应用编程接口,对数据库执行数据插入、查询等操作。通常函数计算中不同的执行环境实例之间的状态是不共享的,通过数据库可以将结构化的数据持久化以实现状态共享。本文以Python 3为例,介绍如何使用Serverless Devs部署函数来访问MongoDB数据库。

前提条件

  • 创建适合业务需求的云数据库MongoDB实例:
    注意
    • 请确保您所创建的数据库实例与需要访问该数据库实例的函数在同一地域。

    • 建议您在函数计算支持的可用区创建数据库实例。

      如果您的资源所在的可用区不在以下列表中,可以通过在您的VPC环境中创建一个与函数计算相同可用区的vSwitch,并在函数计算的服务的VPC配置中设置此vSwitch ID。由于同一VPC内不同vSwitch之间私网互通,因此函数计算可以通过该vSwitch访问在其他可用区的VPC内的资源。具体步骤,请参见遇到vSwitch is in unsupported zone的错误怎么办?

      地域 地域ID 函数计算支持的可用区
      华东1(杭州) cn-hangzhou cn-hangzhou-f、cn-hangzhou-g、cn-hangzhou-h
      华东2(上海) cn-shanghai cn-shanghai-b、cn-shanghai-e、cn-shanghai-g、cn-shanghai-f
      华北1(青岛) cn-qingdao cn-qingdao-c
      华北2(北京) cn-beijing cn-beijing-h、cn-beijing-c、cn-beijing-e、cn-beijing-f
      华北3(张家口) cn-zhangjiakou cn-zhangjiakou-b、cn-zhangjiakou-a
      华北5(呼和浩特) cn-huhehaote cn-huhehaote-a、cn-huhehaote-b
      华南1(深圳) cn-shenzhen cn-shenzhen-e、cn-shenzhen-d
      西南1(成都) cn-chengdu cn-chengdu-a、 cn-chengdu-b
      中国香港 cn-hongkong cn-hongkong-c
      新加坡 ap-southeast-1 ap-southeast-1a、ap-southeast-1b
      澳大利亚(悉尼) ap-southeast-2 ap-southeast-2a、ap-southeast-2b
      马来西亚(吉隆坡) ap-southeast-3 ap-southeast-3a
      印度尼西亚(雅加达) ap-southeast-5 ap-southeast-5a、ap-southeast-5b
      日本(东京) ap-northeast-1 ap-northeast-1b、ap-northeast-1a
      英国(伦敦) eu-west-1 eu-west-1a
      德国(法兰克福) eu-central-1 u-central-a、eu-central-1a、eu-central-1b
      美国(硅谷) us-west-1 us-west-1a、us-west-1b
      美国(弗吉尼亚) us-east-1 us-east-1b、us-east-1a
      印度(孟买) ap-south-1 ap-south-1a、ap-south-1b
  • 创建名为test-db的数据库和名为fc_col的数据库集合。

    本文示例中,s init初始化的模板代码中的代码逻辑为向名为test-db的数据库的fc-col集合中插入一条文档数据;其中,test-db为环境变量MONGO_DATABASE的取值。

  • 安装Serverless Devs和Docker
  • 配置Serverless Devs
  • 创建安全组

    在数据库部署的VPC内创建一个默认的安全组。如果使用已有的安全组,请确保该安全组的出口方向已放行数据库的端口和私网IP段(一般来说都是默认允许所有访问)。

配置数据库访问IP地址白名单

MongoDB数据库支持设置IP地址白名单和安全组两种方式实现安全访问。推荐您使用设置IP地址白名单的方式来访问数据库,尽量避免使用设置安全组的方式。

说明 本文以分片集群实例为例。添加IP地址白名单的详细步骤,请参见设置白名单及安全组
  1. 登录云数据库MongoDB
  2. 在顶部菜单栏,选择地域。
  3. 在左侧导航栏,单击分片集群实例列表
  4. 分片集群实例列表页面,找到目标实例,并单击其名称。
  5. 在左侧导航栏,选择数据安全性 > 白名单设置
  6. 白名单设置页面,找到白名单分组名,在其操作列,单击更多图标,在下拉菜单中,选择手动修改
  7. 手动修改面板,按需填写IP地址,单击确定
    注意 此处填写的IP地址,需为在函数计算服务的网络配置中添加的vSwitch的IP段。

部署并调试函数

  1. 执行以下命令初始化项目。
    s init start-fc-mongodb-python -d start-fc-mongodb-python
  2. 执行以下命令进入项目。
    cd start-fc-mongodb-python
  3. 编辑s.yaml文件。

    示例如下:

    edition: 1.0.0
    name: fcDeployApp
    access: "default"
    
    services:
      fc-db-mongodb-python:
        component: devsapp/fc
        props:
          region: cn-hangzhou
          service:
            name: fc-db-demo
            description: 'demo for fc visit db'
            internetAccess: true
            vpcConfig:
              vpcId: vpc-bp1hcg467ekqsv0zr**** # 数据库实例所在的VPC ID。
              securityGroupId: sg-bp1j6knvj40yjn0g**** # 安全组ID。
              vswitchIds:
                - vsw-bp1lgecrqfslgji9b**** # 请确保该vSwitch对应的网段已配置到数据库实例访问白名单中。
          function:
            name: mongodb
            description: visit mongodb
            runtime: python3
            codeUri: ./code
            handler: index.handler
            memorySize: 256
            timeout: 60
            environmentVariables:
              MONGO_DATABASE: test-db # 数据库名称。
              MONGO_URL: mongodb://m****:Hang****@s-bp1a2d6c391e****.mongodb.rds.aliyuncs.com:37** # 数据库接入点。
  4. 执行以下命令构建项目。
    s build --use-docker
  5. 执行以下命令部署项目。
    s deploy -y
  6. 执行以下命令调用函数。
    s invoke -e "{}"

    预期输出如下:

    [2021-09-22T22:25:58.139] [INFO ] [S-CLI] - Start ...
    ========= FC invoke Logs begin =========
    FC Invoke Start RequestId: b361814a-0a70-4511-8212-6739389d3ca4
    find documents:{'_id': ObjectId('614b3ccea90d5fbfc262e918'), 'DEMO': 'FC', 'MSG': 'Hello FunctionCompute For MongoDB'}
    FC Invoke End RequestId: b361814a-0a70-4511-8212-6739389d3ca4
    
    Duration: 61.27 ms, Billed Duration: 62 ms, Memory Size: 256 MB, Max Memory Used: 51.21 MB
    ========= FC invoke Logs end =========
    
    FC Invoke Result:
    {'_id': ObjectId('614b3ccea90d5fbfc262e918'), 'DEMO': 'FC', 'MSG': 'Hello FunctionCompute For MongoDB'}
    
    
    End of method: invoke

更多信息

函数计算访问数据库案例集