• 阿里云serverless从入门到进阶测评(阿里云/AWS/腾讯云)


    通过函数计算FC的预置模板,新用户可以很快的完成服务搭建,并且以极低的时间和资金成本完成以前大量的服务和繁琐的步骤,同时Serverless也是近几年来不断发展的一个技术趋势,以弹性伸缩的方式来降低成本和解决服务高可用的问题,使资源变得灵活

    本项目是将世界上最流行的 web 框架 wordpress 部署到阿里云 Serverless 平台(函数计算 FC)
    通过 Serverless Devs 开发者工具,您只需要几步,就可以体验 Serverless 架构,带来的降本提效的技术红利。

    通过本次的Serverless函数计算征集令活动,作为一个阿里云的Serverless新手,写出该教程,可以很快速的上手,值得一说的是阿里云所提供的 通过模板创建应用 这一点,提供的模板很丰富,相较于AWS Lambda来说,对于国内用户是非常友好的,毕竟有很多非常适合新手使用的模板,由于本次是阿里云社区推出的Serverless活动,那么用户来使用这些服务是免费的,这里又不得不提到腾讯了,就在上个月腾讯的函数应用已经开始收费了,这对于新手想要入门Serverless,阿里云无疑是最好的选择,本文开始会为大家做一个基础的演示,包含视频和文字,各位读者按需操作吧。

    P1-主要为新手用户快速上手,如果您对P1不感兴趣,可以移步到P2

    这里来使用阿里云函数计算FC来创建高可用的Wordpress应用,其实是一个很好的选择,在这里使用Serverless,那么弹性和成本得到了很好的体现,用户在搭建的时候就无需再去额外的购买容器或者ECS云服务器这些资源,更为突出的一点是 ,整个流程,用户只需要 点点点,相较于传统来部署Wordpress,用户所需要做的操作并不少,例如下载Wordpress包,数据库,改代码,考虑是否使用LAMP还是LNMP架构。那么在本教程中,您将体验到极致的部署速度和极其简单的操作步骤。

    阿里云Serverless函数征集令活动页面:https://developer.aliyun.com/topic/serverless2022

    演示视频:

    Bilibili:https://www.bilibili.com/video/BV1Kf4y1Z7Nn/
    阿里云开发者社区视频:https://developer.aliyun.com/live/249606?spm=a2c6h.26396819.creator-center.6.2aef3e18EC2bLq

    一、控制台创建Wordpress Serverless应用

    首先进入阿里云 函数计算FC的控制台
    函数计算FC:https://fcnext.console.aliyun.com

    1.点击左侧的应用

    控制台

    2.依次点击 Web应用—》Wordpress(立即创建)

    应用

    3.授权github仓库

    授权

    4.确认授权

    github授权

    5.授权成功后,自动跳转回之前的页面

    授权后

    6.点击左下角的立即创建

    创建应用

    7.稍后会自动跳转到应用详情页面,如下

    应用详情
    应用详情2

    二、配置WordPress并访问

    1.访问Serverless所提供的域名

    访问

    2.开始安装

    安装
    安装-2

    3.使用之前配置的账户密码进行登录

    登录
    首页

    4.文章发布测试

    发布文章

    ########################################################

    P2、函数的集成应用

    1x00.在阿里云函数计算的帮助文档中有提到 集成服务,阿里云是这样定义的

    函数计算以事件驱动的方式连接其他服务。借助这些方式,您可以构建弹性的、可靠的以及安全的应用和服务,甚至在数天内就能完成一套多媒体数据处理后端服务。当事件源触发事件时,函数计算会自动调用关联的函数处理事件。例如,对象存储OSS在新对象创建或删除事件(ObjectCreated或ObjectRemoved)时会自动触发函数处理,或者API网关在收到HTTP请求时自动触发函数处理请求。此外,函数还可以由日志服务或者表格存储等其他阿里云服务触发。

    1x01.那么在后面的内容中会使用三家云厂商的服务来做本次的集成服务测试,这里采用的是 apiGateway和自然语言分析服务,分别为:Aliyun、AWS、Tencent,由于这篇文章主要是阿里云的Serverless测评,那么主要对阿里云部分进行详细描述,其余厂商,简短描述,详细内容请观看视频

    Bilibili视频链接:https://www.bilibili.com/video/BV1XG4y1e7uE/

    1x02.流程结构如下

    Aliyun

    Aliyun: ApiGateway ---- 函数计算FC ---- nlp

    aws

    AWS: LambdaURL—Lambda—Comprehend

    Tencent

    Tencent: ApiGateway ---- 云函数SCF----nlp

    1.阿里云serverless函数计算fc+自然语言处理nlp(情绪分析)

    1x01.创建策略、用户,并授权

    RAM控制台:https://ram.console.aliyun.com/

    Step-1.创建策略

    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "alinlp:*",
                "Resource": "*"
            }
        ],
        "Version": "1"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    policy

    polcy-2

    Step-2.创建用户并授权

    image.png
    image.png
    image.png

    1x02.创建空白函数服务

    函数计算FC控制台:https://fcnext.console.aliyun.com/cn-shanghai/services

    Step-1.创建服务

    create-fc-service

    Step-2.创建空白函数

    create-fc

    Step-3.使用标准 Runtime 从零创建

    create-fc-1

    Step-4.编写函数代码,安装依赖包

    ### Aliyun
    # -*- coding: utf-8 -*-
    import json
    import base64
    from aliyunsdkalinlp.request.v20200629 import GetSaChGeneralRequest
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.acs_exception.exceptions import ClientException
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    
    def handler(event, context):   
        event= json.loads(event)
      
        client = AcsClient(
        "AK",
        "SK",
        "cn-hangzhou"
        );
    
        request = GetSaChGeneralRequest.GetSaChGeneralRequest()
        # 因为api传递进来的event是 base64加密过的,所以需要对body解密
        request.set_Text(base64.b64decode(event['body']))
        # request.set_OutType("1")
        request.set_ServiceCode("alinlp")
        # request.set_TokenizerId("GENERAL_CHN")
        response = client.do_action_with_exception(request)
        resp_obj = json.loads(response)
    
        return {
            'headers': { "Content-Type": "application/json" },
            'statusCode': 200,
            'body': json.loads(resp_obj['Data'])['result']
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    # 将依赖包下载到本地目录中
    pip install aliyun-python-sdk-alinlp==1.0.16 -t .
    
    • 1
    • 2

    put-code

    fc-lib
    install-lib

    1x03.创建API网关并设置api触发

    API网关控制台:https://apigateway.console.aliyun.com/cn-shanghai/apis/list#/cn-shanghai/overView/view

    Step-1.创建API

    api-1

    Step-2.设置API名称和安全认证

    image.png

    Step-3.定义API请求—设置协议、请求path、httpMethod

    image.png

    Step-4.定义API后端服务—后端服务类型/函数类型/服务名称/函数名称

    image.png

    Step-5.完成API创建

    Step-6.发布API–设置为线上环境发布

    image.png
    image.png
    image.png

    1x04.检查是否启用nlp服务[若未开通则需开通]

    nlp控制台,需要预先开通:https://alinlp.console.aliyun.com/overview

    1x05演示

    使用postman测试

    image.png

    托管页面演示

    因为阿里云oss托管需要另外使用域名,这里就用AWS的S3来托管页面
    一键访问:http://stanbck.s3-website.ap-east-1.amazonaws.com
    image.png

    1x11.亚马逊云serverless测试

    ### AWS
    import json
    import boto3
    
    comprehend = boto3.client(service_name='comprehend', region_name='us-east-1')
    
    def lambda_handler(event, context):
        print("Event",event['body'])
        Text = event['body']
        LanguageCode = comprehend.detect_dominant_language(Text=Text)
        comprehend_sentiment = comprehend.detect_sentiment(Text = Text,LanguageCode=LanguageCode['Languages'][0]['LanguageCode'])
        return {
            'headers': { "Content-Type": "application/json" },
            'statusCode': 200,
            'body': comprehend_sentiment
        }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    image.png

    1x31.腾讯云serverless测试

    ### Tencent
    # -*- coding: utf8 -*-
    import json
    import os
    from tencentcloud.common import credential
    from tencentcloud.common.profile.client_profile import ClientProfile
    from tencentcloud.common.profile.http_profile import HttpProfile
    from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
    from tencentcloud.nlp.v20190408 import nlp_client, models
    def main_handler(event, context):
        print("the  event source:",event)
        print("the post body type:",type(event['body']))
        # print("The event:",json.loads(event['body']))
        if isinstance(event['body'],str):
            Text = event['body']
        else:
            Text = json.loads(event['body'])
        print(Text)
        try:
            cred = credential.Credential(
                os.environ.get("TENCENTCLOUD_SECRETID"), 
                os.environ.get("TENCENTCLOUD_SECRETKEY"),
                os.environ.get('TENCENTCLOUD_SESSIONTOKEN'))
            # 实例化一个http选项,可选的,没有特殊需求可以跳过
            httpProfile = HttpProfile()
            httpProfile.endpoint = "nlp.tencentcloudapi.com"
    
            # 实例化一个client选项,可选的,没有特殊需求可以跳过
            clientProfile = ClientProfile()
            clientProfile.httpProfile = httpProfile
            # 实例化要请求产品的client对象,clientProfile是可选的
            client = nlp_client.NlpClient(cred, "ap-guangzhou", clientProfile)
    
            # 实例化一个请求对象,每个接口都会对应一个request对象
            req = models.SentimentAnalysisRequest()
            params = {
                "Text": Text,
                "Mode":"3class"
            }
            req.from_json_string(json.dumps(params))
    
            # 返回的resp是一个SentimentAnalysisResponse的实例,与请求对象对应
            resp = client.SentimentAnalysis(req)
            # 输出json格式的字符串回包
            print(type(resp.to_json_string()))
            # print("The out :",resp)
            return {
            'headers': { "Content-Type": "application/json" },
            'statusCode': 200,
            'body': resp.to_json_string()
            }
            
    
        except TencentCloudSDKException as err:
            print(err)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    image.png

    使用感受

    从三家对比来看,各有优差吧

    是否易用:在P1阶段,可以看出阿里云提供了服务模板,可以很快的创建出常用服务,例如wordpress、kodbox等等,同样另外两家云厂商也提供了此类功能,但是对于新手和国内用户,阿里云和腾讯云更有优势一点,其提供的常用模板很多,反观AWS在这边对国内用户并不太友好,提供的模板可能不太适合新手用户。细化的看一下,阿里云所提供的模板要多很多,这对于新手和需要快速构建服务的用户来说非常方便,这个点阿里云还是做得很好

    代码编写:个人认为 腾讯似乎更有优势一点,vscode的编辑器的确很好用,遇到没有使用过的包,按住ctrl + 左键 可以快速到包文件,其余两家还没有体验到

    依赖包安装:三家都提供了 层,本地上传zip包等等,不过值得一说的是 这次 阿里云和腾讯云 都有了 终端 ,这样可以快速的在终端中安装依赖包,相比较aws的lambda并没有这个功能(cloud 9这个服务有这个功能)

    开发文档:这里还是要属 AWS 更有优势,关于boto3的使用有非常明确的描述各个包以及aws各种服务的调用和返回方法。阿里云的使用文档让我觉得并不方便,而且描述很不详细。腾讯云在这边和阿里云类似,不过似乎要好一点,如果审核可以看到,希望完善一下开发文档吧

    技术支持:由于使用aws看文档已经足够,这里并没有涉及到aws的support.在使用阿里云函数计算FC的时候,出现一个API传参加密,这个其实挺费解的,其他两家并没有这样做,提交工单,售后工程师处理了一天,说的最多的也就是 “你好,请稍等,正在查看您的问题”,然后就是回复很慢!自己找出解决方案了,工程师都还没有答复。腾讯云这边提交过几次工单,非常快速,而且是实时在线的工程师解决问题,提出问题后还迅速加微信了解问题所在。再吐槽一下,阿里云的工单实在是太慢了,一个好的服务离不开好的售后。

    价格方面:这里对于普通用户并没有什么需要考虑的,因为阿里云的serverless活动,那么这次选阿里云也没问题,不过aws也是免费提供一定额度的调用资源。腾讯方面在6月改版后,新用户体验3个月左右就需要付费了。

    代码量:这里说的代码量说的是服务集成这块,可以看到每家云厂商都将serverless和自己的其他服务进行集成,在aws的lambda中,采用一个boto3模块,可以调用自家全部服务,自然是代码量要少很多。阿里云和腾讯这边采用的差不多的策略,对于不同的服务似乎都有不同的SDK,这个似乎对于新手用户不太友好,而且开发文档让人挺头疼

    函数授权:三家都有在函数中附加Role的功能,在使用AWS和腾讯的时候都有成功的使用Role的权限(腾讯这边一开始没找到,但是在线咨询马上就回复了,而且微信也加上给出解决方法),阿里云这边看来还是AK SK比较方便(对于新手而言),直接创建用户-授权-拿到AKSK填入函数中,但是这样似乎有一点安全问题,为什么不用Role权限,确实是看不太懂文档,而且在钉钉群也问了,给的是OSS的方案,不太适用,所以个人觉得阿里云在这边对于新手似乎是不太友好,个人认为权限这方面用Role的权限更好,审核如果看到的话,能否回复本文留下 拿到role权限的函数代码

    做总结:总体来看,阿里云和另外两家相比有优有差:从快速上手来说:新手用户使用确实也是比较方便,而且现在是有活动在,使用成本也会降低。但是其开发文档个人感觉对新手并不友好,而且让我觉得很不好的是工单的支持,技术售后回复很慢,慢到连你找到解决方案了,售后也还是在给发"请稍等,正在查看你的问题",个人觉得售后这边不专业,然后不得不去钉钉群问。。。

  • 相关阅读:
    python获取两个JSON 的差异
    用户代理字符串检测技术【1】
    MySQL和Oracle区别
    商汤发布象棋机器人『元萝卜』;『南瓜书』西瓜书公式推导&解析;代码自动美化插件;Tock建立对话机器人的AI平台;前沿论文 | ShowMeAI资讯日报
    根据当年节假日和非工作时间计算请假时间-获取每个月的节假日,计算每个月的工作日时间进度,节假日每年更新
    信创之国产浪潮电脑+统信UOS操作系统体验1:硬件及软件常规功能支持情况介绍
    Python list列表删除元素(4种方法)
    Java集合常见面试题
    Redis_哨兵模式配置文件详解
    以下关于ASP.NET网页结构的叙述中正确的是
  • 原文地址:https://blog.csdn.net/fly1574/article/details/126064375