对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务。函数计算支持与OSS无缝集成。您可以为函数计算的服务配置OSS挂载,配置成功后,该服务下的函数可以像使用本地文件系统一样使用OSS存储服务。
使用限制
- 函数计算在同一地域下的一个服务最多支持配置5个NAS挂载点和5个OSS挂载点。
- NAS挂载点和OSS挂载点设置的函数运行环境中的本地目录不能冲突。
关于配置NAS挂载点的更多信息,请参见配置NAS文件系统。
前提条件
- 对象存储OSS
- 函数计算
- 创建服务。具体操作,请参见创建服务。
- 配置权限。启用OSS挂载功能时,需要为函数计算服务配置访问OSS的角色。具体操作,请参见授予函数计算访问其他云服务的权限。
配置OSS挂载
函数计算的OSS配置为服务级别,为一个服务配置OSS挂载点后,此服务下的所有函数都可以访问指定OSS存储空间的文件。
常见问题
提示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 error
或deadline exceeded
。
- Endpoint地址中的域名解析失败会导致
host resolv error
报错。 - 内网Endpoint不可跨地域使用。使用其他地域的内网Endpoint作为访问地址时,会出现连接超时,导致
deadline exceeded
报错。
挂载失败,报错信息为invalid credentials
。
- 只读:包括
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说明。
如何通过权限策略仅允许只读访问指定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中可能无法实时查询到该文件。