使用函数计算实现打包下载OSS文件

更新时间:
一键部署
我的部署

对象存储OSS支持函数计算服务,您可以借助函数计算快速构建任何类型的应用和函数,本文将介绍如何使用函数计算将对象存储OSS上多个文件(Object)打包下载到本地。

前提条件

  • 已开通函数计算。

    您可以在函数计算产品详情页开通函数计算。

  • 已授权函数计算访问OSS。

    具体步骤,请参见授予函数计算访问其他云服务的权限

  • OSS创建的bucket和应用函数需在同一个 region。

  • 已在某个Bucket的指定目录下上传多个文件。本教程以在华东1(杭州)地域的examplebucket下的dir目录中上传多个文件为例。具体步骤,请参见简单上传

方案概述

当您从OSS中批量下载Object时可能会遇到批量下载不方便、小文件较多时下载缓慢等问题。通过调用函数计算,可以将OSS上的Object先打包,然后将压缩包下载到本地后再解压,实现快速下载批量文件的目的。使用函数计算打包下载OSS文件的工作流程如下图所示。压缩OSS文件

  1. 用户调用函数,并指定存储空间及待压缩的文件。

  2. 函数计算从OSS中下载指定文件,并生成一个随机名称的ZIP压缩包。

  3. 函数计算将压缩包上传至OSS。

  4. 函数计算将ZIP包的下载地址返回给用户。

  5. 用户使用返回的长期有效的下载地址从OSS中下载文件。

使用说明

  • 函数运行环境的磁盘空间是有限的,所以采用流式下载和上传的方式,只在内存中缓存少量的数据。

  • 为了加快速度,函数计算在生成ZIP文件的同时将文件上传到OSS。

  • 上传ZIP文件到OSS时,利用OSS分片上传的特性,多线程并发上传。

  • 使用函数计算压缩文件时,最大处理时间是24小时(实验数据为57个文件,总大小1.06 GB,处理时间为63s)。

操作步骤

以下以通过函数计算将华东1(杭州)地域examplebucket中dir/目录下的多个文件打包下载到本地为例。

  1. 部署应用并获取对外公网域名。

    使用资源编排ROS一键部署

    您可以使用一键部署通过ROS快速部署函数计算应用。部署完成后,单击输出页签获取对外公网域名。

    使用Serverless应用中心一键部署

    1. 通过Serverless应用中心一键部署应用模板start-zip-oss。

      其中,部署类型选择直接部署,应用模板所在地域与Bucket所在地域保持一致,其他选项保留默认配置。配置详情如下图所示。1

    2. 获取对外公网域名。

      1. 单击结果页签。

      2. 在triggers字段获取对外公网域名(urlInternet)。

        2

    使用Serverless Devs命令行工具手动部署

    1. 安装Serverless Devs。

      curl -o- -L http://cli.so/install.sh | bash

      验证是否安装成功。

      s -v

      成功安装后的执行结果:

      @serverless-devs/s: 2.1.1, s-home: /root/.s, linux-x64, node-v14.19.3
    2. 配置Serverless Devs。

      s config add --AccessKeyID LTAI******** --AccessKeySecret  KZo1******** --access fc-access

      参数说明如下:

      参数

      说明

      --AccessKeyID

      访问函数计算服务的AccessKey ID。

      --AccessKeySecret

      访问函数计算服务的AccessKey Secret。

      --Access

      自定义密钥别名。

    3. 部署应用模板start-zip-oss。

      1. 初始化项目。

      2. s init start-zip-oss -d start-zip-oss
      3. 参考以下示例值完成各个配置项。

      4. 配置项

        示例值

        应用所在的地域

        cn-hangzhou

        应用所属的函数计算服务

        start-zip-oss

        应用的函数名称

        zip-oss-func

        应用所属的函数计算服务配置的RAM角色ARN

        acs:ram::137918634953****:role/test-role

      5. 进入项目。

      6. cd start-zip-oss
      7. 部署项目。

      8. s deploy -y
      9. 记录输出结果中返回的system_url。

      10. fc-zip-oss-service:
          region:   cn-hangzhou
          service:
            name: start-zip-oss
          function:
            name:       zip-oss-func
            runtime:    python2.7
            handler:    main.main_handler
            memorySize: 3072
            timeout:    1800
          url:
            system_url: https://zip-oss-func-start-zip-oss-ayouye****.cn-hangzhou.fcapp.run
          triggers:
            -
              type: http
              name: http-test
  2. 在您自己的服务器或阿里云ECS上执行以下命令生成event.json文件,并在文件中指定Bucket名称以及待下载的文件所在目录。

    cat <<EOF > event.json
    {
      "bucket": "examplebucket",
      "source-dir": "dir/"
    }
    EOF
    说明

    source-dir仅支持指定为Bucket下的某个目录,不支持指定为Bucket根目录。

  3. 请求示例如下。

    curl -v -L -o  oss.zip -d @./event.json https://zip-oss-func-zip-oss-ayouye****.cn-hangzhou.fcapp.run
    • /test/oss.zip:用于存放dir/目录下所有文件的本地路径。

    • https://zip-oss-func-zip-oss-ayouye****.cn-hangzhou.fcapp.run:表示start-zip-oss应用的对外公网域名。

    说明

    如果您需要将以上示例中的匿名非鉴权HTTP函数修改为鉴权HTTP函数,您可以通过以下任意一种语言的SDK进行调用:

常见问题

是否支持通过函数计算打包下载文件时对文件添加水印?

不支持。您可以通过以下方式对存储在OSS中文件增加水印文字或水印图片:

  • 对于公共读或者公共读写权限的文件

    在文件URL中添加水印参数。具体操作,请参见图片水印

  • 对私有权限的文件

    在SDK中添加图片处理参数或图片样式参数的方式添加水印。具体操作,请参见使用SDK处理图片

通过函数计算打包下载文件时是否支持生成带有时效性的文件下载地址?

不支持。如果您希望文件URL包含过期时间,您需要在URL中携带Expires参数。具体操作,请参见使用文件URL

更多参考