配置OSS文件系统

对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务。您可以通过为函数计算的服务配置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计费概述

    example-bucket

    Bucket 子目录

    设置Bucket中的子目录,必须为绝对路径。留空或设置为/表示挂载Bucket的根目录。

    /files

    OSS 访问地址

    选择Bucket后,默认选择该Bucket对应的访问地址。可以根据需要选择自定义地址,调整访问地址的值。关于各地域OSS服务的访问地址,请参见访问域名和数据中心

    说明
    • 如果选择与函数计算的服务相同地域的Bucket,建议使用OSS内网Endpoint作为访问地址。

    • 如果选择不同地域的Bucket,则必须使用OSS外网Endpoint作为访问地址,会产生一定的外网流出流量费用。

    默认地址

    函数本地目录

    设置函数运行环境中的本地目录,必须为/home/mnt/data的子目录。

    说明

    设置的函数本地目录不需要您手动创建,直接使用就可以。

    /mnt/oss

    函数本地目录权限

    选择Bucket挂载到函数运行环境中的本地目录后,该目录的访问权限。支持设置为只读读写权限。

    读写

    说明

    OSS挂载功能依赖服务的网络配置。当您的网络配置只允许函数访问VPC,即设置仅允许指定 VPC 调用函数允许函数访问公网时,如需使用OSS外网Endpoint,要求函数能够通过指定的VPC访问公网。具体操作,请参见配置固定公网IP地址

步骤二:创建函数并在代码中访问OSS挂载的目录文件

完成OSS挂载配置后,您可以通过以下步骤访问OSS挂载的目录下的文件内容,即可以用访问本地文件的方式访问OSS挂载目录下的文件。

  1. 创建函数页面,配置以下配置项,其他配置保持默认值,单击创建完成函数创建。

    • 创建函数方式:使用内置运行时创建

    • 基本设置:填写函数名称请求处理程序类型选择处理事件请求

    • 函数代码运行环境选择Python 3.10代码上传方式选择使用示例代码

  2. 在函数详情页面,单击函数代码页签,在代码编辑器中编写代码,然后单击部署代码

    本文以Python函数代码为例,示例代码如下。

    import os
    
    
    def handler(event, context):
        # 挂载目录
        mount_path = '/mnt/oss'
        
        # 列出挂载目录中的文件
        files = os.listdir(mount_path)
        print("Files in OSS mount:", files)  
        # 读取挂载目录中的某个文件
        file_path = os.path.join(mount_path, 'example.txt')
        if os.path.exists(file_path):
            with open(file_path, 'r') as file:
                content = file.read()
                print("Content of example.txt:", content)
        else:
            print("example.txt does not exist.")
        # 向挂载目录中写入文件
        write_path = os.path.join(mount_path, 'output.txt')
        with open(write_path, 'w') as file:
            file.write("Hello, OSS mount!")
            print("Wrote to output.txt in OSS mount.")
        
        return "Function execution completed."
      
    说明

    在上述代码中example.txt需要修改为您挂载的OSS目录下实际存在的文件名称。

  3. 代码部署成功后,单击函数代码页签的测试函数

    执行完成后,您可以在函数代码页签的下方查看执行结果。在日志输出页签下可以看到读取的OSS目录下example.txt文件的内容,同时在OSS控制台对应的挂载目录下可以看到写入的output.txt文件内容。

常见问题

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

请确认OSS访问地址、Bucket名称是否填写准确。

提示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说明

读取挂载的文件时,报错信息为Input/output error

请确认您配置的OSS Bucket的存储类型,其中存储类型为归档存储和冷归档存储时,存放到该Bucket的文件都是冻结状态,这类文件要解冻后才能正常访问。建议您配置的OSS Bucket存储类型为标准存储。

如何查看自己配置的函数本地目录下的文件?

  1. 您可以在函数详情页面,单击实例列表查看实例状态为运行中的列表,选择一个实例,单击该实例操作列的登录实例

    image

  2. 登录实例成功后,您就可以通过命令查看配置的函数本地目录下的文件信息。示例如下:

    image

函数实例内访问挂载点出现Transport endpoint is not connected

如果函数实例内存规格较低、内存用量较大等,可能导致OSS挂载功能因内存不足而不可用,产生上述错误。请根据业务情况调高函数内存规格,建议使用OSS挂载点时函数内存规格不低于512 MB。

函数目录下写入的数据能持久保存吗?

函数实例被销毁的时候,在函数目录下写入的数据也会被删除。如果您希望数据可以持久保存,建议您配置挂载。配置NAS文件系统挂载或者配置OSS挂载均可以让数据持久保存。具体操作请参见配置NAS文件系统配置OSS文件系统

如何通过权限策略仅允许只读访问指定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中可能无法实时查询到该文件。