Python ハンドラを使用して、受信イベントを処理し、ビジネスロジックを実行できます。 このトピックでは、Python ハンドラの概念と構造について説明し、例を示します。
ハンドラとは
FC 関数のハンドラは、リクエストを処理する機能コード内のメソッドです。お客様の FC 関数が呼び出されると、Function Compute は、指定されたハンドラを実行してリクエストを処理します。ハンドラは、Function Compute コンソールの ハンドラー 設定で設定できます。
Python の FC 関数では、ハンドラは filename.method_name の形式になります。 たとえば、ファイル名が main.py で、メソッド名が handler の場合、ハンドラは main.handler になります。
FC 関数の作成の詳細については、「イベントトリガー関数の作成」をご参照ください。
ハンドラの構成は、Function Compute の構成仕様に準拠する必要があります。 構成仕様はハンドラタイプによって異なります。
ハンドラのシグネチャ
次のコードは、基本的なハンドラのシグネチャを示しています。
def handler(event, context):
return 'hello world'ハンドラのシグネチャには、次のパラメーターが含まれます。
handler: メソッドの名前です。これは、Function Compute コンソールで ハンドラー 設定を使用して設定するハンドラと一致させる必要があります。たとえば、FC のハンドラをmain.handlerに設定した場合、Function Compute はhandlerメソッドをmain.pyで定義されているとおりにロードし、handler関数を実行します。event:関数に渡されるデータを含むパラメーター。 Python 2.7 ランタイムでは文字列ですが、Python 3 ランタイムではバイト列です。context:呼び出しに関する FC の情報を提供するオブジェクト。
HTTP トリガーまたはカスタムドメイン名を使用して関数にアクセスする場合は、HTTP レスポンスを定義する前にリクエスト構造体を取得してください。 詳細については、「HTTP トリガーを使用した関数の呼び出し」をご参照ください。
例 1:JSON 形式のイベントの解析
サンプルコード
Function Compute は、JSON 形式のイベントのコンテンツを関数に直接渡します。 このコンテンツはコードで解析する必要があります。 次のサンプルコードは、JSON 形式のイベントを解析する方法を示しています。
# -*- coding: utf-8 -*-
import json
def handler(event, context):
evt = json.loads(event)
return evt['key']前提条件
操作手順
Function Compute コンソールにログインします。 左側のナビゲーションウィンドウで、を選択します。
トップナビゲーションバーでリージョンを選択し、[関数] ページで目的の関数をクリックします。
関数詳細ページで、コード タブをクリックします。コードエディタにサンプルコードを入力し、デプロイメントコード をクリックします。
重要サンプルコードでは、ハンドラは
index.py内のhandlerメソッドです。 ご利用の関数のハンドラ構成が異なる場合は、それに応じてファイル名とメソッド名を更新してください。コード タブで、関数のテスト の横にある矢印アイコン
をクリックして テストパラメーターの設定 を選択し、次のサンプルパラメーターを入力してから OK をクリックします。{ "key": "value" }関数のテスト をクリックします。
関数が実行されると、期待されるレスポンスは
valueです。
例 2:OSS リソースへの安全なアクセス
Python 3.12 のサンプルコード
Python 3.12 ランタイムでは、`credentials` フィールドがコンテキストから削除されました。 代わりに、ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN 環境変数を使用して Object Storage Service (OSS) にアクセスできます。 次のコードに例を示します。 詳細については、「AccessKey の作成」および「AssumeRole」をご参照ください。
import json
import oss2
import os
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 のサンプルコード
Object Storage Service が提供する Function Compute を使用して 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) コンソールにログインして、ロールに必要な権限を付与できます。
前提条件
操作手順
Function Compute コンソールにログインします。 左側のナビゲーションウィンドウで、を選択します。
トップナビゲーションバーでリージョンを選択し、[関数] ページで対象の関数をクリックします。
関数詳細ページでコードタブをクリックし、コードエディタにサンプルコードを入力してからデプロイメントコードをクリックします。
重要サンプルコードでは、ハンドラは
index.py内のhandlerメソッドです。 ご利用の関数のハンドラ構成が異なる場合は、それに応じてファイル名とメソッド名を更新してください。コード タブで、関数のテスト の横にある矢印アイコン
をクリックし、テストパラメーターの設定 を選択します。次のサンプルパラメーターを入力し、OK をクリックします。{ "endpoint": "http://oss-cn-shenzhen-internal.aliyuncs.com", "bucket": "oss-********", "objectName": "oss-test-object", "message": "oss-test-content" }関数のテスト をクリックします。
関数が実行されると、期待されるレスポンスは
successです。
例 3:外部コマンドの呼び出し
Python 関数は、fork プロセスを作成して外部コマンドを呼び出すこともできます。 たとえば、subprocess モジュールを使用して 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 トリガーの設定」をご参照ください。
操作手順
Function Compute コンソールにログインします。 左側のナビゲーションウィンドウで、を選択します。
上部のナビゲーションバーでリージョンを選択し、[関数] ページで対象の関数をクリックします。
関数の詳細ページで、[トリガー] タブをクリックして、HTTP トリガーのパブリックエンドポイントを見つけます。
次の curl コマンドを実行して関数を呼び出します。
curl -i "https://test-python-ipgrwr****.cn-shanghai.fcapp.run" -d 'Hello fc3.0'上記のコマンドで、
https://test-python-ipgrwr****.cn-shanghai.fcapp.runは HTTP トリガーのパブリックエンドポイントです。次のレスポンスが返されます。
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 トリガーのリクエスト形式に準拠していない場合、エラーが発生します。
例えば、Function Compute コンソールで、テストイベントを "Hello, FC!" に設定し、関数のテスト をクリックすると、関数は次の応答を返します。
The request did not come from an HTTP Trigger, event: "Hello, FC!"