函数计算支持HTTP触发器,配置HTTP触发器的函数可以通过HTTP请求被触发执行。此时函数可以看做一个Web Server,对HTTP请求进行处理,并将处理结果返回给调用端。本文介绍如何在函数计算控制台配置HTTP触发器。

前提条件

创建服务

背景信息

创建HTTP触发器与创建其他类型的触发器不同。当您完成HTTP类型的函数创建后,系统会默认为该函数创建一个HTTP触发器,而对于其他类型的触发器,需在已创建的通过事件触发的函数中根据触发源手动创建对应的触发器。

创建触发器

  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,找到目标服务,在其右侧操作列单击函数管理
  5. 函数管理页面,单击创建函数
  6. 创建函数页面,选择从零开始创建方式,然后在基本设置区域,填写函数相关信息后单击创建
    create-function
    参数 操作 本文示例
    名称 填写自定义的函数名称。 http-function
    运行环境 选择您熟悉的语言,例如Python、Java、PHP、Node.js等。 Python3
    函数触发方式 选择通过事件触发通过 HTTP 请求触发 通过 HTTP 请求触发
    实例类型 选择弹性实例性能实例 弹性实例
    内存规格 设置函数执行内存。取值范围如下:
    • 选择弹性实例,内存规格可以为128 MB、256 MB、512 MB、1 GB、2 GB或3 GB。
    • 选择性能实例,内存规格可以为4 GB、8 GB、16 GB或32 GB。
    512 MB
    函数创建完成后,会自动创建一个默认的HTTP触发器。单击目标函数,然后单击触发器管理页签,您可以看到默认创建的HTTP触发器。http-trigger

    您可以根据需要对默认创建的HTTP触发器的配置项进行修改,包括是否需要认证请求方法。具体信息,请参见更新触发器配置

编写函数

完成创建HTTP触发器后,您可以开始编写函数代码。

在函数详情页面,单击函数代码页签,在代码编辑器中编写代码。
代码示例如下:
var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
    // get request info
    getRawBody(request, function (err, data) {
        var params = {
            path: request.path,
            queries: request.queries,
            headers: request.headers,
            method: request.method,
            body: data,
            url: request.url,
            clientIP: request.clientIP,
        }
        // you can deal with your own logic here
        // set response
        var respBody = new Buffer.from(JSON.stringify(params));
        // var respBody = new Buffer( )
        response.setStatusCode(200)
        response.setHeader('content-type', 'application/json')
        response.send(respBody)
    })
};
# -*- coding: utf-8 -*-
import json
HELLO_WORLD = b"Hello world!\n"
def handler(environ, start_response):
    request_uri = environ['fc.request_uri']
    response_body = {
      'uri':environ['fc.request_uri'],
      'method':environ['REQUEST_METHOD']
    }
    # do something here
    status = '200 OK'
    response_headers = [('Content-type', 'text/json')]
    start_response(status, response_headers)
    # Python2
    return [json.dumps(response_body)]
    # Python3 tips: When using Python3, the str and bytes types cannot be mixed.
    # Use str.encode() to go from str to bytes
    # return [json.dumps(response_body).encode()]
<?php
use RingCentral\Psr7\Response;
function handler($request, $context): Response{
    /*
    $body       = $request->getBody()->getContents();
    $queries    = $request->getQueryParams();
    $method     = $request->getMethod();
    $headers    = $request->getHeaders();
    $path       = $request->getAttribute("path");
    $requestURI = $request->getAttribute("requestURI");
    $clientIP   = $request->getAttribute("clientIP");
    */
    return new Response(
        200,
        array(
            "custom_header1" => "v1",
            "custom_header2" => ["v2", "v3"],
        ),
        "hello world"
    );
}

测试函数

您可以使用函数计算控制台或浏览器发送HTTP请求来测试函数的正确性。

使用控制台测试函数
在函数详情页面,单击函数代码页签,然后单击测试函数
执行完成后,在函数代码页签,您可以看到执行成功的提示。http-function-result
使用浏览器测试函数
  1. 组装HTTP触发器URL。
    HTTP触发器URL的组装规则如下:
    <account_id>.<region>.fc.aliyuncs.com/<version>/proxy/<serviceName>/<functionName>/[action?queries]            

    示例如下:

    123456.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/serviceName/functionName/action?hello=world           
    URL中的参数说明如下:
    参数 说明
    account_id 阿里云账号ID。

    您可以在安全设置中获取您的账号ID。如果您是RAM用户,将鼠标移至控制台右上角的头像处可以看到您的阿里云账号ID。

    region 函数计算服务所在的地域。
    version 函数计算的API版本。
    serviceName 服务名称。
    functionName 函数名称。
    action 自定义的请求路径。
    queries 查询参数。
  2. 将HTTP触发器URL输入浏览器地址栏,按回车键执行。
    浏览器中会返回执行结果。

常见问题

为什么HTTP函数无法执行?

为什么函数无法结束?

请检查是否调用返回函数。
  • Node.js需调用response.send()
  • Python需调用return
  • PHP需调用return new Response()
  • Java需调用HttpServletResponse
  • C#需调用return
  • Custom Runtime以各语言示例为准。

错误排查

错误主要分为以下两种:
  • 请求错误是指发送的Request不符合标准,在Response里报错状态码为4xx。
  • 函数错误即编写的函数有问题,会报5xx状态码。
下表描述了请求错误和函数错误可能出现的场景,以便您迅速排查问题。
错误类型 X-Fc-Error-Type HTTP状态码 原因分析 是否计费
请求错误 FcCommonError 400 您的请求超过Request限制项的限制。更多信息,请参见使用限制
FcCommonError 400 调用需要身份认证的函数的Request没有传入Date信息或Authorization信息。
FcCommonError 403 调用需要身份认证的函数的Request的签名错误,即Authorization不正确,由于Date参与签名计算,且超过15 min,签名失效,一种常见的原因是使用需要访问认证的HTTP触发器,Request header中发送的Date据当前时间超过15 min,导致签名失效。
FcCommonError 403 您的Request请求使用了HTTP触发器中未配置的请求方法。例如,HTTP触发器中的请求方法只配置了GET方法,却发送POST方法的HTTP请求。
FcCommonError 404 向没有设置HTTP触发器的函数发送HTTP请求。
用户流控 FcCommonError 429 用户被流控,可减小并发量或者联系函数计算开发团队提高并发度。
函数错误 UnhandledInvocationError 502 函数的返回值超过Response限制项的限制。更多信息,请参见使用限制
UnhandledInvocationError 502 函数代码有语法错误或者异常。
UnhandledInvocationError 502 向未使用HTTP入口函数的函数发送HTTP请求。
系统错误 FcCommonError 500 函数计算系统错误,可重试解决。
系统流控 FcCommonError 503 函数计算系统流控。可用指数退避方式重试。

如果问题还未能解决,请联系我们

更多信息

除了函数计算控制台,您还可通过以下方式配置触发器:
  • 通过Serverless Devs工具配置触发器。更多操作,请参见Serverless Devs
  • 通过SDK配置触发器。更多操作,请参见SDK列表

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