云监控触发器、云服务器ECS触发器、阿里云物联网IoT触发器等多种云服务类型的触发器统称为官方事件源触发器。本文以云服务器触发器为例介绍如何在函数计算控制台创建官方事件源触发器、编写函数和测试函数。

功能简介

您在函数计算控制台提交创建触发器的请求后,函数计算根据触发器的配置信息,将自动在阿里云官方事件总线default下创建一个事件规则服务名称-函数名称-触发器名称。创建完成后,您可以在函数计算控制台查看触发器信息,同时也可以在事件总线EventBridge控制台查看自动创建的事件规则信息。当事件源指定类型的事件投递到事件总线时,将触发该触发器关联的函数执行一次。

说明 自动创建的事件总线EventBridge的资源事件规则名称必须符合名称取值限制和要求,否则触发器无法创建成功。具体信息,请参见使用限制

注意事项

  • 事件总线EventBridge的云服务专用事件总线default上最多只能创建10个事件规则,超过10个之后将无法再创建官方事件源触发器。
  • RocketMQ触发器暂时不支持通过Serverless Devs工具或SDK创建。

前提条件

步骤一:创建触发器

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,找到目标服务,在其右侧操作列单击函数管理
  5. 函数管理页面,单击目标函数名称。
    hanshuguanli
  6. 在函数详情页面,单击触发器管理页签,从版本或别名下拉列表选择要创建触发器的版本或别名,然后单击创建触发器
    创建触发器
  7. 在创建触发器面板,填写相关信息。然后单击确定
    创建触发器面板
    参数 操作 本文示例
    触发器类型 选择云服务器 云服务器
    名称 填写自定义的触发器名称。 ecs-trigger
    版本或别名 默认值为LATEST,如果您需要创建其他版本或别名的触发器,首先您需要在函数详情页的右上角切换到该版本或别名。关于版本的简介,请参见版本简介 LATEST
    事件类型 选择自定义事件类型选中全部事件类型。如果选择自定义事件类型,您可以选择云服务器的一个或多个事件类型。 保留云盘
    事件模式内容 不支持手动编辑,您在事件类型参数中选择事件类型后,事件模式内容自动填充。关于事件模式的信息,请参见事件模式
    {
        "source": [
            "acs.ecs"
        ],
        "type": [
            "ecs:Disk:ConvertToPostpaidCompleted"
        ]
    }

    创建完成后,在触发器名称列表中显示已创建的触发器。

    ecs-trigger

步骤二:编写函数

完成云服务器触发器的创建之后,您可以编写函数代码。

在函数详情页面,单击函数代码页签,在代码编辑器中编写代码。

代码示例如下。

'use strict';
/*
To enable the initializer feature
please implement the initializer function as below:
exports.initializer = (context, callback) => {
  console.log('initializing');
  callback(null, '');
};
*/
exports.handler = (event, context, callback) => {
  console.log("event: %s", event);
  handle_event(event);
  callback(null, 'return result');
}

步骤三:测试函数

完成函数编写后,您需要调试函数以验证代码的正确性。在实际操作过程中,当阿里云官方事件源云服务器ECS产生的事件通过事件总线EventBridge投递到函数计算时,会自动触发函数执行。

云服务器ECS事件会以event的形式作为输入参数传递给函数,您可以手动将event传给函数模拟触发事件,测试函数代码是否正确。

  1. 在函数详情页面,单击函数代码页签,然后单击xialatubiao图标,从下拉列表中,选择配置测试参数
  2. 配置测试参数对话框,选择创建新测试事件编辑已有测试事件页签,填写事件名称和事件内容。然后单击确定

    event是函数计算的入口参数,具体格式如下所示。关于支持的所有官方事件源的事件内容,请参见云服务事件

    {
        "datacontenttype": "application/json;charset=utf-8",
        "aliyunaccountid": "123456789098****",
        "data": {
            "result": "accomplished",
            "diskId": "d-bp11ba7acc69nkta****"
        },
        "subject": "acs:ecs:cn-hangzhou:123456789098****:disk/d-bp11ba7acc69nkta****",
        "source": "acs.ecs",
        "type": "ecs:Disk:ConvertToPostpaidCompleted",
        "aliyunpublishtime": "2021-01-18T03:58:31.762Z",
        "specversion": "1.0",
        "aliyuneventbusname": "default",
        "id": "70c0414c-b260-4923-b584-1d6e5646****",
        "time": "2021-01-18T11:58:31.125+08:00",
        "aliyunregionid": "cn-hangzhou",
        "aliyunpublishaddr": "172.25.XX.XX"
    }
    event中涉及的参数解释如下表所示。
    参数 类型 示例值 描述
    datacontenttype String application/json;charset=utf-8 参数data的内容形式。datacontenttype只支持application/json格式。
    aliyunaccountid String 123456789098**** 阿里云账号ID。
    data Struct
    {
            "result": "accomplished",
            "diskId": "d-bp11ba7acc69nkta****"
    }
    事件内容。JSON对象,内容由发起事件的服务决定。CloudEvents可能包含事件发生时由事件生产者给定的上下文,data中封装了这些信息。
    subject String acs:ecs:cn-hangzhou:123456789098****:disk/d-bp11ba7acc69nkta**** 事件主题。
    source String acs.ecs 事件源。
    type String ecs:Disk:ConvertToPostpaidCompleted 事件类型。
    aliyunpublishtime Timestamp 2021-01-18T03:58:31.762Z 接收事件的时间。
    specversion String 1.0 CloudEvents协议版本。
    aliyuneventbusname String default 接收事件的事件总线名称。
    id String 70c0414c-b260-4923-b584-1d6e5646**** 事件ID。
    time Timestamp 2021-01-18T11:58:31.125+08:00 事件产生的时间。
    aliyunregionid String cn-hangzhou 接收事件的地域。
    aliyunpublishaddr String 172.25.XX.XX 接收事件的服务器地址。
  3. 在函数详情页面,单击函数代码页签,然后单击测试函数

验证结果

函数代码页签,您可以看到执行成功的指示。

result

更多信息

如需对创建的触发器进行修改或删除,具体操作,请参见触发器管理