对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务。函数计算支持与OSS无缝集成。您可以为函数计算的服务配置OSS挂载,配置成功后,该服务下的函数可以像使用本地文件系统一样使用OSS存储服务。

使用限制

  • 函数计算在同一地域下的一个服务最多支持配置5个NAS挂载点和5个OSS挂载点。
  • NAS挂载点和OSS挂载点设置的函数运行环境中的本地目录不能冲突。

关于配置NAS挂载点的更多信息,请参见配置NAS文件系统

前提条件

配置OSS挂载

函数计算的OSS配置为服务级别,为一个服务配置OSS挂载点后,此服务下的所有函数都可以访问指定OSS存储空间的文件。

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数
  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务操作列的配置
  3. 在编辑服务页面的存储配置区域,配置以下参数,然后单击保存
    • 挂载 OSS 对象存储:是否启用OSS文件系统。取值说明如下。
      • 启用:启用OSS文件系统。
      • 禁用:不启用OSS文件系统。
    • OSS挂载点:填写配置OSS挂载点的相关信息。
      • Bucket:选择已创建的存储空间Bucket。如需创建新的OSS存储空间,可以单击下方的创建新的 OSS Bucket跳转到对象存储控制台手动创建。关于使用OSS存储涉及的费用问题,请参见OSS计费概述
      • Bucket 子目录:设置Bucket中的子目录。留空或设置为/表示挂载Bucket的根目录。若不为空,Bucket子目录必须为绝对路径,且在Bucket中预先存在。可以登录对象存储控制台为Bucket创建目录
      • OSS 访问地址:选择Bucket后,默认选择该Bucket对应的访问地址。可以根据需要选择自定义地址,调整访问地址的值。关于各地域OSS服务的访问地址,请参见访问域名和数据中心
      • 函数本地目录:设置函数运行环境中的本地目录,必须为/home/mnt/data的子目录。
      • 函数本地目录权限:选择Bucket挂载到函数运行环境中的本地目录后,该目录的访问权限。支持设置为只读读写权限。
      说明
      • 如果选择与函数计算的服务相同地域的Bucket,建议使用OSS内网Endpoint作为访问地址。如果选择不同地域的Bucket,则必须使用OSS外网Endpoint作为访问地址,会产生一定的外网流出流量费用。关于OSS访问地址的格式,请参见访问域名和数据中心
      • OSS挂载功能依赖服务的网络配置。当您的网络配置只允许函数访问VPC,即设置允许访问 VPC允许函数访问公网时,如需使用OSS外网Endpoint,要求函数能够通过指定的VPC访问公网。具体操作,请参见配置固定公网IP地址

常见问题

提示OSS挂载失败,报错信息为bucket not found or bucket path does not exist

  • 请确认OSS访问地址、Bucket名称是否填写准确。
  • 请确认Bucket子目录是否填写准确,所指定目录是否在Bucket中预先存在。例如,若您指定Bucket子目录为/folderA/folderA/,则Bucket中必须存在Object folderA/。仅存在Object folderA(末尾无/)、folderA/file,或者folderA/folderB/均会报错。

提示OSS挂载失败,报错信息为host resolv errordeadline exceeded

请确认Endpoint地址是否填写准确。
  • Endpoint地址中的域名解析失败会导致host resolv error报错。
  • 内网Endpoint不可跨地域使用。使用其他地域的内网Endpoint作为访问地址时,会出现连接超时,导致deadline exceeded报错。

挂载失败,报错信息为invalid credentials

请确认您为服务配置的RAM角色是否具备访问OSS的权限,权限信息如下所示。更多信息,请参见授予函数计算访问其他云服务的权限
  • 只读:包括oss:ListObjectsoss:GetObject策略。
  • 读写:包括oss:ListObjectsoss:GetObjectoss:PutObjectoss:DeleteObjectoss:ListPartsoss:AbortMultipartUpload
说明 oss:ListObjects为Bucket级别操作。因此,当您为特定的Bucket开启访问时,权限策略中需要包含Bucket级别的资源指示,例如acs:oss:*:*:bucketName。更多信息,请参见OSS Resource说明

如何通过权限策略仅允许只读访问指定Bucket?

展开查看权限策略描述示例。请将示例中bucketName替换为指定的Bucket名称。更多信息,请参见RAM Policy概述

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListObjects",
        "oss:GetObject"
      ],
      "Resource": [
        "acs:oss:*:*:bucketName",
        "acs:oss:*:*:bucketName/*"
      ],
      "Effect": "Allow"
    }
  ]
}

如何通过权限策略允许读写访问指定Bucket?

展开查看权限策略描述示例。请将示例中bucketName替换为指定的Bucket名称。更多信息,请参见RAM Policy概述

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListObjects",
        "oss:GetObject",
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:AbortMultipartUpload",
        "oss:ListParts"
      ],
      "Resource": [
        "acs:oss:*:*:bucketName",
        "acs:oss:*:*:bucketName/*"
      ],
      "Effect": "Allow"
    }
  ]
}

如何通过权限策略仅允许只读访问指定Bucket的子目录?

展开查看权限策略描述示例。请将示例中bucketName替换为指定的Bucket名称,bucketPath替换为指定的Bucket子目录。更多信息,请参见RAM Policy概述

{
  "Version": "1",
  "Statement": [
    {
      "Action": "oss:ListObjects",
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName"
      ],
      "Condition": {
        "StringLike": {
          "oss:Prefix": [
            "bucketPath/*"
          ]
        }
      }
    },
    {
      "Action": [
        "oss:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName/bucketPath/*"
      ]
    }
  ]
}

如何通过权限策略允许读写访问指定Bucket的子目录?

展开查看权限策略描述示例。请将示例中bucketName替换为指定的Bucket名称,bucketPath替换为指定的Bucket子目录。更多信息,请参见RAM Policy概述

{
  "Version": "1",
  "Statement": [
    {
      "Action": "oss:ListObjects",
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName"
      ],
      "Condition": {
        "StringLike": {
          "oss:Prefix": [
            "bucketPath/*"
          ]
        }
      }
    },
    {
      "Action": [
        "oss:GetObject",
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:AbortMultipartUpload",
        "oss:ListParts"
      ],
      "Effect": "Allow",
      "Resource": [
        "acs:oss:*:*:bucketName/bucketPath/*"
      ]
    }
  ]
}

通过OSS挂载点写文件的过程中,从OSS侧观察文件为空。

通过OSS挂载点写文件时,一般情况下,系统只在用户主动调用Flush或者关闭文件时,才将写入内容上传至OSS侧。

在OSS挂载点中,执行压缩、解压或文件传输等操作时响应较慢。

OSS本身不支持文件系统API。当您将OSS Bucket挂载为目录之后,函数计算会组合封装OSS API,实现文件系统API的效果。例如,OSS本身不支持随机写,当您需要使用文件系统API变更OSS挂载点上现有的文件时,函数计算会将源文件从OSS全量下载并改写后重新上传到OSS。

当文件系统API与OSS API功能对应时,例如顺序的文件读写,通常操作执行的性能较好。而需要组合封装OSS API实现的操作,例如压缩、解压可能用到的文件随机读写操作,可能需与OSS进行多次交互,故性能略差于本地文件系统。

不同函数实例之间访问OSS挂载点会互相协调同步吗?

不同函数实例之间相互独立,不同实例中查询到的OSS挂载点内容可能不同。例如,通过函数实例A在OSS挂载点中创建文件F后,在函数实例B中可能无法实时查询到该文件。