基于对象存储(OSS)的函数计算模板详解(一)

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
函数计算FC,每月15万CU 3个月
简介: 阿里云函数计算为了降低开发者使用难度,推出了大量实用的模板供给用户使用,每个模板都提供一段业务示例逻辑代码,能大大降低用户使用门槛。下面来详细讲解每个模板的使用方法和内容。

阿里云函数计算为了降低开发者使用难度,推出了大量实用的模板供给用户使用,每个模板都提供一段业务示例逻辑代码,能降低用户使用门槛。下面来详细讲解基于对象存储的几个常用模板的使用方法和内容,更多模板详见

引用步骤,进入函数计算控制台后,选择新建函数,在搜索框里填写OSS会自动检索出跟OSS相关的模板,目前系统内置了8个跟OSS相关的模板。

6332cb0834dc1da9369a3089c2c23923f66733dc

关于函数计算和OSS操作的模板,目前系统内置提供了8个模板,分别解决的问题有:把OSS数据同步备份到其他地方、获取对象的meta信息,获取OSS文件的MD5值、爬虫系统、图像识别、对OSS上的文件打包压缩、以及获取对象的详细信息等。今天讲解其中3个常用业务模板。

模板概述

阿里云函数计算模板主要包含三部分内容,模板详情描述、模板引用资源授权(部分不使用其他产品资源不需要授权)、模板示例代码。操作流程如下:

2beb75b0d583db144da8e6af67402478938daf62

新建函数-》引用模板创建-》给模板引用的资源授权(选填,有些模板不需要引用外置的资源)-》获取代码示例。

模板一:get-oss-md5-python27(获取对象存储文件的MD5值)

通过该模板的示例代码,可以计算出对象存储(OSS)文件的MD5值,本示例的代码通过流式方式读取对象文件,计算的效率较高。基于数据访问安全考虑,需要授权某bucket给函数计算来使用,通过函数计算的引导页面可以完成。

模板详情:通过模板详情可以获取到模板的详细情况,例如输入参数,输出参数等。详细引用查看这里。模板详情里会包括示例说明,输入参数,输出参数,以及需要哪些授权等,下面的模板同。

附录几张界面截图:

c632483cd12ef848b3b96e760d8072fb902d33f1

模板授权:基于数据访问安全考虑,需要授权某bucket给函数计算来使用。

86cc38ffdaee19dd7ff2bb3b7d02659a1ee44677

授权页面设置,本示例只需要选择某个Bucket授权即可。


代码详解:采用流式方式来读取文件的MD5值,其中creds = context.credentials是获取系统生成的临时AK来作为执行的认证。

# coding=utf-8
import json
import logging
from hashlib import md5
import oss2
 # 函数服务主函数
def handler(event, context):
    logger = logging.getLogger()
    logger.info('start worker')
    evt = json.loads(event)
    endpoint = 'oss-{}-internal.aliyuncs.com'.format(context.region)
    creds = context.credentials #获取系统生成的临时AK
    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
    bucket_name = evt['bucket']
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    object_name = evt['object']
    r = bucket.get_object(object_name)
    m = md5()
    while 1:
        data = r.read(4096)
        if not data:
            break
        m.update(data)

return m.hexdigest()


模板二:copy-oss-object-python27(同步备份OSS增量数据)

通过该模板的示例代码,可以把指定某个Bucket下的文件备份到其他资源,示例代码是备份到七牛存储上,也可以修改示例代码,把文件存储到本地硬盘或者某个服务上。对于大文件同步本示例文档对大文件备份做了优化,授权方式跟模板一介绍的一致,需要授权使用。

# -*- coding: utf-8 -*-
from qiniu import Auth, put_file, etag, urlsafe_base64_encode
import qiniu.config
import oss2
import json
def handler(event, context):
    """
    Replicate the object from OSS to qiniu.
    event:   The OSS event json string. Including oss object uri and other information.
    context: The function context, including credential and runtime info.
             For detail info, please refer to https://help.aliyun.com/document_detail/56316.html#using-context
    """
    evt_list = json.loads(event)
    creds = context.credentials
    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)

    # Parse the event to get the source object info.
    evt = evt_list['events'][0]
    bucket_name = evt['oss']['bucket']['name']
    endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    object_name = evt['oss']['object']['key']

    # Download the oss object.
    remote_stream = bucket.get_object(object_name)
    if not remote_stream:
        raise RuntimeError('failed to get oss object. bucket: %s. object: %s' % (bucket_name, object_name))
    print 'download object from oss success: %s' % object_name

    # replicate to qiniu
    qiniu_ak_id = 'XXXX'
    qiniu_ak_secret = 'XXXX'
    qiniu_bucket_name = 'XXX'
    q = Auth(qiniu_ak_id, qiniu_ak_secret)
    qiniu_token = q.upload_token(qiniu_bucket_name, object_name, 1200)
    ret, info = qiniu.put_data(qiniu_token, object_name, remote_stream)
    if ret is None:
        print info
    else:
        print 'replicate to qiniu success: %s' % object_name

    # TODO: Verify the checksum
# TODO: Handle the error


模板三:oss-download-zip-upload(下载OSS对象并打压缩包)

通过该模板示例,您可以完成从OSS某个Bucket中下载图片,对图片进行打包(ZIP),并把打包后的ZIP文件上传到某Bucket中操作。注意该函数对应的Service的角色访问策略需要读写OSS的权限。

import os
import oss2
import zipfile
import shutil
import time

def handler(event, context):
    creds = context.credentials
    auth = oss2.StsAuth(creds.accessKeyId, creds.accessKeySecret, creds.securityToken)
    bucket = oss2.Bucket(auth, 'your endpoint', 'your buecket name')
    #your source list
    sourceFile = ['resource/1.jpg','resource/2.jpg']
    #zip name
    uid = 'ZIP123456'
    tmpdir = '/tmp/download/'
    
    os.system("rm -rf /tmp/*")
    os.mkdir(tmpdir)
       
    #download
    for name in sourceFile :
        millis = int(round(time.time() * 1000))
        bucket.get_object_to_file(name , tmpdir + str(millis) + '.jpg')
    
    #zip file
    zipname = '/tmp/'+uid + '.zip'
    make_zip(tmpdir , zipname)

    #upload
    total_size = os.path.getsize(zipname)
    part_size = oss2.determine_part_size(total_size, preferred_size = 128 * 1024)

    key = uid + '.zip'
    upload_id = bucket.init_multipart_upload(key).upload_id
 
    with open(zipname, 'rb') as fileobj:
        parts = []
        part_number = 1
        offset = 0
        while offset < total_size:
            num_to_upload = min(part_size, total_size - offset)
            result = bucket.upload_part(key, upload_id, part_number,oss2.SizedFileAdapter(fileobj, num_to_upload))
            parts.append(oss2.models.PartInfo(part_number, result.etag))
            offset += num_to_upload
            part_number += 1
            
        bucket.complete_multipart_upload(key, upload_id, parts)
        
	return total_size


def make_zip(source_dir, output_filename):
    zipf = zipfile.ZipFile(output_filename, 'w')    
    pre_len = len(os.path.dirname(source_dir))
    for parent, dirnames, filenames in os.walk(source_dir):
        for filename in filenames:
            pathfile = os.path.join(parent, filename)
            arcname = pathfile[pre_len:].strip(os.path.sep)     
            zipf.write(pathfile, arcname)
    zipf.close()





相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
1月前
|
存储 前端开发 Serverless
Serverless 魔法之旅:如何用 Funcraft、OSS 和 ROS 打造超级CI/CD流水线!
【8月更文挑战第8天】在现代软件开发中,CI/CD对于提升效率与代码质量至关重要。本文介绍如何运用阿里云的Serverless服务——Funcraft、OSS及ROS构建完整的CI/CD流程。首先配置Funcraft实现代码自动化构建与部署;接着利用OSS管理静态文件,确保网站内容正确加载;最后借助ROS自动化资源创建与管理,实现代码自动部署。通过整合这些服务,不仅加速了开发进程,还保证了代码质量和部署一致性,充分发挥Serverless架构的优势。
46 5
|
19天前
|
存储 运维 Serverless
函数计算产品使用问题之OSS触发器是否可以只设置文件前缀
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
监控 Java Serverless
函数计算产品使用问题之对于OSS打包的zip的保存目录,该如何操作
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
2月前
|
Java Serverless 数据库连接
函数计算操作报错合集之调用打包的OSS函数时发生报错,该怎么办
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
26天前
|
NoSQL Serverless API
Serverless 架构实现弹幕场景问题之API Gateway和OSS域名未绑定成功的问题如何解决
Serverless 架构实现弹幕场景问题之API Gateway和OSS域名未绑定成功的问题如何解决
26 0
|
3月前
|
运维 Serverless 应用服务中间件
Serverless 应用引擎产品使用合集之关于OSS映射目录的大小限制,如何可以跳过
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
Serverless 应用引擎产品使用合集之关于OSS映射目录的大小限制,如何可以跳过
|
2月前
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之多个业务流程上传同名资源到同一个OSS(对象存储服务)URL,会产生什么问题
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
2月前
|
存储 弹性计算 对象存储
预留空间是什么?阿里云OSS对象存储预留空间说明
阿里云OSS预留空间是预付费存储产品,提供折扣价以锁定特定容量,适用于抵扣有地域属性的Bucket标准存储费用及ECS快照费。通过购买预留空间,如500GB通用预留+100GB标准-本地冗余存储包,用户可优化成本。
|
2月前
|
域名解析 Serverless API
函数计算产品使用问题之如何配置自定义域名访问OSS中的内容
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
运维 Serverless 数据处理
函数计算产品使用问题之在对象存储服务(OSS)上创建ZIP包解压触发器后,触发器未按预期执行,一般是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。

热门文章

最新文章

相关产品

  • 函数计算