背景
在云函数开发的过程中,我们难免碰到需要访问本地文件的需求(例如:为了通过ip地址获得城市名称,云函数需要检索近一百MB的ip地址库文件),由于云函数无状态的特性,自身并不与特定服务器和本地硬盘关联,而远程访问COS对象存储等方式,则面临将大文件下载到本地缓存中仅获取寥寥数行信息。这时,挂载CFS文件系统是一个较佳的选择。
下面以Node.js 12.16的云函数环境描述如何使用serverless.yml来配置CFS文件系统。
前置操作
在 serverless.yml 文件中设置如下配置:
代码语言:txt复制memorySize: 1024 # 由于ip地址库文件较大,提升内存的大小
代码语言:txt复制cfs:
- cfsId: cfs-xxxxxxxx # 文件系统实例 id
mountInsId: cfs-xxxxxxxx # 文件系统挂载点 id
localMountDir: /mnt/ # 本地挂载点,云函数目录
remoteMountDir: / # 远程挂载点,CFS 目录
向CFS中写入文件
代码语言:txt复制'use strict';
const fs = require('fs');
exports.main_handler = async (event, context) => {
await fs.promises.writeFile('/mnt/myfolder/myfile.txt', JSON.stringify(event));
return event;
};
node.js代码片段,将COS中的文件写入到CFS中
代码语言:txt复制'use strict';
const COS = require('cos-nodejs-sdk-v5')
const APPID = '130*******' // 请替换为您使用的腾讯云APPID
const SECRET_ID = '******' // 请替换为您的 SecretId
const SECRET_KEY = '******' // 请替换为您的 SecretKey
const REGION = 'ap-shanghai' // 我目前使用的都是ap-shanghai,如果后续有变化,请替换为您bucket所在的地域
const cosInst = new COS({
SecretId: SECRET_ID,
SecretKey: SECRET_KEY
});
exports.main_handler = async (event, context) => {
const bucketName = 'kanas';
const bucket = `${key}-${APPID}`;
const downloadPath = `/mnt/ipv4.ipdb`;
cosInst.getObject({
Bucket: bucket, /* 填入您自己的存储桶,必须字段 */
Region: REGION, /* 存储桶所在地域,例如ap-shanghai,必须字段 */
Key: 'ipv4.ipdb', /* 存储在桶里的对象键(例如1.jpg,a/b/test.txt),必须字段 */
Output: downloadPath,
}, function(err, data) {
console.log(err || data);
});
return event
};
参考文档:
云函数挂载 CFS 文件系统: https://cloud.tencent.com/document/product/583/46199
创建文件系统及挂载点: https://cloud.tencent.com/document/product/582/9132
在 Linux 客户端上使用 CFS 文件系统: https://cloud.tencent.com/document/product/582/11523
在云函数 SCF上使用 CFS: https://cloud.tencent.com/document/product/582/47148
云函数tencent-multi-scf配置:
https://github.com/serverless-components/tencent-multi-scf/blob/master/docs/configure.md