常见小贴士
- ServerlessDevs 和 fc3 组件的关系
- 如何声明/部署多个函数
- 如何配置函数的自定义域名
- 如何实现函数多 region 部署
- 如何给
VSCode做智能提示和检测 - 关于
.fcignore使用方法 - 关于
.env使用方法 - Yaml 是否支持全局变量/环境变量/引用外部文件
- Yaml 特殊变量
- 项目实践案例
serverless-devs 和 fc3 组件的关系
-
Serverless Devs 是一个无厂商锁定 Serverless 的工具框架,本身不具任何能力,用户可以通过引入不同的组件使用不同的功能
-
而 fc3 组件则是这个工具框架的一个组件,主要是对阿里云函数计算进行操作的,例如创建函数,删除函数、发布版本、业务构建、在线调试等;
如果需要进行比喻:
- Serverless Devs 是小时候玩的红白机,而 fc3 组件等都是游戏卡,游戏机本身不具备啥功能,根据我们插入的游戏卡实现不同的功能;
- Serverless Devs 就相当于我们用的 VSCode 工具,本身不具备太多的能力,但是我们可以安装不同的插件,来丰富 VSCode 的能力,而这些插件对应到 Serverless Devs 生态中,就是不同的组件,例如 fc3 组件,fc3-domain 组件,ros 组件等;
如何声明/部署多个函数
如何配置函数的自定义域名
示例请参考fc-custom-domain
有关 fc3-domain 组件请参考 fc3-domain
如何实现函数多 region 部署
shell 脚本
#! /bin/bash
regions=("cn-hangzhou" "ap-southeast-1")
for r in ${regions[@]}
do
export REGION=$r
s deploy -y
done
s.yaml 示例
edition: 3.0.0
name: hello-world-app
access: 'default'
resources:
hello_world:
component: fc3
props:
region: ${env('REGION')}
functionName: 'start-nodejs-im1g'
description: 'hello world by serverless devs'
runtime: 'nodejs14'
code: ./code
handler: index.handler
memorySize: 128
timeout: 30
智能提示和检测
给VSCode插件做智能提示和检测, 详情参考intelligent
关于.fcignore使用方法
.fcignore 的内容如下:
aaa
**/abc
!abc
.abc/**
bcd/fc
文件解读:
aaa:忽略根目录的 aaa 的文件夹或文件
**/abc:忽略所有 abc 的文件夹或者文件
!abc:不忽略根目录下的 abc 文件夹或者文件
.abc/**:忽略根目录下 .abc 的所有内容,但 .abc 的空文件夹不被忽略
bcd/fc:忽略根目录 bcd 下 fc 的文件夹或者文件
解析预期结果
deploy 到线上的目录结构
关于.env使用方法
项目代码中涉及到数据库的连接信息,云账号的AccessKeyID, AccessKeySecret等敏感信息,禁止写死在代码中,提交到 git 仓库。否则会造成严重的安全风险。
使用步骤
- 假设我的.env 文件如下
AccessKeyID=xxxx
AccessKeySecret=xxxxxxx
注意:务必在
.gitignore中忽略.env文件
- 配置文件(
s.yaml)可以将.env中变量作为环境变量传递到 FC 执行环境中:
# s.yaml
edition: 3.0.0
name: fc3DeployApp
access: default
resources:
test-function:
component: fc3
props:
region: cn-hangzhou
functionName: test
runtime: nodejs16
code: ./code
handler: index.handler
environmentVariables:
AccessKeyID: ${env('AccessKeyID')}
AccessKeySecret: ${env('AccessKeySecret')}
- 在项目代码中读取环境变量
- 本地测试可以通过类似dotenv库来读取
.env环境变量 - 在 FC 环境线上执行时候,会将环境变量直接注入到当前进程,NodeJS 应用可以通过
process.env.AccessKeyID直接获取环境变量。
Yaml 是否支持全局变量/环境变量/引用外部文件
Serverless Devs 的 Yaml 规范本身支持全局变量、环境变量以及外部内容的引入:
- 获取当前机器中的环境变量:
${env('环境变量')},例如${env('secretId')} - 获取外部文档的变量:
${file('路径')},例如${file('./path')} - 获取全局变量:
${vars.*} - 获取其他项目的变量:
${projectName.props.*} - 获取 Yaml 中其他项目的结果变量:
${resources.projectName.output.*} - 获取当前配置的 config 变量:
${config('AccountID')}本质是获取s config get中变量值 - 获取当前模块的信息:
${this.xx}, 比如${this.props.name}
详情可以参考:Serverless Devs Yaml 规范文档
Yaml 特殊变量
在 Serverless-Devs 中有些特殊变量有特定的用途,开发者没有特殊的需求,避免使用特殊变量
${aliyun-cli}作用在access的值中,从获取aliyun cli的默认的profile,并且生效。
执行
aliyun configure list可以查看当前生效的profile