全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件 ET大脑
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
函数计算

示例1. Hello World

更新时间:2018-08-08 16:27:46

本示例为函数计算的入门教程,介绍使用函数计算编写 Hello World 的步骤。

简介

有三种方式创建函数:使用控制台、使用命令行工具 fcli、使用 SDK。正如文章 函数计算使用流程 所介绍,使用函数计算的步骤为:新建服务 -> 新建函数 -> 执行函数

使用控制台编写函数

参考文章 使用控制台,按照 新建服务 -> 新建函数 -> 执行函数 的步骤介绍。

  • 新建服务,服务名为 demo(您可以设置自己的服务名)。
    • 配置日志项目 LogProject 和日志仓库 logStore ,该服务下函数的日志会打到日志仓库中,有关日志的更多信息,请参考 函数日志
    • 角色创建方式选择 新建角色 -> 点击授权,系统会创建一个拥有访问日志服务权限的角色。
  • 新建函数
    • 触发器配置:不创建触发器。
    • 所在服务:demo。
    • 函数名称:testHelloWorld (您可以设置自己的函数名)。
    • 运行环境根据您熟悉的语言选择
      • 如果您选择的语言是 java,请参考文章 Java runtime 。控制台不支持 java 函数的在线编辑,需要您打成 jar 包上传至控制台。
    • 环境变量无需设置。
    • 函数入口根据提示填写。
    • 函数执行内存为为此函数分配的内存大小,默认为 512 M,最大为 3072 M,如果您需要更大内存可以 联系我们
    • 超时时间为函数执行的最大时间,函数运行超过这个时间会强制结束。
    • 跳过权限配置过程。
    • 完成函数创建过程。

在代码编辑页面输入默认的 Hello World 函数(控制台编辑器的默认函数就是 Hello World 函数),点击执行,在控制台可以看到执行结果和执行日志。

HelloWorldResult

函数计算控制台只可以查看当前的执行信息和执行,想要查看函数历史的执行日志可在 日志服务控制台 查看,有关更多信息,请参考 函数日志

使用 fcli 创建函数

准备工作

下载函数计算命令行工具 fcli ,执行 fcli shell 进入交互模式。有关 fcli 的更多信息请参考 fcli

如果您是第一次使用 fcli,请按提示配置 endpointaccess key id / secret 等信息。

  • 如果下载fcli工具遇到网络卡顿情况,可以点击这里下载: linux; mac; windows.

编写代码

在当前目录下创建名为 code 的目录,在 code 目录下创建 hello_world.js 文件(或 hello_world.py, 后面 python 版本示例都是同名的规则,之后不再赘述),实现名为 handler 的 nodejs 事件处理函数。

  1. 'use strict';
  2. module.exports.handler = function(event, context, callback) {
  3. console.log('hello world');
  4. callback(null, 'hello world');
  5. };
  1. # -*- coding: utf-8 -*-
  2. def handler(event, context):
  3. print "hello world"
  4. return 'hello world'
  1. package example;
  2. import com.aliyun.fc.runtime.Context;
  3. import com.aliyun.fc.runtime.StreamRequestHandler;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. public class HelloFC implements StreamRequestHandler {
  8. @Override
  9. public void handleRequest(
  10. InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
  11. outputStream.write(new String("hello world").getBytes());
  12. }
  13. }'
  14. // pom.xml
  15. <dependency>
  16. <groupId>com.aliyun.fc.runtime</groupId>
  17. <artifactId>fc-java-core</artifactId>
  18. <version>1.0.0</version>
  19. </dependency>

Nodejs 的函数签名为 function(event, context, callback)。用户通过调用 callback 返回结果。有关更多信息请参考 Nodejs Runtime

Python 的函数签名为 def handler(event, context),有关更多信息请参考 Python Runtime

使用 Java 时需要将函数和依赖打成 Jar 包上传,更多信息请参考 Java Runtime

新建服务

在 fcli shell 中

  1. >>> mks demo # 创建名为 demo 的服务
  2. >>> cd demo # 进入 demo 服务内

新建函数

  1. # Nodejs 版
  2. >>> mkf testHelloWorld -h hello_world.handler -d code -t nodejs6
  3. # Python 版
  4. >>> mkf testHelloWorld -h hello_world.handler -d code -t python2.7
  5. # Java 版
  6. >>> mkf testHelloWorld -h example.HelloFC::handleRequest -d code -t java8

参数详解

  • -h 指定事件处理函数,即指定 handler

    • 对于 Python 和 Nodejs,handler 格式为 {file}.{method}。例如 hello_world.handler 指定了函数的调用入口为 hello_world.js 文件中的 handler 函数
    • 对于 Java,handler 格式为 {package}.{class}::{method}。例如包名是 example,类名是 HelloFC,那么创建函数时指定的 Handler 为 example.HelloFC::handleRequest
  • -d 指定文件所在目录。-d code 告诉 fcli 将当前目录下名为 code 的目录下的文件作为代码文件。fcli 将为您打包代码并上传到函数计算服务。

    • 代码打包要求您的机器上已安装 docker。docker 的具体安装步骤,请参阅 相关文档
    • 国内用户访问 docker 官方镜像库速度较慢,建议您使用阿里云镜像加速服务,具体设置请参阅 相关文档
    • 在 linux 下使用 docker,要求有 root 权限。所以您需要使用 sudo fcli shell 的方式启动命令行工具;或者您可以参照 相关文档 设置,以非 root 用户管理 docker。
    • 此外,您也可以将代码存放在 OSS 中,指定 OSS 路径并授予函数计算访问该 OSS 位置的权限。
  • -t 指定了函数的运行环境。目前我们支持 nodejs,python 和 java

  • 您还可以通过 -m 参数指定函数运行的内存资源规格,默认为 512 MB

  • 更多参数请参考:mkf --help

执行函数

  1. invk testHelloWorld

可以看到执行结果为 hello world

查看日志

  1. logs testHelloWorld

logs 命令可以查看函数历史执行日志,不单可以查看本次执行日志。

使用 SDK 创建函数

当前目录下,有一个 code 文件夹,code 文件夹中有函数文件 index.js 文件,文件的内容是 hello world 代码 。将 code 文件夹打成 zip 包 code.zip。下面对使用 SDK 创建函数并触发函数执行过程进行介绍。有关各个 SDK 的详细信息请参考

Python SDK 创建函数并且调用函数执行:

  1. import fc2
  2. client = fc2.Client(
  3. endpoint='<Your Endpoint>',
  4. accessKeyID='<Your AccessKeyID>',
  5. accessKeySecret='<Your AccessKeySecret>')
  6. # Create service.
  7. client.create_service('demo')
  8. # Create function.
  9. client.create_function('demo', 'testHelloWorld', 'nodejs6', 'hello_world.handler', codeDir = 'code')
  10. # Invoke function synchronously.
  11. client.invoke_function('demo', 'testHelloWorld')

Nodejs SDK 创建函数并且调用函数执行:

  1. 'use strict';
  2. var FCClient = require('@alicloud/fc2');
  3. var fs = require('fs');
  4. var client = new FCClient('<account id>', {
  5. accessKeyID: '<access key id>',
  6. accessKeySecret: '<access key secret>',
  7. region: 'cn-shanghai',
  8. timeout: 10000 // Request timeout in milliseconds, default is 10s
  9. });
  10. var serviceName = '<service name>';
  11. var funcName = '<function name>';
  12. client.createService(serviceName).then(function(resp) {
  13. console.log('create service: %j', resp);
  14. return client.createFunction(serviceName, {
  15. functionName: funcName,
  16. handler: 'code/index.handler',
  17. memorySize: 128,
  18. runtime: 'nodejs6',
  19. code: {
  20. zipFile: fs.readFileSync('/tmp/code.zip', 'base64'),
  21. },
  22. });
  23. }).then(function(resp) {
  24. console.log('create function: %j', resp);
  25. return client.invokeFunction(serviceName, funcName);
  26. }).then(function(resp) {
  27. console.log('invoke function: %j', resp);
  28. }).catch(function(err) {
  29. console.error(err);
  30. });

Java SDK 创建函数并且调用函数执行:

  1. import com.aliyuncs.fc.client.FunctionComputeClient;
  2. import com.aliyuncs.fc.model.Code;
  3. import com.aliyuncs.fc.request.*;
  4. import com.aliyuncs.fc.response.*;
  5. import java.io.IOException;
  6. public class testJavaSDK {
  7. private static final String CODE_DIR = "../code";
  8. private static final String REGION = "cn-shanghai";
  9. private static final String SERVICE_NAME = "demo";
  10. private static final String FUNCTION_NAME = "testHelloWorld";
  11. public static void main(final String[] args) throws IOException {
  12. String accountId = "<account id>";
  13. String accessKey = "<access key id>";
  14. String accessSecretKey = "<access key secret>";
  15. // Initialize FC client
  16. FunctionComputeClient fcClient = new FunctionComputeClient(REGION, accountId, accessKey, accessSecretKey);
  17. // Set to a specific endpoint in case needed, endpoint sample: http://123456.cn-hangzhou.fc.aliyuncs.com
  18. // fcClient.setEndpoint("http://{accountId}.{regionId}.fc.aliyuncs.com.");
  19. // Create a service
  20. CreateServiceRequest csReq = new CreateServiceRequest();
  21. csReq.setServiceName(SERVICE_NAME);
  22. csReq.setDescription("FC test service");
  23. CreateServiceResponse csResp = fcClient.createService(csReq);
  24. System.out.println("Created service, request ID " + csResp.getRequestId());
  25. // Create a function
  26. CreateFunctionRequest cfReq = new CreateFunctionRequest(SERVICE_NAME);
  27. cfReq.setFunctionName(FUNCTION_NAME);
  28. cfReq.setDescription("Function for test");
  29. cfReq.setMemorySize(128);
  30. cfReq.setHandler("index.handler");
  31. cfReq.setRuntime("nodejs6");
  32. Code code = new Code().setDir(CODE_DIR);
  33. cfReq.setCode(code);
  34. cfReq.setTimeout(10);
  35. CreateFunctionResponse cfResp = fcClient.createFunction(cfReq);
  36. System.out.println("Created function, request ID " + cfResp.getRequestId());
  37. // Invoke the function with a string as function event parameter, Sync mode
  38. InvokeFunctionRequest invkReq = new InvokeFunctionRequest(SERVICE_NAME, FUNCTION_NAME);
  39. InvokeFunctionResponse invkResp = fcClient.invokeFunction(invkReq);
  40. System.out.println(new String(invkResp.getContent()));
  41. }
  42. }
  43. // pom.xml
  44. <?xml version="1.0" encoding="UTF-8"?>
  45. <project xmlns="http://maven.apache.org/POM/4.0.0"
  46. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  47. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  48. <modelVersion>4.0.0</modelVersion>
  49. <groupId>testSDK</groupId>
  50. <artifactId>testSDK</artifactId>
  51. <version>1.0-SNAPSHOT</version>
  52. <dependencies>
  53. <dependency>
  54. <groupId>com.aliyun</groupId>
  55. <artifactId>aliyun-java-sdk-fc</artifactId>
  56. <version>1.1.8</version>
  57. </dependency>
  58. </dependencies>
  59. </project>
本文导读目录