Serverless 架构下的 AI 应用开发
Serverless架构与CI/CD工具的结合
CI/CD 是一种通过在应用开发阶段引入自动化流程以频繁向客户交付应用的方法。如图所示,CI/CD 的核心概念是持续集成、持续交付和持续部署。
作为一个面向开发和运营团队的解决方案,CI/CD 主要针对集成新代码时所引发的问题。具体而言,CI/CD 可以让持续自动化和持续监控贯穿于应用的整个生命周期(从集成、测试阶段到交付和部署阶段)。这些关联的事务通常被统称为“CI/CD管道”,由开发和运维团队以敏捷方式协同支持。
CI/CD的概念与内容简图
在Serverless架构下,通常会有很多函数构成一个完整的功能或服务,这种比较细粒度的功能往往会给后期项目维护带来极大的不便,包括但不限于函数管理、项目的构建、发布层面等的不便。此时在Serverless架构中,CI/CD就显得尤为重要。更加科学、安全的持续集成和部署过程不仅会让整体的业务流程更加规范,也会在一定程度上降低人为操作、手工集成部署所产生错误的概率,同时也会大规模减轻运维人员的工作负担。
如果想要通过CI/CD平台,科学且方便地进行Serverless应用的持续集成、交付和部署,通常情况下我们需要借助相应的开发者工具,例如 Serverless Framework、Serverless Devs 等。Serverless开发者工具配置到CI/CD平台的流程可以简化为图2-55。
Serverless开发者工具配置到CI/CD平台的流程
1.与GitHub Action的集成
在GitHub Action的Yaml文件中,增加Serverless Devs相关下载、配置以及命令执行相关内容。例如,在GitHub仓库中创建文件.github/workflows/publish.yml,文件内容如下:
name: Serverless Devs Project CI/CD
on:
push:
branches: [ master ]
jobs:
serverless-devs-cd:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 12
registry-url: https://registry.npmjs.org/
- run: npm install
- run: npm install -g @serverless-devs/s
- run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID
${{secrets.AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default
- run: s deploy
与GitHub Action集成主要包括以下几部分内容。
- 通过NPM安装最新版本的 Serverless Devs 开发者工具:
run: npm install -g @serverless-devs/s
- 通过config命令进行密钥等信息的配置:
run: s config add --AccountID ${{secrets.AccountID}} --AccessKeyID ${{secrets.
AccessKeyID}} --AccessKeySecret ${{secrets.AccessKeySecret}} -a default
- 执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目的构建:
run: s deploy
关于密钥的配置:密钥信息是通过${{secrets.*}}获取的,此时,需要将所需要的密钥和对应的Key配置到GitHub Secrets中,例如在上面的案例中,需要AccountID、AccessKeyID、AccessKeySecret三个密钥的 Key 就可以配置相关内容。
找到GitHub Secrets页面,如图所示。
GitHub Secrets页面
创建和配置密钥信息,如图所示。
创建和配置密钥信息页面
此处配置了3对密钥,如图2-58所示。
GitHub仓库配置密钥结果页面
2.与Gitee Go的集成
在开启Gitee Go的服务之后,在流水线的 Yaml 文件中,可以增加 Serverless Devs 的相关下载、配置以及命令执行相关内容。
例如,在GitHub仓库中创建文件.github/workflows/publish.yml,文件内容如下:
name: serverless-devs
displayName: 'Serverless Devs Project CI/CD'
triggers: #流水线触发器配置
push:
- matchType: PRECISE
branch: master
commitMessage: ''
stages:
- stage:
name: deploy-stage
displayName: 'Deploy Stage'
failFast: false
steps: #构建步骤配置
- step: npmbuild@1 #采用NPM编译环境
name: deploy-step
displayName: 'Deploy Step'
inputs: #构建输入参数设定
nodeVersion: 14.15 #指定 node 环境版本为 14.15
goals: | #安装依赖,配置相关主题、部署参数并发布部署
node -v
npm -v
npm install -g @serverless-devs/s
s co nfig add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default
s deploy
与GitHub Action集成的流程类似,与Gitee Go集成主要包括以下几部分内容。
- 通过NPM安装最新版本的 Serverless Devs 开发者工具:
npm install -g @serverless-devs/s
- 通过config命令进行密钥等信息的配置:
s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret
$ACCESSKEYSECRET -a default
- 执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目的构建:
s deploy
关于密钥的配置:密钥信息是通过$*获取的,此时将所需的密钥和对应的Key配置到Gitee的环境变量管理中,例如在上面的案例中,需要AccountID、AccessKeyID、AccessKeySecret三个密钥的Key就可以配置相关内容。
找到 Gitee 的环境变量管理页面,如图所示。
Gitee的环境变量管理页面
创建和配置密钥信息,如图所示。
创建和配置密钥信息页面
此处配置了3对密钥,如图所示。
Gitee仓库完成密钥配置页面
3.与Jenkins的集成
在将Serverless Devs集成到Jenkins之前,需要先基于Jenkins官网安装并运行Jenkins。本地启动Jenkins,通过浏览器进入链接 http://localhost:8080并配置完成基础设置,之后新增凭据设置,如下图所示。
Jenkins凭据设置页面
可以根据需要,增加密钥信息。以阿里云为例,新增3个全局凭据:
jenkins-alicloud-account-id : 阿里云 accountId
jenkins-alicloud-access-key-id : 阿里云 accessKeyId
jenkins-alicloud-access-key-secret : 阿里云 accessKeySecret
此时,可以对自身的 Serverless Devs 项目进行完善。创建文件Jenkinsfile:
pipeline {
agent {
docker {
image 'maven:3.3-jdk-8'
}
}
environment {
ALICLOUD_ACCESS = 'default'
ALICLOUD_ACCOUNT_ID = credentials('jenkins-alicloud-account-id')
ALICLOUD_ACCESS_KEY_ID = credentials('jenkins-alicloud-access-key-id')
ALICLOUD_ACCESS_KEY_SECRET = credentials('jenkins-alicloud-access-key-secret')
}
stages {
stage('Setup') {
steps {
sh 'scripts/setup.sh'
}
}
}
}
与Jenkins集成主要内容包括以下两部分。
- environment部分:主要是根据上面步骤配置的密钥信息,进行密钥的处理。
- stages部分:包括sh 'scripts/setup.sh'部分,即运行scripts/setup.sh文件,进行相关内容的准备和配置。
准备scripts/setup.sh文件,只需要在项目下创建该文件即可。
#!/usr/bin/env bash
echo $(pwd)
curl -o- -L http://cli.so/install.sh | bash
source ~/.bashrc
echo $ALICLOUD_ACCOUNT_ID
s config add --AccountID $ALICLOUD_ACCOUNT_ID --AccessKeyID $ALICLOUD_ACCESS_KEY_
ID --AccessKeySecret $ALICLOUD_ACCESS_KEY_SECRET -a $ALICLOUD_ACCESS
(cd code && mvn package && echo $(pwd))
s deploy -y --use-local --access $ALICLOUD_ACCESS
在该文件中,主要包括以下几个部分。
- 安装最新版本的Serverless Devs开发者工具:
curl -o- -L http://cli.so/install.sh | bash
- 通过config命令进行密钥等信息的配置:
s config add --AccountID $ALICLOUD_ACCOUNT_ID --AccessKeyID $ALICLOUD_ACCESS_
KEY_ID --AccessKeySecret $ALICLOUD_ACCESS_KEY_SECRET -a $ALICLOUD_ACCESS
- 执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目构建:
s deploy -y --use-local --access $ALICLOUD_ACCESS
完成密钥配置之后,可以创建一个Jenkins流水线。该流水线的源是目标GitHub地址。接下来,就可以开始运行 Jenkins 流水线,运行结束后可得到相关的结果。
4.与云效的集成
在云效中,可以直接选择Serverless Devs开发者工具,并在自定义命令中输入以下内容:
# input your command here
npm install -g @serverless-devs/s
s config add --AccountID ${ACCOUNTID} --AccessKeyID ${ACCESSKEYID} --AccessKeySecret
${ACCESSKEYSECRET} -a default
s deploy
与GitHub Action、Gitee Go以及Jenkins的配置类似,与云效集成同样主要包括3部分。
- 安装最新版本的 Serverless Devs 开发者工具:
npm install -g @serverless-devs/s
- 通过config命令进行密钥等信息的配置:
s config add --AccountID ${ACCOUNTID} --AccessKeyID
${ACCESSKEYID} --AccessKeySecret
- 执行某些命令,例如通过deploy命令进行项目的部署,或者通过build等命令进行项目的构建:
s deploy -y
效果如图所示。
云效命令配置页面
由于在命令中引用了3个重要的环境变量:ACCOUNTID、 ACCESSKEYID、 ACCESSKEYSECRET,因此还需要在环境变量中增加图所示的类似内容。
环境变量配置页面
5. CI/CD平台集成
总结通过上面几个案例不难发现,在做自动化发布时,最核心的3个流程如下。
- 下载工具:命令为npm install -g @Serverless-devs/s。
- 配置密钥:命令为s config add --AccountID $ACCOUNTID --AccessKeyID $ACCESSKEYID --AccessKeySecret $ACCESSKEYSECRET -a default。
- 项目部署:命令为s deploy。
虽然只是以GitHub Action、Gitee Go、Jenkins、云效几个工具作为案例,实际上无论哪个工具与CI/CD平台集成,上述3个核心流程都不会发生本质变化。另外,上面所列举的流程更多是在做自动化发布,在发布之前有时还需要进行一些测试和重新构建,以便根据具体的实际需要进行适当的完善。
综上所述,如果想非常简单、快速、科学地完成Serverless应用的CI/CD建设,一个完善的开发者工具是必不可少的。
Serverless Devs是一款多云开发者工具。我们可以通过该工具非常简单、快速、方便地部署AWS、阿里云、腾讯云等多个云厂商的函数计算等相关服务。同时,Serverless Devs也是一个开源项目,便于用户随时随地贡献组件、应用。
Serverless应用的可观测性
Serverless应用的可观测性被很多用户所关注。可观测性是通过外部表现判断系统内部状态的方式。在应用开发中,可观测性有助于判断系统内部的健康状况,在系统出现问题时,帮助定位问题、排查问题、分析问题;在系统平稳运行时,帮助评估风险,预测可能出现的问题。
在Serverless应用开发中,如果函数的并发度持续升高,很可能是业务推广团队业务规模迅速扩张。为了避免达到并发度限制而触发流控,开发者就需要提前提高并发度。
以阿里云函数计算为例,阿里云函数计算在可观测性层面提供了多种维度,包括Logging、Metrics以及Tracing等。如图所示:
函数计算可观测性整体图表
在控制台监控中心,我们可以查看整体的Metrics、服务级Metrics以及每个函数的Metrics,还可以看到当前函数计算的请求记录。
函数计算的请求记录
根据不同的请求记录,我们还可以查看函数计算的详细信息。
函数计算的请求详情
除了在控制台的监控中心查看函数的日志等信息,我们还可以在函数详情页面看到函数计算的详细日志信息,
函数计算的日志信息
还可以看到Tracing相关信息,如下图所示。
函数计算的Tracing相关信息
—END—
阿里云、蚂蚁集团的 4 位专家刘宇、田初东、卢萌凯、王仁达(排名不分先后)系统梳理阿里在 Serverless 架构下的 AI 经验,联袂推出新书《Serverless 架构下的 AI 应用开发:入门、实战与性能优化》。
本书是关于 Serverless 架构下机器学习实战的技术书,我们希望通过简单明了的语言、真实的案例,以及开放的源代码,为读者介绍 Serverless 架构与机器学习相关的基础知识,帮助读者在 Serverless 架构下开发、上线机器学习项目。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。
Serverless 架构下的 AI 应用开发的更多相关文章
- Serverless 架构下的服务优雅下线实践
作者 | 行松 阿里巴巴云原生团队 应用发布.服务升级一直是一个让开发和运维同学既兴奋又担心的事情. 兴奋的是有新功能上线,自己的产品可以对用户提供更多的能力和价值:担心的是上线的过程会不会出现意外情 ...
- 20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测
作者 | 江昱 前言 图像分类是人工智能领域的一个热门话题.通俗解释就是,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法. 它利用计算机对图像进行定量分析,把图像或图像中 ...
- 阿里云云开发平台助力风变科技Serverless架构升级实战
阿里云云开发平台助力风变科技Serverless架构升级实战 背景 风变科技 一个希望通过技术去推动下一代基础教育的组织.旗下产品包括第一代的熊猫书院(读书类产品).第二代的熊猫小课(泛学科综合学习平 ...
- 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践
作者 | 万佳 嘉宾 | 杨皓然(不瞋) 导读:云的下一波浪潮是什么?杨皓然称"是 Serverless".作为一名阿里老兵,他早在 2010 年即加入阿里云,曾深度参与阿里云飞天 ...
- 【转】Serverless架构
这是来自martinfowler.com的Serverless架构一文的大意翻译. 什么是Serverless? Serverless首先是用于描述我们的应用程序是明显或充分地依赖第三方应用或服 ...
- Serverless 架构:用服务代替服务器
Serverless 架构:用服务代替服务器 转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需 加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:&q ...
- Serverless架构
什么是Serverless架构 Servlerless 架构是新兴的架构体系,在Serverless 架构中,开发者无需考虑服务器的问题,计算资源作为服务而不是服务器的概念出现,这样,开发者只需要关注 ...
- 了解Serverless架构
1 概述 Serverless中文译为“无服务”是一种新兴起的架构模式,公司ESB产品引入Rest微服务服务机制过程,笔者刚好参与其中,其中Serverless作为一个新起的概念,跟微服务架构相关,为 ...
- COS 数据湖最佳实践:基于 Serverless 架构的入湖方案
01 前言 数据湖(Data Lake)概念自2011年被推出后,其概念定位.架构设计和相关技术都得到了飞速发展和众多实践,数据湖也从单一数据存储池概念演进为包括 ETL 分析.数据转换及数据处理的下 ...
- 声网王浩宇:RTE 场景下的 Serverless 架构挑战【RTE 2022】
前言 在「RTE2022 实时互联网大会」中,声网云原生边缘计算团队的负责人 @王浩宇 Dylan 以<RTE 场景下的 Serverless 架构挑战 -- 声网如何兼顾后端服务的可靠.高效和 ...
随机推荐
- Android学习day03【跑马灯】
这个学习内容很简单,说一下自己笨蛋的点吧 要实现这种情况,我始终没有办法实现(也就是跑马灯,图片没办法显示) 后来发现 android:layout_width="wrap_content& ...
- 深入解析C# List<T>的源码
前面的文章中解释了Array的初始化和元素插入,以及数组整体的存储结构(<深度分析C#中Array的存储结构>).这里我们再来详细的了解另一种存储结构List<T>, List ...
- 大语言模型底层架构丨带你认识Transformer
本文分享自华为云社区<大语言模型底层架构你了解多少?大语言模型底层架构之一Transfomer的介绍和python代码实现>,作者: 码上开花_Lancer . 语言模型目标是建模自然语言 ...
- What's past is prologue
凡是过去,皆为序章.爱所有人,信任少数人,不负任何人.我荒废了时间,时间便把我荒废了. 在灰暗的日子中,不要让冷酷的命运窃喜:命运既然来凌辱我们,就应该用处之泰然的态度予以报复.明智的人决不坐下来为失 ...
- 华企盾DSC苹果电脑-认证用户提示“不是认证成功的账户”
出现该问题说明客户端连不上服务器,一般来说是网络原因,可按照下面方法排查 1.先检查网络是否通能否正常上网或者换一个网络试试 2.查看服务器是否启动 3.客户测试连接是否成功端口是否填成了5580 ...
- TS MQTT封装
TS MQTT封装 导入相关包 npm i mqtt npm i lodash guid 随机生成就行,具体可以参考百度或者随便生成一个随机数* 代码封装 import mqtt from 'mqtt ...
- BeanCurrentlyInCreationException解决当前容器创建异常、循环依赖问题
BeanCurrentlyInCreationException解决当前容器创建异常.循环依赖问题 一.什么是循环依赖呢? 类A依赖类B,类B也依赖类A,这种情况就会出现循环依赖. Bean A → ...
- DVWA Insecure CAPTCHA(不安全的验证码)全等级
Insecure CAPTCHA(不安全的验证码) 目录: Insecure CAPTCHA(不安全的验证码) 1. Low 2.Medium 3. High 4.Impossible 加载验证码需要 ...
- 分享.Net 设计模式大全
由于最近项目处于维护阶段,工作没有那么匆忙了.于是开始回头整理一下常用设计模式. 虽说设计模式大家都知道,但是在写代码过程中为了抓项目进度有时候写着写着就变成面向过程开发了--后面维护起来将会相当的悲 ...
- Java中ArrayList的遍历与删除元素方式总结
在Java编程中,我们经常需要对数据结构进行遍历操作,并根据业务需求删除部分元素.而数组列表(ArrayList)是集合类中的一种,它可以动态地添加和删除元素,非常适合在程序中使用.本篇博客将总结Ar ...