edit-icon download-icon

Hello World の例

最終更新日: Nov 30, 2018

以下の例では、​​Function Compute で hello world 関数を記述する方法について説明します。

Function Compute でサービスを作成し、そのサービスの関数を作成して、関数の実行をトリガーすることができます。詳細については、「Function Compute の操作」をご参照ください。

内容

関数を作成するには、コンソール、コマンドラインツール fcli、または SDK のいずれかを使用できます。

コンソールを使用して関数を作成する

次の例は、サービスや関数の作成方法、および関数の実行方法を示しています。詳細は、「コンソールの使用方法」をご参照ください。

  1. サービスを作成します。この例では、サービス名は demo です。必要に応じてサービス名を設定できます。

    1. ログプロジェクトと Logstore を設定します。サービスのすべての関数のログデータは同じ Logstore に収集されます。ログの詳細については、「関数ログ」をご参照ください。
    2. [ロール操作] を [新しいロールを作成] に設定し、[承認] をクリックします。Log Service にアクセスできるロールが作成されます。
  2. 関数を作成します。

    1. [トリガータイプ] を [トリガーなし] に設定します。
    2. [サービス名] を [demo] に設定します。
    3. [関数名] を設定します。この例では、[testHelloWorld] に設定されています。必要に応じて関数名を設定できます。
    4. 必要に応じてランタイム環境を選択します。
      • Java ランタイム環境を選択した場合は、「Java ランタイム環境」をご参照ください。コンソールでは、Java 関数をオンラインで編集することはできません。コンソールにアップロードする前に、関数を JAR パッケージ化する必要があります。
    5. 環境変数の設定をスキップします。
    6. プロンプトに従って、関数ハンドラを設定します。
    7. 関数の実行に必要なメモリサイズを設定します。デフォルト値は 512 MB、最大値は 3072 MB です。3072 MB を超えるメモリサイズが必要な場合は、サポートセンターへお問い合わせください。
    8. タイムアウト時間を設定します。設定した時間に関数の実行が強制的に停止します。
    9. 許可設定をスキップします。
    10. 関数の作成プロセスを完了します。
  3. コンソールのコード編集ページでデフォルトの hello world 関数を入力し、[実行] をクリックします。実行結果および実行ログのエントリがコンソールに表示されます。

Function Compute コンソールでは、関数の実行ステータスのみを表示できます。関数の実行ログを表示するには、 Log Service コンソールにアクセスします。詳細は、「関数ログ」をご参照ください。

fcli を使用して関数を作成する

準備

Function Compute で使用されるコマンドラインツール fcli をダウンロードし、 fcli shellコマンドを実行して対話モードに入ります。fcli の詳細については、「fcli」をご参照ください。

初めて fcli を使用する場合は、プロンプトに従ってサービスエンドポイントAccessKey を設定してください。fcli のダウンロード中にネットワークが応答しない場合は、次のリンクをクリックして fcli をダウンロードしてください。

コードを書く

現在のディレクトリにコードフォルダを作成し、コードフォルダに hello_world.js ファイルを作成します。handler という名前の Node.js-compiled 関数が作成されます。関数が Python ランタイム環境で使用されている場合は、ファイルの名前を hello_world.py にすることもできます。以下の例でも同じ命名規則を使用しています。

  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>

Node.js の関数シグネチャは function(event, context, callback) です。callback を呼び出すことで関数の戻り値を取得できます。詳細は、「Node.js ランタイム環境」をご参照ください。

Python の関数シグネチャは def handler(event, context) です。詳細は、「Python ランタイム環境」をご参照ください。

PHP の関数シグネチャは function handler($event, $context) です。詳細は、「PHPランタイム環境」をご参照ください。

Java ランタイム環境では、依存関係を持つ関数を JAR パッケージ化して、アップロードする必要があります。詳細は、「Java ランタイム環境」をご参照ください。

サービスの作成

fcli の shell モードに入ります。

  1. >>> mks demo # demo という名前のサービスを作成します。
  2. >>> cd demo # demo サービスに入ります。

関数の作成

  1. # Node.js ランタイム環境
  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:イベント処理関数であるハンドラを指定します。

    • Python, PHPや Node.js のランタイム環境では、ハンドラは {file}.{method} 形式です。たとえば、handler 引数を hello_world.handler に設定すると、hello_world.js スクリプトファイルのハンドラ関数が、ハンドラとして使用されます。
    • Java ランタイム環境では、ハンドラは {package}.{class}::{method} 形式です。たとえば、パッケージ名が example で、クラス名が HelloFC の場合、関数の作成時に指定された Handler は example.HelloFC::handleRequest です。
  • -d:ファイルディレクトリを指定します。-d code:現在のディレクトリのコードフォルダにあるファイルを、コードファイルとして使用するように fcli に指示します。fcli はコードをパッケージ化し、Function Compute にアップロードします。

    • コードをパッケージ化するには、ホストに Docker をインストールしておく必要があります。Docker のインストール方法の詳細については、「Docker のインストール」をご参照ください。
    • イメージのダウンロードが遅い場合は、Alibaba Cloud Container Service を使用することを推奨します。詳細については、「Container Service とは」をご参照ください。
    • Linux オペレーティングシステムでは、 root ユーザーだけが Docker を実行できます。sudo fcli shell コマンドを実行して、fcli を有効にしてください。関連ドキュメント に従って Linux ホストを設定し、root 以外のユーザとして Docker を管理することもできます。
    • また、OSS にコードを保存し、OSS パスを指定して、OSS パスにアクセスするための許可を Function Compute に与えることもできます。
  • -t:関数のランタイム環境を指定します。Node.js、Python、PHP、および Java をサポートしています。

  • -m パラメーターを使用して、関数の実行に割り当てられたメモリリソースを指定することもできます。デフォルトのメモリサイズは 512 MB です。

  • パラメーターの詳細については、 mkf --help をご参照ください。

関数の実行

  1. invk testHelloWorld

出力結果 hello world が表示されます。

ログの表示

  1. logs testHelloWorld

logs コマンドを実行すると、現在の関数の実行で生成されたログだけでなく、すべての履歴ログを表示できます。

SDK を使用して関数を作成する

現在のディレクトリのコードフォルダには、index.js という名前のファイルが含まれています。hello world コードがこのファイルに書き込まれます。コードフォルダを 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. # Run 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. // Run 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>