对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务。您可以通过为函数计算的服务配置OSS挂载,让服务下的函数使用OSS可以实现类似本地文件系统的操作体验,从而简化资源访问和数据处理流程。
使用限制
函数计算在同一地域下的一个服务最多支持配置5个NAS挂载点和5个OSS挂载点。
NAS挂载点和OSS挂载点设置的函数运行环境中的本地目录不能冲突。
关于配置NAS挂载点的更多信息,请参见配置NAS文件系统。
前提条件
对象存储OSS
函数计算
创建服务。具体操作,请参见创建服务。
为服务的角色配置权限。启用OSS挂载功能时,需要为函数计算服务配置访问OSS的角色。具体操作,请参见授予函数计算访问其他云服务的权限。
操作步骤
步骤一:配置OSS挂载
函数计算的OSS配置为服务级别,为一个服务配置OSS挂载点后,此服务下的所有函数都可以访问指定OSS存储空间的文件。
- 登录函数计算控制台,在左侧导航栏,单击服务及函数。
- 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务操作列的配置。
在编辑服务页面的存储配置区域,配置以下参数,然后单击保存。
配置项
说明
示例
挂载 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挂载目录下的文件。
在创建函数页面,配置以下配置项,其他配置保持默认值,单击创建完成函数创建。
创建函数方式:使用内置运行时创建。
基本设置:填写函数名称,请求处理程序类型选择处理事件请求。
函数代码:运行环境选择Python 3.10,代码上传方式选择使用示例代码。
在函数详情页面,单击函数代码页签,在代码编辑器中编写代码,然后单击部署代码。
本文以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目录下实际存在的文件名称。代码部署成功后,单击函数代码页签的测试函数。
执行完成后,您可以在函数代码页签的下方查看执行结果。在日志输出页签下可以看到读取的OSS目录下
example.txt
文件的内容,同时在OSS控制台对应的挂载目录下可以看到写入的output.txt
文件内容。
常见问题
提示OSS挂载失败,报错信息为bucket not found
。
请确认OSS访问地址、Bucket名称是否填写准确。
提示OSS挂载失败,报错信息为host resolv error
或deadline exceeded
。
请确认Endpoint地址是否填写准确。
Endpoint地址中的域名解析失败会导致
host resolv error
报错。内网Endpoint不可跨地域使用。使用其他地域的内网Endpoint作为访问地址时,会出现连接超时,导致
deadline exceeded
报错。
挂载失败,报错信息为invalid credentials
。
请确认您为服务配置的RAM角色是否具备访问OSS的权限,权限信息如下所示。更多信息,请参见授予函数计算访问其他云服务的权限。
只读:包括
oss:ListObjects
和oss:GetObject
策略。读写:包括
oss:ListObjects
、oss:GetObject
、oss:PutObject
、oss:DeleteObject
、oss:ListParts
和oss:AbortMultipartUpload
。
oss:ListObjects
为Bucket级别操作。因此,当您为特定的Bucket开启访问时,权限策略中需要包含Bucket级别的资源指示,例如acs:oss:*:*:bucketName
。更多信息,请参见OSS Resource说明。
读取挂载的文件时,报错信息为Input/output error
。
请确认您配置的OSS Bucket的存储类型,其中存储类型为归档存储和冷归档存储时,存放到该Bucket的文件都是冻结状态,这类文件要解冻后才能正常访问。建议您配置的OSS Bucket存储类型为标准存储。
如何查看自己配置的函数本地目录下的文件?
您可以在函数详情页面,单击实例列表查看实例状态为运行中的列表,选择一个实例,单击该实例操作列的登录实例。
登录实例成功后,您就可以通过命令查看配置的函数本地目录下的文件信息。示例如下:
函数实例内访问挂载点出现Transport endpoint is not connected
。
如果函数实例内存规格较低、内存用量较大等,可能导致OSS挂载功能因内存不足而不可用,产生上述错误。请根据业务情况调高函数内存规格,建议使用OSS挂载点时函数内存规格不低于512 MB。
函数目录下写入的数据能持久保存吗?
函数实例被销毁的时候,在函数目录下写入的数据也会被删除。如果您希望数据可以持久保存,建议您配置挂载。配置NAS文件系统挂载或者配置OSS挂载均可以让数据持久保存。具体操作请参见配置NAS文件系统和配置OSS文件系统。
如何通过权限策略仅允许只读访问指定Bucket?
如何通过权限策略允许读写访问指定Bucket?
如何通过权限策略仅允许只读访问指定Bucket的子目录?
如何通过权限策略允许读写访问指定Bucket的子目录?
通过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中可能无法实时查询到该文件。