用户手册 
本文档概述了ServerlessInsight的规范,详细介绍了IaC(基础设施即代码)的YAML定义。
ServerlessInsight Yaml配置规范 
ServerlessInsight的YAML配置文件是一个描述Serverless应用的资源的文件,它包含了Serverless应用的所有资源定义,如函数、API网关、事件等。以下是一个ServerlessInsight的YAML配置文件的示例:
stack.yml
version: 0.1
provider:
  name: aliyun
  region: cn-chengdu
vars:
  region: cn-hangzhou
  account_id: 1234567890
stages:
  dev:
    region: ${vars:region}
    account_id: ${vars:account_id}
service: insight-poc
tags:
  owner: geek-fun
functions:
  insight_poc_fn:
    name: insight-poc-fn
    code: 
      runtime: nodejs18
      handler: ${vars.handler}
      path: artifacts/artifact.zip
    memory: 512
    timeout: 10
    environment:
      NODE_ENV: production
      TEST_VAR: ${vars.testv}
      TEST_VAR_EXTRA: abcds-${vars.testv}-andyou
events:
  gateway_event:
    type: API_GATEWAY
    name: insight-poc-gateway
    triggers:
      - method: GET
        path: /api/hello
        backend: insight-poc-fn如上,一个典型的ServerlessInsight定义包含了version、provider、vars、stages、service、tags、functions和events 字段。我们来逐个解释一下这个YAML文件的各个部分:
version 
version字段指定了ServerlessInsight的YAML配置文件的版本,目前只支持0.1版本。 注意主版本之间可能会有不兼容的变化,所以请确保您的配置文件与ServerlessInsight的版本兼容。
version: 0.1provider 
provider字段指定了ServerlessInsight的提供商信息。
provider:
  name: aliyun
  region: cn-chengduprovider支持的字段有:
- name: 云提供商的名称,包括
aliyun、huawei、tencent等,目前只支持aliyun,其他提供商的支持正在开发中支持的云提供商的名称: aliyun, huawei, tencent
required: true - region: 云提供商服务部署目标地域 
支持的运行时: 请参考云厂商所支持的地域
required: true 
vars 
vars字段是一个对象,用于定义一些变量,这些变量可以在其他地方引用。在部署时,可以通过--parameter key=var或-p key=var 传递变量值并覆盖默认值。 变量可以通过${vars.var_name}的方式在模版中进行引用。
vars:
  bucket_name: my-bucket
  domain_name: my-domainstages 
stages字段是一个对象,用于定义不同stage下的的配置项的值。最佳实践是将部署环境相关的配置项放在stages 字段下,使得不同环境下相同的配置项可以被赋予不同的值,如:
stages:
  default:
    domain_name: my-domain-dev.com
    database_name: my-database-dev
  local:
    domain_name: localhost
    database_name: localhost
  dev:
    domain_name: my-domain-dev.com
    database_name: my-database-dev
  prod:
    domain_name: my-domain-prod.com
    database_name: my-database-prod在stages中的变量可以通过${stages.domain_name}的方式在模版中进行引用,无需指定stage, 在部署/启动服务时,通过--stage或 -s参数指定部署的环境,如si deploy --stage prod,模版便会引用对于stage的变量值。如果不指定stage,默认使用default。
service 
service字段指定了Serverless应用的名称。service 字段是一个全局唯一的标识符,用于区分不同的Serverless应用。不同于命令行中传递的 <stackName> 参数,service的值将作为隐形创建资源的ID以及资源名称前缀,且service需要区分部署的stage,所以最佳实践是将service命名为 <service>-<stage>。
service: insight-poc-${stage}注意,${stage}是ServerlessInsight提供的全局预定义变量,表示当前部署的stage,值为命令行中指定的stage或默认值
default。
tags 
tags字段是一个对象,用于定义一些标签。在这个例子中,我们定义了owner标签。
functions 
functions字段是一个对象,用于定义serverless函数。functions下的每一个子项都是一个方法的定义。
functions:
  insight_poc_fn:
    name: insight-poc-fn
    code:
      path: artifacts/artifact.zip
      handler: index.handler
      runtime: nodejs14
    container:
      image: registry.cn-hangzhou.aliyuncs.com/aliyunfc/runtime/nodejs14:1.0.0
      cmd: npm start
      port: 9000
    memory: 512
    timeout: 10
    gpu: TESLA_8
    network:
      vpc_id: vpc-test-vpc
      subnet_ids:
        - vsw-test01
        - vsw-test02
      security_group:
        name: insight-poc-g-sg
        ingress:
          - TCP:0.0.0.0/0:80
          - TCP:0.0.0.0/0:443
          - TCP:0.0.0.0/0:22/22
          - ICMP:0.0.0.0/0:ALL
        egress:
          - ALL:0.0.0.0/0:ALL
    storage:
      disk: 512
      nas:
        - mount_path: /mnt/nas
          storage_class: standard
    environment:
      NODE_ENV: production
      TEST_VAR: ${vars.testv}
      TEST_VAR_EXTRA: abcds-${vars.testv}-andyoufunction支持的字段有:
name: serverless函数的名称
支持的字符集为
a-zA-Z0-9-_,长度为1-64个字符 required: truecode: serverless函数通过源码部署的相关配置(⚠️code和container只能存在一个)
required: false
- path: 压缩后的代码路径, 当前仅支持zip格式的代码包 required: true
 - handler: serverless函数的处理程序 required: true
 - runtime: 函数运行时 required: true 支持的运行时: 
nodejs20,nodejs18,nodejs16,nodejs14,nodejs12,nodejs10,nodejs8,python3.10,python3.9,python3,PHP7.2,Java11,.NETCore3.1,Go1.x 
container: serverless函数通过容器部署的相关配置(⚠️code和container只能存在一个)
阿里云仅支镜像为同账户下的ACR镜像,不支持部署如dockerhub等公共镜像 required: false
- image: 容器镜像 遵循格式: 
registry..aliyuncs.com/xxx:tag(阿里云) - cmd: 容器启动命令 required: false default: 默认为构建镜像的dockerfile中指定的cmd和entrypoint
 - port: 容器对外提供服务的端口 required: true
 
- image: 容器镜像 遵循格式: 
 timeout: serverless函数的超时时间
默认值: 15分钟
memory: serverless函数的内存大小
默认值: 128MB
gpu: serverless函数的GPU配置
类型:
enum
required: false
支持的GPU配置:TESLA_8,TESLA_12,TESLA_16,AMPERE_8,AMPERE_12,AMPERE_16,AMPERE_24,ADA_48(GPU 的配置通过_分割型号和内存,前面是GPU的型号,后面是GPU的内存大小)
注意⚠️:阿里云不支持将一个已存在的函数配置为GPU类型,如果需要使用GPU类型的函数,需要删除原有函数并重新创建。environment: serverless函数的环境变量
支持的字符集为
a-zA-Z0-9-_,长度为1-64个字符
required: falselog: serverless函数是否开启日志
required: false
default: false
注意⚠️: 由于阿里sls创建延迟问题,无法在创建时开启日志,需要stack第一次创建时关闭,等待1~2分钟后开启日志并重新部署。network: 网络配置
类型:
object
required: false- vpc_id: 指定serverless函数的VPC ID 
类型:
string
required: true - subnet_ids: 交换机列表,即serverless函数所在的子网 
类型:
array
required: true - security_group: 安全组规则 
类型:
object
required: true- ingress: 入站规则 类型: 
array
required: true
格式为:协议:IP范围:端口范围如TCP:0.0.0.0/0:80,TCP:0.0.0.0/0:1028/1030。
协议列表:TCP,UDP,ICMP,ALL - egress: 出站规则, 与入站规则遵循相同的格式,但出站规则为可选项,默认允许所有出站流量
 
 - ingress: 入站规则 类型: 
 
- vpc_id: 指定serverless函数的VPC ID 
 storage: 函数的存储相关配置,包括函数的临时硬盘空间,挂载NAS存储以及对象存储
类型:
object
required: false- disk: 函数的临时硬盘空间, 单位为MB
类型:integer
required: false
default: 512 - nas: 挂载NAS存储到函数上
类型:object
required: false
注意⚠️:访问NAS需要函数所在的VPC和NAS在同一VPC下,且只能通过VPC内网访问,因此当指定了NAS时,需要同时指定network下的VPC和subnet_ids相关配置- mount_path: 挂载到函数实例的路径
类型:string
required: true - storage_class: NAS存储类型
类型:enum
required: true
支持的存储类型:STANDARD_CAPACITY,STANDARD_PERFORMANCE,EXTREME_STANDARD,EXTREME_ADVANCE 
 - mount_path: 挂载到函数实例的路径
 
- disk: 函数的临时硬盘空间, 单位为MB
 
events 
events字段是一个对象,用于定义事件。事件是发起函数调用的触发器。可以是一个来自用户的通过api gateway转发的http请求 也可以是来自消息队列,数据库状态改变的事件等,events下的每一个子项都是一个事件的定义。event支持的字段有:
- type: 事件的类型(目前仅支持 API_GATEWAY) 
支持的事件类型有:API_GATEWAY,SQS,S3,HTTP,Timer等 required: true
 - name: 事件的名称 
required: true
 - triggers: 事件的触发器 
required: true
- method: 事件的方法 
required: true 支持的方法有:GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS 以及ANY
 - path: 事件的路径 
required: true
 - backend: 事件的后端,通过方法的名称,指定后端的方法,请求最终有指定的方法进行处理 
required: true
 
 - method: 事件的方法 
 - domain: 事件的自定义域名 
required: false
- domain_name: 自定义域名 
required: true
 - certificate_name: 证书名称 
required: false
 - certificate_private_key: 证书私钥 
required: false
 - certificate_body: 证书内容 
required: false
 
 - domain_name: 自定义域名 
 
databases 
databases字段是一个对象,用于定义数据库。databases下的每一个子项都是一个数据库资源的定义。
version: 0.0.1
provider:
  name: aliyun
  region: cn-chengdu
service: insight-es-poc
tags:
  owner: geek-fun
databases:
  insight_es_db:
    name: insight-poc-es
    type: ELASTICSEARCH_SERVERLESS
    version: ES_SEARCH_7.10
    cu:
      min: 1
      max: 6
    storage:
      min: 20
    security:
      basic_auth:
        master_user: 'test-username'
        password: 'U34I6InQ8elseTgqTWT2t2oFXpoqFg'database支持的字段有:
name: 数据库的名称
类型:
string
required: truetype: 数据库的类型
类型:
string
支持的类型:ELASTICSEARCH_SERVERLESS,RDS_MYSQL_SERVERLESS,RDS_PGSQL_SERVERLESS,RDS_MSSQL_SERVERLESS
required: trueversion: 数据库的版本
类型:
string
支持的版本:MYSQL_5.7,MYSQL_8.0,MYSQL_HA_5.7,MYSQL_HA_8.0,PGSQL_14,PGSQL_15,PGSQL_16,PGSQL_HA_14,PGSQL_HA_15,PGSQL_HA_16,MSSQL_HA_2016,MSSQL_HA_2017,MSSQL_HA_2019,ES_SEARCH_7.10,ES_TIME_SERIES_7.10
required: truecu: 计算单元配置
类型:
object- min: 最小计算单元 
类型:
integer
最小值: 0
最大值: 32 - max: 最大计算单元 
类型:
integer
最小值: 1
最大值: 32 
- min: 最小计算单元 
 storage: 存储配置
类型:
object- min: 最小存储空间 
类型:
integer
最小值: 20
required: true 
- min: 最小存储空间 
 security: 安全配置
类型:
objectrequired: true- basic_auth: 基本认证 
- master_user: 主用户 
类型:
stringrequired: true - password: 密码 
类型:
stringrequired: true 
 - master_user: 主用户 
 
- basic_auth: 基本认证 
 network: 网络配置
类型:
object- type: 网络类型 
类型:
string
支持的类型:PUBLIC,PRIVATE - ingress_rules: 入站规则 
类型:
array
项目类型:string - public: 是否公开 
类型:
boolean 
- type: 网络类型 
 
每个数据库定义必须包含name、type、version和security字段。
buckets 
buckets字段是一个对象,用于定义对象存储。buckets下的每一个子项都是一个对象存储桶(Bucket🪣)资源的定义。
version: 0.0.1
provider:
  name: aliyun
  region: cn-chengdu
service: insight-bucket-poc
tags:
  owner: geek-fun
buckets:
  insight_bucket:
    name: insight-poc-bucket
    storage:
      class: STANDARD
    security:
      access: PRIVATE
      force_delete: false
      sse_algorithm: KMS
      sse_kms_master_key_id: 1234567890
    website:
      code: dist/
      domain: adminui.example.com
      index: index.html
      error_page: 404.html
      error_code: 404bucket支持的字段有:
- name: 存储桶的名称
 
类型:
string
required: true
支持的字符集为a-zA-Z0-9-_,长度为1-64个字符
storage: 存储配置
class: 存储类型
类型:
string
required: true 支持的存储类型:STANDARD,IA,ARCHIVE,COLDversioning: 版本控制配置
status: 版本控制状态
类型:
string
required: true 支持的状态:ENABLED,DISABLEDwebsite: 用于配置静态网站托,使得存储桶可以托管静态网站
注意⚠️:
- 配置静态网站托管时,如果想要运行公网用户访问,需要将存储桶的访问权限设置为公共读
 - website中的配置项出了
code外,其他配置项都无法在存储桶创建后修改,如果需要修改,需要删除website配置项后重新配置 
- code: 网站代码包相对项根目录的路径 
类型:
string
required: true - domain: 静态网页自定义域名,只有配置域名才能正常显示静态网页,否则通过存储桶的默认域名访问会转为下载文件 
类型:
string
required: false
默认值: null - index: 默认首页 
类型:
string
required: false
默认值:index.html - error_page: 错误页 
类型:
string
required: false
默认值:404.html - error_code: 错误码 
类型:
integer
required: false
默认值:404 
lifecycle: 生命周期配置
rule: 生命周期规则
security: bucket安全相关配置
- acl: 访问控制,配置bucket的访问权限 
类型:
string
required: false
默认值:PRIVATE
支持的访问控制:PRIVATE,PUBLIC_READ,PUBLIC_READ_WRITE - force_delete: 强制删除 
类型:
boolean
required: false
默认值: false
注意: 强制删除后无法恢复 - sse_algorithm: 加密算法
 - sse_kms_master_key_id: 加密密钥ID 
类型:
string
required: false
默认值: null
注意: 如果未指定加密密钥ID,则使用默认密钥 
- acl: 访问控制,配置bucket的访问权限