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 Computeはmain.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']
始める前に
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[コード] タブをクリックします。 コードエディターで、上記のサンプルコードを入力し、[デプロイ] をクリックします。
重要上記のサンプルコードでは、ハンドラーは
index.py
のhandler
メソッドです。 関数のハンドラーが異なる場合は、実際のハンドラー設定を使用します。コードタブで、テスト機能の隣のアイコンをクリックします。テストパラメーターの設定ドロップダウンリストから、次のサンプルコードにテストパラメーターを入力し、OKをクリックします。
{ "key": "value" }
テスト機能をクリックします。
関数の実行後、実行結果が返されます。 この例の実行結果は
value
です。
例2: 一時的なAccessKeyペアを使用したOSSリソースの読み取りと書き込み
Python 3.12サンプルコード
Python 3.12ランタイムでは、コンテキストの資格情報フィールドが削除されます。 ALIBABA_CLOUD_ACCESS_KEY_ID
、ALIBABA_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へのアクセス権限をロールに付与できます。
始める前に
手順
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
プロセスを作成できます。 たとえば、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トリガーの設定」をご参照ください。
手順
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.ru n
が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トリガーの要求形式要件に準拠していない場合、エラーが報告されます。
たとえば、リクエストパラメーターを "Hello, FC!"
として設定した後、function Computeコンソールで [Test Function] をクリックして関数を呼び出すと、次のレスポンスが返されます。
The request did not come from an HTTP Trigger, event: "Hello, FC!"