SCF无服务器云函数应该会成为未来发张趋势,那么就现在而言有哪些应用呢?

HXD3C0134HXD3C0134提问于
萌萌呆想玩游戏却不知道这么开机的吃瓜少年。回答于
推荐

可以用 SCF 无服务器云函数定时备份数据库

mysqldump 准备

常用来导出数据库备份数据的的 mysqldump 工具,在云函数中也同样能使用;但是由于云函数环境并未内置 mysqldump,因此我们要自行打包工具。

通过 mysql 社区版下载地址,选择操作系统为 Linux - geneic,选择操作系统版本为 (x86,64-bit),下载 tar.gz 压缩包并存储在本地。下载完成后,解压压缩包,可以看到解压后的文件夹内包含有 bin、lib 等目录;而我们要找到的 mysqldump 工具就在 bin 目录下。同时可以看到 bin 目录下还有 libcrytpo.so.1.0.0 和 libssl.so.1.0.0 两个动态库。这两个库也是工具在运行时所要依赖的库,但在 bin 下的这两个文件实际为文件链接,实际指向分别是 ../lib/libcrypto.so.1.0.0 和 ../lib/libssl.so.1.0.0,因此这两个真实文件是在 lib 目录下。因此,为了确保

mysqldump 工具可以运行成功,我们将 bin 目录下的 mysqldump 文件拷贝到我们提前准备的项目根目录下,同时将 lib 目录下的 libcrypto.so,libcrypto.so.1.0.0,libssl.so,libssl.so.1.0.0 四个文件也拷贝到项目根目录下。

由于拷贝出来的 mysqldump 和 so 动态库文件是 Linux 版本,如果需要验证可用性,我们可以将准备好的项目目录拷贝到一台 Linux 服务器上,通过运行 mysqldump 命令验证工具的可用性。

./mysqldump -h {host} -P {port} -u{user} -p{password} {dbName} > dump.sql

使用如上命令,就可以将数据库内某一个具体的库导出到对应的 sql 文件内,我们可以通过命令运行时的输出,和导出文件的内容,判断是否运行成功。

云函数准备

接下来,我们来准备好需要定时运行的云函数。此处云函数的主要功能,就是在每一次运行时,调用上一步骤中我们准备好的 mysqldump 工具,来连接远程数据库并在本地生成 dump 文件。由于云函数的本地环境中不提供持久存储,生成的 dump 文件,需要上传到对象存储中做持久化,并在所需要的时候可以下载使用。

我们在这里使用 python 2.7 作为开发语言,在项目根目录下创建 index.py 文件,并在文件内输入如下内容并保存。

#coding=utf-8

import os
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import logging
import time

logging.basicConfig(level=logging.INFO, stream=sys.stdout)


DB_HOST = os.getenv('dbhost') #'sh-cdb-irye027y.sql.tencentcdb.com'
DB_PORT = os.getenv('dbport') #'63374'
DB_USER = os.getenv('dbuser') #'root'
DB_USER_PASSWORD = os.getenv('dbpwd') #'abc123!@#'
DB_NAME = os.getenv('dbname') #'cAuth'

BACKUP_PATH = '/tmp'

SECRET_ID = os.getenv('secretid') #'AKIDQm6iUh2NJ6jL41tVUis9KpY5Rgv49zyC'
SECRET_KEY = os.getenv('secretkey') #'xxxlbNyQo4EMJ5jPGA7sUvHWaSAlxxxxx'
REGION = os.getenv('cosregion') #'ap-shanghai'
BACKUP_BUCKET = os.getenv('cosbucket') #"dbbackup-1253970226"

config = CosConfig(Secret_id=SECRET_ID, Secret_key=SECRET_KEY, Region=REGION, Token="")
client = CosS3Client(config)


def backup2cos(file, bucket, key):
    response = client.put_object_from_local_file(
        Bucket=bucket,
        LocalFilePath=file,
        Key=key,
    )
    print(response)
    return response

def main_handler(event, context):
    timestr = time.strftime('%Y%m%d-%H%M%S', time.localtime(time.time()))
    db = DB_NAME
    filename = db+"-"+timestr+".sql"
    filepath = BACKUP_PATH+os.sep+filename
    print "Start Backup"
    dumpcmd = "./mysqldump -h " + DB_HOST + " -P " + DB_PORT + " -u" + DB_USER + " -p'" + DB_USER_PASSWORD + "' " + db + " > " + filepath
    print dumpcmd
    print os.popen(dumpcmd).read()
    print "Backup script completed"
    print "Your backups has been created in '" + filepath + "' file"
    print os.popen('ls -l /tmp').read()
    print "finish backup"
    print "start send to cos"
    backup2cos(filepath,BACKUP_BUCKET,"/"+filename)
    print "finish send to cos"

if __name__ == "__main__":
    main_handler("","")

在代码中,我们使用到了 COS 的 v5 版本 sdk 进行备份后的文件上传操作,因此我们需要安装好依赖便于脚本调用。我们可以在项目根目录通过执行 pip install cos-python-sdk-v5 -t . 命令,来将 cos 的 python sdk 以及相关依赖安装到项目目录中。

云函数打包及创建

在我们完成以上几部操作以后,我们在项目目录里有了 mysqldump 工具及依赖的 so 库,有了 cos sdk 及依赖包,以及我们的入口函数文件 index.py。接下来我们就需要将项目文件打包为 zip 格式以便上传至云函数,完成函数创建。

部署包打包

由于项目目录下的 mysqldump 工具作为二进制程序,需要在云函数的环境中运行,因此需要具有可执行权限,需要在 Linux 或 Mac 环境下为此文件赋予可执行权限后再打包,因此建议在 Linux 或 Mac 环境下执行打包。

我们可以将项目目录放置到 Linux 或 Mac 环境下后,通过在项目目录下执行 chmod +x mysqldump 命令,为 mysqldump 工具附加上可执行权限。

完成附加权限后,可以继续在根目录下通过执行 zip mysqldump.zip * 命令,将所有文件打包到 mysqldump.zip 内,生成可以用于创建函数的 zip 包。

创建及配置函数

通过如上步骤创建的 zip 包,由于体积稍大,需要通过对象存储 COS 的方式上传。因此我们先准备好 COS 的存储桶。我们需要在特定地域创建两个存储桶,一个用于上传及更新函数代码使用,一个用于存储备份的 mysql dump 文件。两个存储桶分别命名为 codefile 和 dbbackup。

然后我们将上一步创建的 zip 包,上传到 codefile 根目录中,作为函数创建时的代码来源。

接下来。我们开始创建函数,在特定地域下创建名为 mysqldump 的函数,运行环境选择为 python2.7,超时时间可配置为 60 秒。接下来上传代码的位置,选择为从 COS 上传代码,选择 codefile 存储桶,并指定代码文件为 /mysqldump.zip,同时入口函数为 index.main_handler,与 index.py 文件中的 main_handler 函数对应。

同时,由于我们代码中的数据库相关配置,COS 读写相关配置,均从环境变量中读取的,因此我们也需要对函数配置上所需的环境变量,配置包括 dbhost,dbport,dbuser,dbpwd,dbname,secretid,secretkey,cosregion,cosbucket 的环境变量对应的值,使用具体的数据连接信息以及对应的 COS 读写认证相关的信息。

配置完成后,我们就完成了函数的创建。

测试及启动函数

完成函数创建后,我们就可以来测试下函数的运行情况,并完成最终的定时触发配置。

通过控制台右上角的测试按键,我们可以直接触发函数的运行。通过函数的输出日志,我们可以查看代码的运行情况,检查 dump 文件是否生成正常,是否成功上传到 COS 存储桶中。同时我们也可以到对应的备份存储桶中,查看生成的文件,检查是否数据正确,备份正常。

确认函数测试运行正常后,我们就可以在触发器中,为函数新增一个定时触发器了。我们可以根据自身需要,配置为每天,或每12小时,或每月的指定时间运行。定时触发器可以按 crontab 格式编写触发时间,既可以按一定时间周期,也可以指定具体时间运行。

回答过的其他问题

如何使用Serverless框架?

萌萌呆想玩游戏却不知道这么开机的吃瓜少年。
我说一个比较新颖的,使用 Serverless 进行 AI 预测推理 模型准备 在这里我们使用 TensorFlow 中的 MNIST 实验作为案例来进行下面的介绍。MNIST 是一个包含了 6 万训练图片和 1 万测试图片的手写数字图片集合,图片为 28x28-pixel 大小...... 展开详请

如何从零开始搭建一款小程序?

萌萌呆想玩游戏却不知道这么开机的吃瓜少年。
说到小程序,不得不提小游戏,那么如何从零快速搭建小游戏呢?什么是小游戏? 从普通用户的视角看,小游戏是小程序的一个子类目,可在微信内被便捷的获取和传播,即点即玩,具备出色的用户体验。小游戏是小程序,普通用户分不清也无需分清。 同时,从开发者的视角,它可以看作是基于 Canvas/...... 展开详请

如何解决LinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.createFileWithMode0(Ljava/lang/String;JJJI)Ljava/io/FileDescriptor?

萌萌呆想玩游戏却不知道这么开机的吃瓜少年。

腾讯智能钛机器学习平台是免费的吗?

萌萌呆想玩游戏却不知道这么开机的吃瓜少年。

在自闭标签之前在自闭合标签中添加空格

萌萌呆想玩游戏却不知道这么开机的吃瓜少年。
也许有点混乱,设置是在“HTML”代码样式下,而不是IntelliJ中的JS代码样式。 在首选项 - >编辑器 - >代码样式 - > HTML中启用“空标记”设置。 当您进行显式重新格式化时,将添加空间。要确保在自动完成React组件时添加空间,请在首选项 - >编辑器 -...... 展开详请

如何在JavaFX中的所有表单元格上设置工具提示?

萌萌呆想玩游戏却不知道这么开机的吃瓜少年。
已采纳
设置表后(即创建并添加列,并在所有列上设置单元工厂),可以“装饰”列的单元工厂: private <T> void addTooltipToColumnCells(TableColumn<TableDataType,T> column) { Callback<Tabl...... 展开详请

扫码关注云+社区

领取腾讯云代金券