すべてのプロダクト
Search
ドキュメントセンター

Function Compute:ハンドラー

最終更新日:Nov 11, 2024

Pythonハンドラーを使用して、受信したイベントに応答し、対応するビジネスロジックを実行できます。 このトピックでは、Pythonハンドラーの概念と構造について説明し、例を示します。

ハンドラーとは何ですか?

Function Computeの関数のハンドラーは、関数コードでリクエストを処理するために使用されるメソッドです。 関数が呼び出されると、Function Computeは設定したハンドラーを使用してリクエストを処理します。 function Computeコンソールhandlerパラメーターを使用して、関数のハンドラーを設定できます。

Function ComputeのPython関数のハンドラーは、File name.Method name形式に従います。 たとえば、ファイル名がmain.pyで、メソッド名がhandlerの場合、ハンドラーはmain.handlerです。

Function Computeの関数と関連する操作の詳細については、「イベント関数の作成」をご参照ください。

ハンドラーの設定は、Function Computeの設定仕様に準拠している必要があります。 設定の仕様は、ハンドラーの種類によって異なります。

ハンドラー署名

次のサンプルコードは、単純なハンドラー署名を示しています。

def handler(event, context):
    return 'hello world'

パラメーターの説明:

  • handler: メソッドの名前。 このメソッドは、Function ComputeコンソールHandlerパラメーターに指定された値に対応します。 たとえば、Function Compute関数のハンドラーをmain.handlerに設定した場合、Function Computemain.pyで定義されているhandlerメソッドを読み込み、handlerから関数を実行します。

  • event: 関数を呼び出すときに渡されるパラメーター。 Python 2.7ランタイムでは、このパラメーターの値は文字列データ型です。 Python 3ランタイムでは、このパラメーターの値はbytesデータ型です。

  • context: Function Compute関数が呼び出されたときに提供されるランタイムコンテキスト情報。

説明

HTTPトリガーまたはカスタムドメイン名を使用して関数にアクセスする場合は、HTTP応答を定義する前にリクエスト構造体を取得してください。 詳細については、「HTTPトリガーを使用した関数の呼び出し」をご参照ください。

例1: JSON形式のパラメーターの解析

サンプルコード

JSON形式のパラメーターをFunction Computeの関数に渡すと、Function Computeがパラメーターを通過し、コード内のパラメーターを解析する必要があります。 次のサンプルコードは、JSON形式のイベントを解析する方法の例を示しています。

# -*- coding: utf-8 -*-
import json
def handler(event, context):
    evt = json.loads(event)
    return evt['key']

始める前に

イベント関数の作成

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、[コード] タブをクリックします。 コードエディターで、上記のサンプルコードを入力し、[デプロイ] をクリックします。

    重要

    上記のサンプルコードでは、ハンドラーはindex.pyhandlerメソッドです。 関数のハンドラーが異なる場合は、実際のハンドラー設定を使用します。

  4. コードタブで、テスト機能の隣のdownアイコンをクリックします。テストパラメーターの設定ドロップダウンリストから、次のサンプルコードにテストパラメーターを入力し、OKをクリックします。

    {
      "key": "value"
    }
  5. テスト機能をクリックします。

    関数の実行後、実行結果が返されます。 この例の実行結果はvalueです。

例2: 一時的なAccessKeyペアを使用したOSSリソースの読み取りと書き込み

Python 3.12サンプルコード

Python 3.12ランタイムでは、コンテキストの資格情報フィールドが削除されます。 ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET、およびALIBABA_CLOUD_SECURITY_TOKEN環境変数を使用して、Object Storage Service (OSS) にアクセスできます。 次のコードスニペットは、例を示しています。詳細については、「AccessKeyの取得」および「AssumeRole」をご参照ください。

import json
import oss2

def handler(event, context):
    evt = json.loads(event)
    auth = oss2.StsAuth(os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), os.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
    bucket = oss2.Bucket(auth, evt['endpoint'], evt['bucket'])
    bucket.put_object(evt['objectName'], evt['message'])
    return 'success'

Python 3.10サンプルコード

Function Computeが提供する一時キーペアを使用して、Object Storage Serviceにアクセスできます。 次のコードスニペットに例を示します。OSS

import json
import oss2

def handler(event, context):
    evt = json.loads(event)
    creds = context.credentials
    # do not forget security_token
    auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
    bucket = oss2.Bucket(auth, evt['endpoint'], evt['bucket'])
    bucket.put_object(evt['objectName'], evt['message'])
    return 'success'

上記のサンプルコードでは、creds = context.credentialsは、contextから一時的なAccessKeyペアを取得することを指定しています。 これにより、秘密などの機密情報のハードコーディングが防止される。

重要

設定されたロールにOSSにアクセスする権限があることを確認します。 Resource Access Management (RAM) コンソールにログインし、OSSへのアクセス権限をロールに付与できます。

始める前に

イベント関数の作成

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、[コード] タブをクリックします。 コードエディターで、上記のサンプルコードを入力し、[デプロイ] をクリックします。

    重要

    上記のサンプルコードでは、ハンドラーはindex.pyhandlerメソッドです。 関数のハンドラーが異なる場合は、実際のハンドラー設定を使用します。

  4. コードタブで、テスト機能隣のdownアイコンをクリックします。テストパラメーターの設定ドロップダウンリストから、次のサンプルコードにテストパラメーターを入力し、OK をクリックします。

    {
      "endpoint": "http://oss-cn-shenzhen-internal.aliyuncs.com",
      "bucket": "oss-********",
      "objectName": "oss-test-object",
      "message": "oss-test-content"
    }
  5. テスト機能をクリックします。

    関数の実行後、実行結果が返されます。 この例では、successが返されます。

例3: 外部コマンドの呼び出し

Pythonプログラムを使用して、外部コマンドを呼び出すforkプロセスを作成できます。 たとえば、Linuxでサブプロセスモジュールを使用してls -lコマンドを呼び出すことができます。 現在のディレクトリのファイルが返されます。 次のサンプルコードは例を示しています。

import os
import subprocess

def handler(event, context):
    ret = subprocess.check_output(['ls', "-l"])
    return ret

例4: HTTPトリガーを使用して関数を呼び出す

サンプルコード

HTTPトリガーのリクエストペイロードとレスポンスペイロードの形式の詳細については、「HTTPトリガーを使用して関数を呼び出す」をご参照ください。

# -*- coding: utf-8 -*-
import logging
import json
import base64

def handler(event, context):
    logger = logging.getLogger()
    logger.info("receive event: %s", event)

    try:
        event_json = json.loads(event)
    except:
        return "The request did not come from an HTTP Trigger because the event is not a json string, event: {}".format(event)
    
    if "body" not in event_json:
        return "The request did not come from an HTTP Trigger because the event does not include the 'body' field, event: {}".format(event)
    req_body = event_json['body']
    if 'isBase64Encoded' in event_json and event_json['isBase64Encoded']:
        req_body = base64.b64decode(event_json['body']).decode("utf-8")

    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'text/plain'},
        'isBase64Encoded': False,
        'body': req_body
    }

あなたが始める前に

Pythonランタイムで関数を作成するには、上記の例を使用します。 関数のHTTPトリガーを設定します。 詳細については、「イベント関数の作成」および「HTTPリクエストで関数を呼び出すHTTPトリガーの設定」をご参照ください。

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、[トリガー] タブをクリックして、HTTPトリガーのパブリックエンドポイントを取得します。

  4. curlで次のコマンドを実行して、関数を呼び出します。

    curl -i "https://test-python-ipgrwr****.cn-shanghai.fcapp.run" -d 'Hello fc3.0'

    上記のコマンドでは、https:// test-python-ipgrwr **** .cn-shanghai.fcapp.ru nがHTTPトリガーの取得されたパブリックエンドポイントです。

    重要
    • HTTPトリガーの [認証方法] パラメーターが [認証なし] に設定されている場合、Postmanまたはcurlを使用して関数を呼び出すことができます。 詳細については、「手順」をご参照ください。

    • HTTPトリガーの [認証方法] パラメーターが [署名認証] または [JWT認証] に設定されている場合は、署名方法またはJWT認証方法を使用して関数を呼び出します。 詳細については、「認証」をご参照ください。

    次の応答が返されます。

    HTTP/1.1 200 OK
    Content-Disposition: attachment
    Content-Length: 12
    Content-Type: application/json
    X-Fc-Request-Id: 1-64f7449a-127fbe39cd7681596e33ebad
    Date: Tue, 05 Sep 2023 15:09:14 GMT
    
    Hello fc3.0

考えられるエラー

サンプルコードは、HTTPトリガーまたはカスタムドメイン名を使用して呼び出すことができます。 API操作を使用しても、設定されたテストパラメーターがHTTPトリガーの要求形式要件に準拠していない場合、エラーが報告されます。

たとえば、リクエストパラメーターを "Hello, FC!" として設定した後、function Computeコンソールで [Test Function] をクリックして関数を呼び出すと、次のレスポンスが返されます。

The request did not come from an HTTP Trigger, event: "Hello, FC!"