函数计算帮助修改OSS文件前缀

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
简介: ## 背景 在从七牛云迁移数据到阿里云OSS的时候,有遇到客户的文件名前缀是以`/`开始的,例如`/abc/123.jpg`。这样的文件名在OSS上面是非法的,所以如果直接使用在线迁移服务是无法迁移成功。一般建议的方案是添加一个前缀,例如变成`new/abc/123.jpg`,这样可以解决迁移不了的问题。但是这样会引发另外一个问题,就是导致用户的文件路径变更。对于用户来说,可能涉及到改代码,

背景

在从七牛云迁移数据到阿里云OSS的时候,有遇到客户的文件名前缀是以/开始的,例如/abc/123.jpg。这样的文件名在OSS上面是非法的,所以如果直接使用在线迁移服务是无法迁移成功。一般建议的方案是添加一个前缀,例如变成new/abc/123.jpg,这样可以解决迁移不了的问题。但是这样会引发另外一个问题,就是导致用户的文件路径变更。对于用户来说,可能涉及到改代码,是一个额外的迁移成本。本文提供一个间接的方案,利用函数计算的能力,当文件被复制到OSS后,自动修改文件的名称,达到无缝迁移。

原理

arch.png

利用在线迁移服务将七牛的数据迁移到OSS,注意OSS这边要加上前缀tmp
利用函数计算,当发现指定Bucket有新建文件并且文件名以tmp开始的话,触发函数计算功能。
函数负责将文件名的tmp去掉。这里利用了OSS的copy和delete操作。
整个过程在同一个Bucket中发生。

执行步骤

关于在线迁移服务的部分,参考官网手册,这里不再作详细论述。下面直接从函数计算的配置入手。

一. 进入函数计算业务,选择新建函数。
新建函数.jpg

二. 配置函数,填入服务/函数等名字,运行环境选择python3,其他按照默认。
配置函数.jpg

三. 建立好之后会跳转到在线编辑页面。
IDE.jpg

把下面的代码复制到编辑框里面,完整覆盖原来的代码并保存。

import logging
import oss2
import json

def handler(event, context):
  logger = logging.getLogger()
  logger.info('start of the function')

  creds = context.credentials
  #获取当前的ak和as
  auth=oss2.StsAuth(
         creds.access_key_id,
         creds.access_key_secret,
         creds.security_token)

  #获取旧的路径名
  evt = json.loads(event)
  evt = evt['events'][0]
  object_name = evt['oss']['object']['key']
  logging.info('path is ' + object_name)
  if object_name.startswith('tmp') == False :
    #不是tmp开头的不处理
    return
  #去除掉tmp/
  if object_name.startswith('tmp/') :
    new_object_name = object_name[4:]
  else :
    new_object_name = object_name[3:] 

  #获取到事件触发的bucket
  bucket_name = evt['oss']['bucket']['name']
  endpoint = 'oss-' +  evt['region'] + '.aliyuncs.com'
  bucket = oss2.Bucket(auth, endpoint, bucket_name)
  logging.info('bucket name is ' + bucket_name)

  #复制文件之后再删除原文件
  bucket.copy_object(bucket_name, object_name, new_object_name)
  bucket.delete_object(object_name)
  
  return

四. 创建一个触发器。选择对象存储触发器,触发器名称自行创建。Bucket列表注意选择准备要上传文件的那个Bucket。触发事件选择 oss:ObjectCreated:PostObjectoss:ObjectCreated:PutObject。触发规则前缀那里,一定要输入tmp如果没有加入这个前缀,可能会引起额外的调用
trigger.jpg

五. 配置好触发器之后,还需要做一个权限设置,否则即使任务触发成功,也会因为没有权限,函数无法将文件复制成功。回到主界面,选择服务配置,然后修改
进入角色配置.jpg

往下到权限配置,这里需要创建一个新的角色。这里需要选择把 AliyunOSSFullAccessAliyunLogFullAccess 添加进去。

赋予角色.jpg

role.jpg

六. 权限配置好之后,整个配置就完成了。如果需要做多个Bucket的迁移,只需要重复第4步,在同一个函数上面多建立几个触发器,监测不同的Bucket即可。

验证方式

通过网页的方式上传文件到到tmp/目录下面的文件,该文件会被移动到根目录。
通过网页的方式上传文件到根目录,如果名字是以tmp开始的,会被去掉tmp几个字符。

由于引入了函数计算,所以迁移任务最后会报失败。这只是因为迁移服务要比对的文件都被我们重命名了,所以产生这样的报告,只要确保迁移的文件数量一致即可

故障排查

如果网页方式上传无效,没有触发任何效果,可能是权限配置没有设置正确,返回第五步检查一下。
如果网页方式上传生效,但是在线迁移没有触发效果,可能是触发器中,触发事件配置不正确,返回第四步检查一下。

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
1月前
|
Java API 开发工具
如何用阿里云 oss 下载文件
阿里云对象存储服务(OSS)提供了多种方式下载文件,以下讲解下各种方式的下载方法
883 1
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
8天前
|
存储 数据可视化 安全
对象存储OSS产品常见问题之有几十亿个txt文件,单个4kb,使用oss如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
41 11
|
8天前
|
存储 监控 开发工具
对象存储OSS产品常见问题之python sdk中的append_object方法支持追加上传xls文件如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
38 9
|
24天前
|
存储 Cloud Native Serverless
云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
阿里云OSS对象存储方案利用函数计算FC,在不同终端请求时实时处理OSS中的原图,减少衍生图存储,降低成本。
|
1月前
|
分布式计算 DataWorks 关系型数据库
DataWorks报错问题之使用oss读取csv文件至odps 报错如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
PHP 开发工具 对象存储
PHP 使用 OSS上传文件
PHP 使用 OSS上传文件
5080 0
|
1月前
|
存储 安全 对象存储
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
本文详细介绍了怎样帮助新手小白从注册,购买阿里云OSS,到一步一步配置OSS做为图床,和PicGo、Typora软件连接,配置好关联之后,在使用Typora写文章时,如果需要插入图片,只需要将图片复制粘贴到Typora的编辑区域,就会自动通过PicGo上传到指定图床,自动复制外网能访问的URL并展示,简直不要太方便,极大的解决了编辑文章时复制处理图片链接的痛点。
174 2
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
|
2月前
|
对象存储
minio临时凭证直传切换到阿里云oss
minio临时凭证直传切换到阿里云oss
176 1
|
1天前
|
网络协议 对象存储
阿里云oss配置自有域名
阿里云oss配置自有域名
9 1