访问MongoDB示例

您可以参考本文提供的函数计算访问云数据库 MongoDB 版的操作指导,在函数中配置专有网络VPC相关信息并在数据库中配置白名单,实现VPC内数据库的访问和操作。本文以Python 3为例,介绍如何使用Serverless Devs部署函数来访问云数据库 MongoDB 版

前提条件

  • 创建适合业务需求的云数据库MongoDB实例:

    重要
    • 请确保您所创建的数据库实例与需要访问该数据库实例的函数在同一地域。

    • 建议您在函数计算支持的可用区创建数据库实例。更多信息,请参见函数计算支持的可用区

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

  • 创建名为test-db的数据库和名为fc_col的数据库集合。具体操作,请参见创建数据库和集合并写入数据

    本文index.py示例代码中的代码逻辑为向名为test-db的数据库的fc-col集合中插入一条文档数据。

操作步骤

  1. 安装Serverless Devs和Docker,并添加密钥信息。

  2. 执行以下命令初始化项目。

    sudo s init

    根据界面提示,依次选择阿里云厂商、快速创建模式和Python内置运行时,设置工程名称以及选择项目部署地域等,本文示例为在杭州地域下部署start-fc-mongodb-python项目。

    image

  3. 执行以下命令进入项目。

    cd start-fc-mongodb-python
  4. 根据实际情况修改目录文件。

    • 编辑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:      
             MONGO_DATABASE: test-db # 数据库名称
             MONGO_URL: mongodb://username:password@d-bp1b05cac9df0dd****.mongodb.rds.aliyuncs.com:37**  # 数据库接入点,其中username和password为数据库的用户名和密码,如果用户名和密码中包含特殊字数,需按照RFC 3986标准进行转义
             
      重要

      请确保您为函数配置的交换机网段已添加到数据库实例访问白名单中。具体操作,请参见配置数据库访问IP地址白名单

    • 编辑index.py代码文件,示例如下,代码逻辑为向名称为test-db的数据库的fc-col集合中插入一条文档数据。

      # -*- coding: utf-8 -*-
      import os
      from pymongo import MongoClient   # 需先安装pymongo库
      
      
      def handler(event, context):
          dbName = os.environ['MONGO_DATABASE']
          url = os.environ['MONGO_URL']
      
          client = MongoClient(url)
      
          col = client[dbName]['fc_col']
          col.insert_one(dict(DEMO="FC", MSG="Hello FunctionCompute For MongoDB"))
          doc = col.find_one(dict(DEMO="FC"))
          print('find documents:' + str(doc))
          return str(doc)
  5. 执行以下命令构建项目。

    sudo s build --use-docker
  6. 执行以下命令部署项目。

    sudo s deploy -y
  7. 执行以下命令调用函数。

    sudo s invoke -e "{}"

    预期输出如下,以下返回结果表示已成功向MongoDB数据库插入一条数据。

    ========= FC invoke Logs begin =========
    FC Invoke Start RequestId: 1-65d30578-1586adb3-4d0f099c1ada
    find documents:{'_id': ObjectId('65d2faef467c916ed6401a73'), 'DEMO': 'FC', 'MSG': 'Hello FunctionCompute For MongoDB'}
    FC Invoke End RequestId: 1-65d30578-1586adb3-4d0f099c1ada
    
    Duration: 161.75 ms, Billed Duration: 162 ms, Memory Size: 256 MB, Max Memory Used: 34.44 MB
    ========= FC invoke Logs end =========
    
    FC Invoke instanceId: c-65d304d7-15f440b6-20443f00e921
    
    FC Invoke Result:
    {'_id': ObjectId('65d2faef467c916ed6401a73'), 'DEMO': 'FC', 'MSG': 'Hello FunctionCompute For MongoDB'}
    
    
    End of method: invoke

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

重要

请使用设置IP地址白名单方式授权函数访问数据库,请勿使用安全组方式。否则,可能导致函数偶尔连接不上数据库的情况,影响业务正常运行。

本文以分片集群实例为例。

  1. 登录云数据库MongoDB

  2. 在顶部菜单栏,选择地域。

  3. 在左侧导航栏,单击分片集群实例列表

  4. 分片集群实例列表页面,找到目标实例,并单击其名称。

  5. 在左侧导航栏,选择数据安全性 > 白名单设置

  6. 白名单设置页面,找到白名单分组名,在其操作列,单击更多图标,在下拉菜单中,选择手动修改

  7. 手动修改面板,按需填写IP地址,单击确定

    重要 此处填写的IP地址,需为在函数计算服务的网络配置中添加的vSwitch的IP段。

更多信息