最佳实践

腾讯云无服务器应用模型

最近更新时间:2020-02-12 13:37:37

简介

腾讯云无服务器应用模型(Tencent Cloud Serverless Application Model,TCSAM),是用于在腾讯云上定义 Serverless 应用的模型。
Serverless 应用是由事件触发运行的应用,一个典型的 Serverless 应用由一个或多个腾讯云云函数 SCF 组成。例如云函数由向 腾讯云对象存储 COS 上传对象文件操作、向 腾讯云消息队列 CMQ 中投递消息等事件触发。这些函数可以独立运行,也可以使用其它资源,例如腾讯云对象存储 COS,腾讯云数据库服务 TencentDB。同时,最基本的 Serverless 应用可以只有一个函数。

说明:

  • 本文中的 “一定”,“不一定”,“必填”,“将要”,“最好不要”,“应该”,“不应该”,“推荐”,“可能”,和 “可选” 按照 RFC 2119 中的描述进行解释。
  • 本文中 TCSAM 根据 Apache 2.0 许可证 授权,其版本为2018-11-11。

格式及规范

TCSAM 用通过 YAMLJSON 格式的模板文件来描述 Serverless 应用。

TCSAM 模板

注意:

TCSAM 中的所有属性名称区分大小写

Resources:
  default:
    Type: TencentCloud::Serverless::Namespace
    hello_world:
      Type: TencentCloud::Serverless::Function
      Properties:
        CodeUri: ./
        Type: Event
        Description: This is a template function
        Handler: index.main_handler
        MemorySize: 128
        Runtime: Python3.6
        Timeout: 3
        Events:
           timer:  ## 触发器名
               Type: Timer  ## 定时触发器
               Properties:
                   CronExpression: '*/5 * * * *'
                   Enable: True  

全局部分

全局部分定义了 TCSAM 模板中的全局属性,这些属性会被 TencentCloud::Serverless::FunctionTencentCloud::Serverless::Api资源继承。
示例:

Globals:
  Function:
    Runtime: Python2.7
    Timeout: 30
    Handler: index.handler
    Environment:
      Variables:
        DB_NAME: mydb

资源类型

TencentCloud::Serverless::Namespace

云函数命名空间,命名空间由一组函数组成。

TencentCloud::Serverless::Function

描述云函数以及触发该函数的事件源,云函数属于某个命名空间。

属性

属性名称 类型 是否必填 描述
Handler String 云函数的入口执行方法。
Runtime String 云函数的运行时环境。可选值为:Python2.7、Python3.6、Nodejs6.10、Nodejs8.9、PHP5、PHP7、Golang1、Java8。
CodeUri String 代码位置。支持本地文件、本地目录、本地 zip 文件、对象存储 COS bucket 及 object 等形式,更多信息参考 CodeUri
Description String 云函数的描述。
MemorySize Integer 函数执行时分配的内存大小,单位是 MB,默认为128(MB),按128递增。
Timeout Integer 函数在被终止之前可以运行的最长时间,单位是秒,默认为3秒。
Role String 通过填写角色名称,为函数指定运行角色。 如果此字段缺省,将为函数创建一个默认的角色 QCS_SCFExcuteRole。
Environment 环境变量对象 为函数配置 环境变量
Events 事件源对象 用于定义触发此函数的事件源。
VpcConfig VPC 配置对象 用于配置云函数访问 VPC。

示例:TencentCloud::Serverless::Namespace 与 TencentCloud::Serverless::Function

ProjectTest: # 命名空间名称
  Type: 'TencentCloud::Serverless::Namespace'
  TestFunction: # 函数名
    Type: 'TencentCloud::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: Python2.7
      CodeUri: './'
      Description: Cron function
      Role: QCS_SCFExcuteRole
      Timeout: 10
      MemorySize: 512

注意:

  • 如果有多个函数,可以在函数目录外部新建一个 template.yaml ,在 yaml 里指定每个函数的 CodeUri 即可,部署时将会部署多个函数。
  • VS Code 插件尚未支持同时部署多个函数,请依次进行单个函数的部署。

如下所示,部署时会自动部署 “func1” ,“func2”两个函数。

Globals:
  Function:
    Timeout: 10
    MemorySize: 128
    Runtime: Python2.7

Resources:
  default:
    Type: TencentCloud::Serverless::Namespace
    func1:
      Type: TencentCloud::Serverless::Function
      Properties:
        CodeUri: ./func1
        Description: This is a template function
        Handler: index.main_handler
    func2:
      Type: TencentCloud::Serverless::Function
      Properties:
        CodeUri: ./func2
        Description: This is a template function
        Handler: index.main_handler

事件源类型

Timer

描述类型为 定时触发器 的对象。

属性

属性名称 类型 是否必填 描述
CronExpression String 函数被触发的时间,支持指定的 Cron 表达式
Message String 自定义触发附加消息,可以在云函数入参 event 中获取。
Enable Boolean 是否启用触发器。

示例:Timer 事件源对象

 Events:
     timername:
             Type: Timer
             Properties:
                     CronExpression: '*/5 * * * *'
                     Message:"这是一条附加消息"
                     Enable: True

COS

描述类型为 对象存储触发器 的对象。

属性

属性名称 类型 是否必填 描述
Bucket String COS 对象存储存储桶 bucket 名称。
Events String 触发云函数的事件,可选值为 cos:ObjectCreated:*cos:ObjectCreated:Putcos:ObjectCreated:Postcos:ObjectCreated:Copycos:ObjectCreated:Appendcos:ObjectCreated:CompleteMultipartUploadcos:ObjectRemove:*cos:ObjectRemove:Deletecos:ObjectRemove:DeleteMarkerCreated
Filter COS 通知过滤器 触发事件的过滤器规则。
Enable Boolean 是否启用触发器。

示例:COS 事件源对象

Events:
     cli-appid.cos.ap-beijing.myqcloud.com: # full bucket name
             Type: COS
             Properties:
                     Bucket: cli-appid.cos.ap-beijing.myqcloud.com
                     Filter:
                             Prefix: filterdir/
                             Suffix: .jpg
                     Events: cos:ObjectCreated:*
                     Enable: True

Bucket name 及 bucket 字段的值可前往 COS 控制台 查看。如下图所示:

API 网关

描述类型为 API 网关触发器 的对象。

说明:

如果在描述文件中同时存在 API 资源对象或 API 网关触发器事件源对象时,API 资源对象将生效。

属性

属性名称 类型 是否必填 描述
StageName String 发布阶段的名称,API 网关用作调用统一资源标识符(URI)中的第一个路径段。可选值为:testprepubrelease。默认如果为新 API 服务时为 release,已有 API 服务时为test
HttpMethod String HTTP 请求方法,可选值为:ANYGETPOSTPUTDELETEHEAD,默认值为ANY
IntegratedResponse Boolean 是否启用集成响应,默认值为false
Enable Boolean 是否启用触发器。
ServiceId String 网关服务 ID。在 SCF CLI 或 VS Code 插件部署时,在 template.yaml 中未填写 ServiceId,系统会新建网关并返回相关信息。您可以将此信息里的 ServiceId 填写到 template.yaml ,之后部署不会重复新建。

示例:API 事件源对象

Events:
     hello_world_apigw:  # ${FunctionName} + '_apigw'
             Type: APIGW
             Properties:
                     StageName: release
                     ServiceId:
                     HttpMethod: ANY

CMQ

描述类型为 CMQ 消息队列触发器 的对象。

属性

属性名称 类型 是否必填 描述
Name String 消息队列名称。
Enable Boolean 是否启用触发器。

示例:CMQ 事件源对象

Events:
     topicname:            # topic name
             Type: CMQ
             Properties:
                     Name: qname

Name 字段的值为 topic 名,可前往 CMQ 控制台 获取信息。如下图所示:

CKafka

描述类型为 CKafka 触发器 的对象。

属性

属性名称 类型 是否必填 描述
Name String 消息队列 CKafka ID。
Topic String 消息队列 CKafka 主题 Topic 名称。
MaxMsgNum Integer 最大批量消息数,范围1 - 1000。
Offset String 起始 offset 位置,默认为latest
Enable Boolean 是否启用触发器。

示例:CKafka 事件源对象

Events:
    ckafka-name:
        Type: Ckafka  
        Properties:
            Name: ckafka-XXXXX
            Topic: test_scf
            MaxMsgNum: 999
            Offset: latest
            Enable: true  

Name 的字段为 CKafka ID,Topic 字段的值为 topic name 。可前往 CKafka 控制台 查看对应信息。如下图所示:

属性类型

事件源对象

描述触发函数的事件源的对象。

属性

属性名称 类型 是否必填 描述
Type String 事件类型。 事件源类型包括 TimerCOSAPICMQ。有关所有类型的更多信息, 请参阅 事件源类型
Properties * 描述此事件映射属性的对象。必须符合定义的类型。有关所有类型的更多信息,请参阅 事件源类型

示例:事件源对象

Events:
  Type: Timer
  Properties:
    CronExpression: '*/5 * * * *'
    Message:"这是一条附加消息"
    Enable: true

VPC 配置对象

VPC 配置对象包含的属性包括:VpcIdSubnetId 属性。它们所代表的含义参考 VPC Config 对象

属性名称 类型 是否必填 描述
VpcId String VPC ID。
SubnetId String 属于 VPC 内的子网 ID。

示例:VPC 配置对象

VpcConfig:
  VpcId: 'vpc-qdqc5k2p'
  SubnetId: 'subnet-pad6l61i'

环境变量对象

环境变量对象描述了函数可以配置的环境变量属性,环境变量配置为一系列的键值对。

属性名称 类型 描述
Variables StringString 的映射 定义环境变量的字符串对字符串映射,其中变量名为 key,变量值为 value。变量名限制为字母与数字组合,且第一个字符需要为字母。变量值定义为字母与数字及特殊字符 _(){}[]$*+-\/"#',;.@!? 的组合。

示例:环境变量对象

Environment:
  Variables:
    MYSQL_USER: root
    MYSQL_PASS: pass

数据类型

COS 对象

通过指定 BucketKey 指定对象存储位置,用于指向代码存储位置。
示例:

CodeUri:
  Bucket: mycodebucket
  Key: '/code.zip'

CodeUri

CodeUri 用来指定代码存储的位置,可以指定为本地文件系统中的文件、文件夹、zip 包。
示例:

CodeUri: index.py
CodeUri: ./build
CodeUri: /user/code/func/build.zip

COS 通知过滤

用于指定对象存储通知时的过滤配置,由前缀过滤参数和后缀过滤参数组合而成。
示例:

Filter:
  Prefix: 'filterdir/'
  Suffix: '.jpg'
目录