即学即会 Serverless | Serverless Devs 基础入门
在上篇中,我们阐述了工具链的重要性,那么本文将带领各位快速实现 Serverless Devs 入门。
安装工具
Cloud Native
-
第一步:请先安装 Node.js(>=10.8.0) 与 NPM 包管理工具; -
第二步:安装 Serverless Devs 开发者工具;具体的安装方式参考文档:
$ npminstall @serverless-devs/s -g
-
第三步:可以通过 s -v 判断工具是否安装成功,如果安装成功可以看到相对应的版本信息,例如:
@serverless-devs/s:2.0.89, @serverless-devs/core: 0.1.7, darwinarwin-x64, node-v12.15.0
配置密钥
Cloud Native
-
AccessKeyID:用户的 AK 信息 AccessKeySecret:用户的 SK 信息
$ s config add
? Please select a template: Alibaba Cloud(alibaba)
🧭Refer to the document for alibaba key: http://config.devsapp.net/account/alibaba
? AccountID ()
? Please select a template: Alibaba Cloud(alibaba)
🧭Refer to the document for alibaba key: http://config.devsapp.net/account/alibaba
? AccessKeyID 此处填写AccessKeyID
? AccessKeySecret 此处填写AccessKeySecret
? Please create alias for key pair. Ifnot, please enter to skip alibaba-access
Alias: alibaba-access AccountID:此处填写AccountID
AccessKeyID: 此处填写AccessKeyID
AccessKeySecret: 此处填写AccessKeySecret
Configuration successful
$ s config get -a alibaba-access
alibaba-access:
AccountID: 此处填*******tID
AccessKeyID: 此处填*********yID
AccessKeySecret: 此处填*************ret
$ s configadd --AccessKeyID myAccessKeyID --AccessKeySecret myAccessKeySecret -a demo
Alias: demo
AccountID: myAccountID
AccessKeyID: myAccessKeyID
AccessKeySecret: myAccessKeySecret
Configurationsuccessful
$ s config add--AccessKeyID ****** -kl key1,key2,key3 -il info1,info2,info3 -a demo-2
Alias: demo-2
key1: info1
key2: info2
key3: info3
AccessKeyID: code
Configurationsuccessful
-
方法 1: 直接通过 config add 进行配置
$ s config add -adefault-aliyun -kl AccessKeyID,AccessKeySecret -il${ALIBABA_CLOUD_ACCESS_KEY_ID},${ALIBABA_CLOUD_ACCESS_KEY_SECRET}
-
方法 2: 通过指定名称使用环境变量密钥
AccountID:temp_accountid
AccessKeyID:temp_accesskeyid
AccessKeySecret:temp_accesskeysecret
Key:default_serverless_devs_access
Value:{\"AccessKeyID\":\"temp_accesskeyid\",\"AccessKeySecret\":\"temp_accesskeysecret\"}
密钥使用的注意事项
Cloud Native
-
有两个账号,分别是阿里云账号和腾讯云账号,那么配置密钥的时候就可以设置别名 alibaba、tencent,在使用的时候,通过引用不同别名使用不同的密钥,以防止每次切换密钥的时候,进行密钥重新配置; -
自己拥有两个环境的密钥,一个是测试环境密钥 test,一个是线上环境密钥 release,当开发完成之后需要把业务部署到不同的环境下,可以通过指定密钥的形式,直接进行部署,而无需因为密钥的切换反复进行密钥的重新配置;
-
命令行层面: 在命令行中使用的时候,可以直接通过-a/--access 参数进行使用,例如在部署某业务的时候,可以通过 s deploy-a demo 指定使用 demo 密钥对; -
Yaml 配置文件层面: 可以通过在 Yaml 中进行密钥对的指定,例如:
-
通过-a/--access 参数指定的密钥信息 -
使用已经配置的 default 密钥信息 -
使用通过环境变量配置的``default_serverless_devs_access`密钥信息 -
不使用密钥信息 / 进入密钥信息配置引导
Tips 密钥的其他相关操作
-
密钥的查看,可以通过 s config get -h 查看帮助 -
密钥的修改,可以重新进行指定别名的密钥的创建,并通过-f 参数,强行覆盖; -
密钥的删除,可以通过 s config delete-h 查看帮助
Yaml 的使用规范
Cloud Native
-
拓展名可以是.yaml 或.yml -
格式必须符合 Yaml 规范 ( https://yaml.org/spec/1.2.2/ )
edition: 1.0.0 # 命令行YAML规范版本,遵循语义化版本(Semantic Versioning)规范
name: applicationName # 应用名称
access: xxx-account1 # 秘钥别名
vars: # [全局变量,提供给各个服务使用]
Key: Value
Service: # 可以包括多个服务
ServiceName: # 服务名称
access: xxx-account1 # 秘钥别名,如果和项目的access相同,可省略
component: componentName # 组件名称
props: serviceProp # 组件的属性值
actions: serviceActions # 自定义执行逻辑
edition: 1.0.0 # 命令行YAML规范版本,遵循语义化版本(Semantic Versioning)规范
name: FullStack # 项目名称
access: xxx-account1 # 秘钥别名
vars: # [全局变量,提供给各个服务使用]
logo: https://image.aliyun.com/xxxx.png
services:
nextjs-portal: # 服务名称
access: xxx-account1 # 秘钥别名,如果和项目的access相同,可省略
component: vue-component # 组件名称
props: # 组件的属性值
src: ./frontend_src
url: url
actions: # 自定义执行逻辑
pre-deploy: # 在deploy之前运行
- run: s exec -- publish # 要运行的命令行
path: ./backend_src # 命令行运行的路径
- run: s build # 要运行的命令行
path: ./backend_src # 命令行运行的路径
post-deploy: # 在deploy之后运行
- run: s clean
path: ./frontend_src
assets:
component: static
props:
cache-control: "public, max-age=604800, immutable"
www: "./public"
express-blog:
component: express
props:
app: ./express-blog
url: ${vars.domain}
actions:
pre-deploy:
- run: npm run build
path: ./express-blog
gateway:
component: serverless-gateway # 路由组件:HTTP URL和服务之间的映射规则
props:
routes:
- route: /~assets
value: ${assets.output.url}
- route: /
value: ${nextjs-portal.output.url}
index: index.html
- route: /~portal
value: ${nextjs-portal.output.url}
inex: index.html
- route: /~blog
value: ${express-blog.output.url}
-
获取当前机器中的环境变量:${env(环境变量)},例如 ${env(secretId)} -
获取外部文档的变量:${file(路径)},例如 ${file(./path)} -
获取全局变量:${vars.*} -
获取其他项目的变量:${projectName.props.*} -
获取 Yaml 中其他项目的结果变量:${projectName.output.*}
-
分析项目中的依赖关系 -
有依赖关系的按照依赖关系从前到后部署,无依赖关系的按Yaml配置的从上到下部署
actions: # 自定义执行逻辑
pre-命令: # 在命令之前运行
- run: command # 要运行的操作
path: ./path # 运行操作的路径
post-命令: # 在命令之后运行
- run: command # 要运行的操作
path: ./path # 运行操作的路径
actions: # 自定义执行逻辑
pre-deploy: # 在deploy之前运行
- run: s exec -- publish # 要运行的命令行
path: ./backend_src # 命令行运行的路径
- run: s build # 要运行的命令行
path: ./backend_src # 命令行运行的路径
post-deploy: # 在deploy之后运行
- run: s clean
path: ./frontend_src
edition: 1.0.0 # 命令行YAML规范版本,遵循语义化版本(Semantic Versioning)规范
name: FullStack # 项目名称
services:
nextjs-portal: # 服务名称
access: xxx-account1 # 秘钥别名,如果和项目的access相同,可省略
component: vue-component # 组件名称
props: # 组件的属性值
src: ./frontend_src
url: url
actions: # 自定义执行逻辑
pre-deploy: # 在deploy之前运行
- run: s exec -- publish # 要运行的命令行
path: ./backend_src # 命令行运行的路径
- run: s build # 要运行的命令行
path: ./backend_src # 命令行运行的路径
post-deploy: # 在deploy之后运行
- run: s clean
path: ./frontend_src
-
在./backend_src 目录下执行 s exec -- publish -
在./backend_src目录下执行 s build -
调用组件 vue-component 的 deploy 方法,并将 props 和项目的基本信息传入到组件 vue-component 的 deploy 方法中 -
在./frontend_src 目录下执行 s clean
edition: 1.0.0 # 命令行YAML规范版本,遵循语义化版本(Semantic Versioning)规范
name: FullStack # 项目名称
access: xxx-account1
services:
backend: # 服务名称
component: django-component # 组件名称
props: # 组件的属性值
src: ./backend_src
url: url
user—frontend: # 服务名称
component: vue-component # 组件名称
props: # 组件的属性值
src: ./frontend_src_user
url: url
admin-frontend: # 服务名称
component: vue-component # 组件名称
props: # 组件的属性值
src: ./frontend_src_admin
url: url
-
该应用的名字是 FullStack,将会使用密钥 xxx-account1; -
该应用拥有三个服务:
-
backend 服务:使用了 django-component 组件 -
user—frontend 服务:使用了 vue-component 组件 -
admin-frontend 服务:使用了 vue-component 组件
1)应用级操作
-
执行 s deploy 或者 s remove 时,由于 backend、user—frontend、admin-frontend 三个服务对应的组件,均支持 deploy 和 remove 方法,所以此时系统会按照服务的部署顺序,进行三个服务分别对应的组件的 deploy 或 remove 操作;此时,系统的 exit code 为 0;
-
执行 s test 时,由于 user—frontend、admin-frontend 两个服务对应的组件并不支持 test 方法,所以此时系统会执行 backend 对应组件(django-component)的 test 操作;此时,系统会对 user—frontend、admin-frontend 两个服务进行警告,但是并不会报错,最终的 exit code 为 0;
-
如果在执行相关的命令时,backend、user—frontend、admin-frontend 三个服务任何一个服务在执行过程中出现了错误,系统则会报错,并终止下一步的操作,此时,系统的 exit code 为 101;
2)服务级操作
-
执行 s backend deploy 等,可以针对服务 backend 进行 deploy 相关的操作,如果顺利完成与其操作,系统的 exit code 为 0;否则,出现错误,系统的 exit code 为 101; -
执行 s admin-frontend test 时,由于服务 admin-frontend 对应的 test 方法是不存在的,此时系统将会认为是未找到组件方法,系统的 exit code 为 100;
-
Yaml 模式:需要依赖资源描述文档进行操作的模式 -
Cli 模式:可以在任何目录下直接执行,而不需要依赖资源描述文档;
-
如果想要使用 Yaml 模式,在当前目录下,必须要有 s.yaml/s.yml 文件,或通过-t/--template 指定的资源部描述文件; -
如果想要试用 Cli 模式,则必须是 s cli 组件名方法参数的格式进行,此时不需要 Yaml 文件;
name: myApp
edition: 1.0.0
access: "myaccess"
services:
website-starter:
component: devsapp/website
props:
bucket: testbucket
backend-starter:
component: devsapp/demo
props:
service:
name: serviceName
function:
name: functionName
region: cn-hangzhou
-
通过 s cli 天然支持的 -p/--prop 参数,进行相关 Yaml 参数的赋值,例如上述案例的 s backend-starter deploy,此时可以改写成:
$ s cli devsapp/demo -p "{\"service\":{\"name\":\"serviceName\"},\"function\":{\"name\":\"functionName\"},\"region\":\"cn-hangzhou\"}"
-
通过 demo 组件本身所支持的一些参数,例如通过 s clidevsapp/demo -h,可以得到帮助信息,部分内容如下:
--region [region] [C-Required] Specify the fc region, value: cn-hangzhou/cn-beijing/cn-beijing/cn-hangzhou/cn-shanghai/cn-qingdao/cn-zhangjiakou/cn-huhehaote/cn-shenzhen/cn-chengdu/cn-hongkong/ap-southeast-1/ap-southeast-2/ap-southeast-3/ap-southeast-5/ap-northeast-1/eu-central-1/eu-west-1/us-west-1/us-east-1/ap-south-1
--service-name [serviceName] [C-Required] Specify the fc service name
--function-name [functionName] [Optional] Specify the fc function name
$ s cli devsapp/demo --region cn-hangzhou --service-name serviceName --function-name functionName
特点对比
设计思路
附录
Cloud Native
[1] 社区官网
http://www.serverless-devs.com/
[2] 桌面客户端
https://serverlessdevs.resume.net.cn/zh-cn/desktop/index.html
[3] Serverless 应用开发者套件
http://serverless-dk.oss.devsapp.net/docs/tutorial-dk/intro/react
[4] Serverless Devs CLI
https://serverlessdevs.resume.net.cn/zh-cn/cli/index.html
[5] Serverless Hub 应用中心
https://serverlesshub.resume.net.cn/#/hubs/special-view
# 极速上手 Serverless#
为了让开发者快速定位 Serverless 开发问题,找到对应解决办法,阿里云云原生 Serverless 团队,发布 2022 全新版本《Serverless 开发速查手册》,目前已开放下载,我们希望给 Serverless 开发者提供一本能够速查、速懂的工具书,实实在在帮助开发者快速解决 Serverless 开发遇到的实际问题,让大家能够踏踏实实享受 Serverless 带来的技术红利!后台回复 手册 即可下载阅读。