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

前提条件

  1. 创建专有网络和交换机

    创建的交换机需要在函数计算支持的可用区内,函数计算支持的可用区信息请参见配置函数访问VPC内资源

  2. 创建RDS SQL Server实例

    创建数据库实例需要选择与函数计算相同的VPC实例。由于相同的VPC实例下不同可用区交换机内网是互通的,因此您可以配置和函数计算不同可用区的交换机。

  3. 设置白名单

    如果您通过设置白名单分组的方法来设置数据库白名单,则需要在设置过程中的组内白名单文本框中输入相应的VPC的IP网段。您可以登录VPC控制台,进入目标VPC的专有网络详情页查看VPC的IP网段。

  4. 创建安全组

    安全组出口方向必须放行数据库的端口和内网IP段。

编写函数(Python3)

以Python3开发语言的函数示例为例,介绍如何通过Funcraft工具编写函数访问数据库。

  1. 在本地建立一个目录,用于存放代码和依赖模块,在该目录下新建template.yml文件,例如/tmp/code/template.yml,示例内容如下。
    ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:
      service:
        Type: 'Aliyun::Serverless::Service'
        Properties:
          Description: This is SQL-Server service
          Policies:
            - AliyunECSNetworkInterfaceManagementAccess
          VpcConfig:
            VpcId: vpc-xxx
            VSwitchIds:
              - vsw-xxx
            SecurityGroupId: sg-xxx
          InternetAccess: true
        function:
          Type: 'Aliyun::Serverless::Function'
          Properties:
            Handler: 'index.handler'
            Runtime: python3
            Timeout: 10
            MemorySize: 128
            CodeUri: './'                            

    代码中的关键参数含义如下:

    • 声明了一个名为service的服务。
      • Policies:授予函数计算管理ECS弹性网卡的权限,实现函数服务访问已创建的VPC内的资源。
      • VpcConfig:为服务绑定已创建的VPC。您需要将以下参数值替换成自己的VPC相关信息:
        • VpcId:专有网络ID。
        • VSwitchIds:交换机ID。
        • SecurityGroupId:安全组ID。
    • 声明了一个名为function的函数。
      • Handler函数入口
      • Runtime:函数的运行环境。
      • CodeUri:代码包所在的目录。

        部署时,Funcraft会将CodeUri指定的目录打包上传。

  2. template.yml文件的同级目录下创建Funfile文件,示例内容如下。
    RUNTIME python3
    RUN fun-install pip install pymssql                 
  3. 执行fun install命令安装依赖。
    fun install
    当代码编辑器出现以下打印内容时,说明安装成功。
    Install Success
  4. template.yml文件的同级目录下新建代码文件,例如/tmp/code/index.py,示例内容如下。
    # -*- coding: utf-8 -*-
    import pymssql
    def handler(event, context):
    
        conn = pymssql.connect(host='rm-xxx.sqlserver.rds.aliyuncs.com',
                                    user='xxx',
                                    password='x'x'x'x',
                                    database='xxx',
                                    charset='utf8')
        cursor = conn.cursor()
        cursor.execute('SELECT * FROM inventory WHERE quantity > 152')
    
        result = ''
    
        for row in cursor:
            result += 'row = %r\n' % (row,)
        conn.close()
        return result                         
  5. 执行以下命令,使用Funcraft工具部署。
    fun deploy
    当代码编辑器出现以下打印内容时,说明部署成功。
            function <function-name> deploy success
    service <service-name> deploy success

    部署成功后,您可以登录函数计算控制台,在服务/函数页面看到刚部署的服务和函数。

编写函数(PHP7.2)

以PHP7.2开发语言的函数示例为例,介绍如何通过Funcraft工具编写函数访问数据库。

  1. 在本地建立一个目录,用于存放代码和依赖模块,在该目录下新建template.yml文件,例如/tmp/code/template.yml,示例内容如下。
    ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:
       service:
            Type: 'Aliyun::Serverless::Service'
            Properties:
              Description: This is SQL-Server service
              Policies:
                - AliyunECSNetworkInterfaceManagementAccess
              VpcConfig:
                VpcId: vpc-xxx
                VSwitchIds:
                  - vsw-x'x'x'x
                SecurityGroupId: sg-xxx
              InternetAccess: true
            function:
              Type: 'Aliyun::Serverless::Function'
              Properties:
                Handler: 'index.handler'
                Runtime: php7.2
                Timeout: 10
                MemorySize: 128
                CodeUri: './'
                EnvironmentVariables:
                  ODBCINI: /code/.fun/root/etc/odbc.ini
                  ODBCSYSINI: /code/.fun/root/opt/microsoft/msodbcsql17/etc                        

    代码中的关键参数含义如下:

    • 声明了一个名为service的服务。
      • Policies:授予函数计算管理ECS弹性网卡的权限,实现函数服务访问已创建的VPC内的资源。
      • VpcConfig:为服务绑定已创建的VPC。您需要将以下参数值替换成自己的VPC相关信息:
        • VpcId:专有网络ID。
        • VSwitchIds:交换机ID。
        • SecurityGroupId:安全组ID。
    • 声明了一个名为function的函数。
      • Handler函数入口
      • Runtime:函数的运行环境。
      • CodeUri:代码包所在的目录。

        部署时,Funcraft会将CodeUri指定的目录打包上传。

      • EnvironmentVariables:配置函数环境变量。
        • ODBCINI:指定加载odbc.ini文件的路径。
        • ODBCSYSINI:指定加载odbcinst.ini文件的路径。
  2. template.yml文件的同级目录下创建Funfile文件,示例内容如下。
    RUNTIME php7.2
    RUN apt-get update && apt-get install -y apt-transport-https apt-utils
    RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
    RUN curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list
    RUN fun-install apt-get install unixodbc-dev
    RUN fun-install apt-get install msodbcsql17                           
  3. 执行fun install命令安装依赖。
    $fun install         
    当代码编辑器出现以下打印内容时,说明安装成功。
    Install Success
  4. 修改根目录下odbc.ini文件,例如/tmp/code/odbc.ini。将文件中Driver的值修改为/code/.fun/root/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.5.so.1.1。
    说明 在PHP环境中如果需要使用pdo_sqlsrv扩展编译,请参见函数计算php runtime编译非内置的扩展
  5. template.yml文件的同级目录下新建代码文件,例如/tmp/code/index.php,示例内容如下。
    <?php
    function handler($event, $context)
    {
       try {
           $conn = new PDO("sqlsrv:Server=rm-xxx.sqlserver.rds.aliyuncs.com;Database=xxx","xxx","xxx");
           // set the PDO error mode to exception
           $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
           $conn->query("set names utf-8");
           $sql="SELECT * FROM inventory WHERE quantity > 152";
           $result = $conn->prepare($sql);
           $result->execute();
           print($result);
           return ("Connection successed.");
       } catch (PDOException $e) {
           return ("Connection failed: " . $e->getMessage());
       }
    }                          
  6. 执行以下命令,使用Funcraft工具部署。
    fun deploy                          
    当代码编辑器出现以下打印内容时,说明部署成功。
            function <function-name> deploy success
    service <service-name> deploy success

    部署成功后,您可以登录函数计算控制台,在服务/函数页面看到刚部署的服务和函数。

调试函数

部署成功后,您可以在函数计算控制台调试函数。

  1. 登录函数计算控制台
  2. 在顶部菜单栏,选择地域。
  3. 在左侧导航栏,单击服务/函数
  4. 找到目标服务下的目标函数,单击函数名称。
  5. 代码执行页签下,单击执行
    执行完成后您可以查看执行结果和执行日志。SQL-log