全部产品
阿里云办公

Hello World示例

更新时间:2018-09-19 10:36:01

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

简介

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

使用控制台编写函数

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

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

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

helloworldres

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

使用 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. <?php
  2. function handler($event, $context) {
  3. $logger = $GLOBALS['fcLogger'];
  4. $logger->info("hello world");
  5. return "hello world";
  6. }
  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

Php 的函数签名为 function handler($event, $context),有关更多信息请参考 PHP 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. # Php 版
  6. >>> mkf testHelloWorld -h hello_world.handler -d code -t php7.2
  7. # Java 版
  8. >>> mkf testHelloWorld -h example.HelloFC::handleRequest -d code -t java8

参数详解

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

    • 对于 Python、Nodejs和Php,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, php 和 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>