In Function Compute, you can use a function to call database APIs to insert or query data. In most cases, instance status is not shared among different execution environments in Function Compute. If you want to share instance status, you need to store structured data in a database. This topic describes how to deploy a function to access an ApsaraDB RDS for MySQL database by using Serverless Devs. Python 3 is used in this topic.

Prerequisites

  • Create an ApsaraDB RDS for MySQL instance
    Important
    • Make sure that the database instance that you create is in the same region as the function that needs to access the database instance.

    • We recommend that you create the database instance in a zone that Function Compute supports. For more information about the message routing feature, see Zones where Function Compute is available.

      If your database instance is not deployed in a zone that is supported by Function Compute, create a vSwitch in your VPC. The vSwitch must be in the same zone as Function Compute. In addition, you must specify the vSwitch ID in the VPC configuration of the specified service in Function Compute. vSwitches in the same VPC can communicate with each other over the private network. Therefore, Function Compute can use the vSwitch to access resources in VPCs that reside in other zones. For more information, see How can I resolve the "vSwitch is in unsupported zone" error?.

  • Create databases and accounts for an ApsaraDB RDS for MySQL instance
  • A table named users is created in the ApsaraDB RDS for MySQL instance.

    In this example, the s init command is used to query all data in the users table in the database. You must create the users table in advance.

Step 1: Configure the IP address whitelist for the database

Note Accessing a database by using a security group results in unstable connections of functions. To ensure that your business runs as expected, we recommend that you configure an IP address whitelist to access the database.
  1. Go to the Instances page. In the top navigation bar, select the region in which the RDS instance resides. Then, find the RDS instance and click the ID of the instance.
  2. In the left-side navigation pane, click Whitelists and SecGroup.
    On the Whitelist Settings tab, you can view the mode of the IP address whitelist.
    Note Existing RDS instances may run in enhanced whitelist mode. All new RDS instances run in standard whitelist mode.
  3. On the Whitelist Settings tab that appears, find the default whitelist group and click Modify.
  4. In the Edit Whitelist dialog box, configure IP Addresses and click OK.
    Important You must specify an IP address that belongs to the CIDR block of the vSwitch that you add when you configure the network for Function Compute.

Step 2: Deploy and debug the function

  1. Install Serverless Devs and Docker and add a key.
    For more information, see Install Serverless Devs and Docker and Add a key.
  2. Initialize a project.
    s init start-fc-mysql-python -d start-fc-mysql-python
  3. Access the project.
    cd start-fc-mysql-python
  4. Edit the s.yaml file.

    The following sample code provides a configuration example:

    edition: 1.0.0
    name: fcDeployApp
    access: "default"
    
    services:
      fc-db-mysql-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**** # The ID of the virtual private cloud (VPC) in which the database instance resides. 
              securityGroupId: sg-bp1j6knvj40yjn0g**** # The ID of the security group. 
              vswitchIds:
                - vsw-bp1lgecrqfslgji9b**** # Make sure that the CIDR block of the vSwitch is added to the whitelist of the database instance. 
          function:
            name: mysql
            description: visit mysql
            runtime: python3
            codeUri: ./code
            handler: index.handler
            memorySize: 256
            timeout: 60
            environmentVariables:
              MYSQL_HOST: rm-bp13d39n0m2s0****.mysql.rds.aliyuncs.com # The private IP address of the database instance. 
              MYSQL_PORT: 33** # The private port of the database instance. 
              MYSQL_USER: ni**** # The username of the database instance. 
              MYSQL_PASSWORD: Hangzhou**** # The password of the database instance. 
              MYSQL_DBNAME: django-**** # The database that is created on the database instance. 
  5. Run the following command to build the project:
    s build --use-docker
  6. Run the following command to deploy the project:
    s deploy -y
  7. Run the following command to invoke a function:
    s invoke -e "{}"

    Expected command output:

    [2021-09-10T14:35:27.747] [INFO ] [S-CLI] - Start ...
    ========= FC invoke Logs begin =========
    FC Invoke Start RequestId: b00ec6c1-1d12-4110-8299-bb5129a4fd0c
    2021-09-10T06:35:37.944Z b00ec6c1-1d12-4110-8299-bb5129a4fd0c [INFO] ('3', 'wan')
    FC Invoke End RequestId: b00ec6c1-1d12-4110-8299-bb5129a4fd0c
    
    Duration: 148.46 ms, Billed Duration: 149 ms, Memory Size: 256 MB, Max Memory Used: 32.21 MB
    ========= FC invoke Logs end =========
    
    FC Invoke Result:
    [
        "3",
        "wan"
    ]
    
    
    End of method: invoke

Sample code

Access a MySQL database in a Python runtime of Function Compute