注:当前项目为 Serverless Devs 应用,由于应用中会存在需要初始化才可运行的变量(例如应用部署地区、服务名、函数名等等),所以不推荐直接 Clone 本仓库到本地进行部署或直接复制 s.yaml 使用,强烈推荐通过
s init
的方法或应用中心进行初始化,详情可参考部署 & 体验 。
使用函数计算+nas,自动解压上传到OSS指定前缀目录的zip文件,主要用于解压超过10G的单文件
使用该项目,您需要有开通以下服务:
服务 | 备注 |
---|---|
函数计算 FC | unzip解压函数部署在函数计算 |
对象存储 OSS | 待解压的zip文件和解压后的文件存放在对象存储 |
文件存储 NAS | 待解压的zip文件和解压后的文件工作目录位于 NAS |
推荐您拥有以下的产品权限 / 策略:
服务/业务 | 权限 | 备注 |
---|---|---|
函数计算 | AliyunFCFullAccess | 创建和更新 unzip 解压函数 |
OSS | AliyunOSSFullAccess | 创建或更新 unzip 解压函数的 OSS 触发器 |
硬盘挂载 | AliyunNASFullAccess | 待解压的zip文件和解压后的文件工作目录位于 NAS |
VPC | AliyunVPCFullAccess | 自动创建的 NAS 挂载点必须有 VPC, VPC 需要能自动创建 |
其它 | AliyunECSFullAccess | 函数计算 VPC config 需要有安全组,安全组需要能自动创建 |
- 🔥 通过 Serverless 应用中心 , 该应用。
- 通过 Serverless Devs Cli 进行部署:
- 安装 Serverless Devs Cli 开发者工具 ,并进行授权信息配置 ;
- 初始化项目:
s init unzip-oss-nas -d unzip-oss-nas
- 进入项目,并进行项目部署:
cd unzip-oss-nas && s deploy - y
原理如下图所示:
匹配解压规则的ZIP文件在上传到OSS后,会自动触发函数计算进行解压。函数的逻辑是将 OSS 上的 zip 包拉取到函数计算执行容器挂载的nas中进行解压上传, 文件解压完成后,会将 NAS 上的解压文件上传到OSS的指定目录中,最后清除 NAS 上的工作目录。
函数默认使用的配置CPU和内存配置为
16C32G
此模板只是一个临时性的解决方案,费用不如start-oss-zip模板,如果使用start-oss-zip模板有如下报错的话, 可以尝试使用此模板。
"errorMessage": "{'status': -2, 'x-oss-request-id': '', 'details': 'RequestError: [Errno 32] Broken pipe'}",
"errorType": "RequestError",
"stackTrace": [
[
"File \"/code/index.py\"",
"line 48",
"in wrapper",
"ret = func(*args, **kwargs)"
],
[
"File \"/code/index.py\"",
"line 135",
"in handler",
"bucket.put_object(newKey + name, file_obj)"
],
[
"File \"/var/fc/lang/python3/lib/python3.6/site-packages/oss2/api.py\"",
"line 518",
"in put_object",
"resp = self.__do_object('PUT', key, data=data, headers=headers)"
],
-
建议使用UTF-8或GB 2312编码命名您的文件或文件夹,否则可能会出现解压后的文件或文件夹名称出现乱码、解压过程中断等问题。
-
归档或冷归档类型的文件需先解冻再解压。
-
解压单个压缩包的最大时间是2小时,超过2小时未完成的任务会解压失败。
-
默认设置的函数执行时长为2h, 如果不满足需求, 自己直接调整函数的 timeout, 最大可到 24h
上面的示例, 解压保存回去的都还是本身触发函数的 OSS, 如果是保存到其他 OSS, 直接将 bucket.put_object(newKey + name, file_obj)
这样上传回 oss 的代码修改下即可, 比如:
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
dst_bucket_name = "xxx-bucket"
dst_bucket = oss2.Bucket(auth, endpoint, dst_bucket_name)
dst_bucket.put_object(newKey + name, file_obj)
您如果有关于错误的反馈或者未来的期待,您可以在 Serverless Devs repo Issues 中进行反馈和交流。如果您想要加入我们的讨论组或者了解 FC 组件的最新动态,您可以通过以下渠道进行:
微信公众号:serverless |
微信小助手:xiaojiangwh |
钉钉交流群:33947367 |