Handler adalah titik masuk fungsi Function Compute Anda—menerima event masuk dan berisi logika untuk memprosesnya. Topik ini mencakup tanda tangan handler Python, parameter, properti objek konteks, serta pola penggunaan umum disertai contoh yang dapat dijalankan.
Cara kerja
Saat sebuah fungsi dipanggil, Function Compute memanggil metode yang Anda tentukan dalam parameter Handler. Handler menerima dua argumen—muatan event dan konteks waktu proses—memproses event tersebut, lalu mengembalikan hasil.
Handler Python menggunakan format namafile.nama_metode. Misalnya, jika file Anda bernama main.py dan metode Anda bernama handler, atur Handler menjadi main.handler.
Untuk mengubah nama handler:
Di Konsol Function Compute, klik Functions di panel navigasi sebelah kiri.
Klik fungsi yang ingin Anda perbarui.
Pada tab Code, gulir ke pengaturan waktu proses dan edit bidang Handler.
Untuk menggunakan pemicu HTTP atau nama domain kustom, uraikan struktur permintaan HTTP terlebih dahulu sebelum menyusun respons. Lihat Gunakan pemicu HTTP untuk memanggil fungsi.
Tanda tangan handler
def handler(event, context):
return 'hello world'Parameter
| Parameter | Tipe | Deskripsi |
|---|---|---|
event | str (Python 2.7) / bytes (Python 3) | Muatan event yang diteruskan saat pemanggilan. Muatan JSON diteruskan apa adanya dan harus diurai dalam kode Anda. |
context | object | Konteks waktu proses yang disediakan saat pemanggilan. Berisi kredensial dan metadata tentang fungsi yang sedang berjalan. |
Pemetaan tipe JSON
Saat event berupa objek JSON, uraikan dengan json.loads() untuk mendapatkan tipe Python asli:
| Tipe JSON | Tipe Python |
|---|---|
| object | dict |
| array | list |
| number | int atau float |
| string | str |
| Boolean | bool |
| null | NoneType |
Objek konteks
Objek context menyediakan informasi waktu proses tentang pemanggilan saat ini:
| Properti | Deskripsi |
|---|---|
context.credentials.access_key_id | ID AccessKey sementara (Python 3.10 dan sebelumnya) |
context.credentials.access_key_secret | Rahasia AccessKey sementara (Python 3.10 dan sebelumnya) |
context.credentials.security_token | Token keamanan Security Token Service (STS) (Python 3.10 dan sebelumnya) |
Pada waktu proses Python 3.12, bidang credentials dihapus dari context. Gunakan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET, dan ALIBABA_CLOUD_SECURITY_TOKEN sebagai gantinya.
Praktik terbaik
| Praktik | Alasan |
|---|---|
| Pisahkan logika handler dari logika bisnis | Jaga agar handler tetap ringkas dan delegasikan ke fungsi pembantu. Hal ini mempermudah pengujian unit. |
| Gunakan variabel lingkungan untuk kredensial | Jangan pernah menyematkan pasangan AccessKey secara langsung. Gunakan kredensial sementara dari context.credentials (Python 3.10) atau variabel lingkungan (Python 3.12). |
| Uraikan event di awal | Panggil json.loads(event) segera agar sisa kode Anda bekerja dengan tipe Python asli. |
Prasyarat
Sebelum menjalankan contoh di bawah, pastikan Anda telah:
Membuat fungsi event dalam waktu proses Python
Contoh 1: Uraikan parameter JSON
Function Compute meneruskan muatan event tanpa modifikasi. Uraikan JSON dalam handler Anda menggunakan json.loads().
# -*- coding: utf-8 -*-
import json
def handler(event, context):
evt = json.loads(event)
return evt['key']Handler pada contoh ini adalah metode handler dalam index.py. Jika fungsi Anda menggunakan nama handler berbeda, perbarui pengaturan Handler sesuai kebutuhan.
Uji contoh ini
Masuk ke Konsol Function Compute. Di panel navigasi kiri, klik Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi untuk membukanya.
Pada tab Code, tempel kode contoh ke editor lalu klik Deploy.
Klik ikon
di samping Test Function, pilih Configure Test Parameters, masukkan muatan berikut, lalu klik OK:{ "key": "value" }Klik Test Function.
Fungsi mengembalikan value.
Contoh 2: Baca dan tulis objek OSS menggunakan kredensial sementara
Gunakan kredensial sementara yang disediakan oleh Function Compute untuk mengakses Object Storage Service (OSS)—tidak perlu rahasia yang disematkan.
Dua varian di bawah hanya berbeda dalam cara memperoleh kredensial. Logika lainnya identik.
Python 3.12
Pada Python 3.12, baca kredensial dari variabel lingkungan. Untuk informasi lebih lanjut tentang penyiapan kredensial, lihat Peroleh AccessKey dan AssumeRole.
import json
import os
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
Pada Python 3.10 dan sebelumnya, baca kredensial dari context.credentials.
import json
import oss2
def handler(event, context):
evt = json.loads(event)
creds = context.credentials
# Sertakan security_token saat menggunakan kredensial sementara STS
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'Pastikan role yang dikonfigurasi untuk fungsi memiliki izin menulis OSS. Berikan izin di Konsol Resource Access Management (RAM).
Uji contoh ini
Masuk ke Konsol Function Compute. Di panel navigasi sebelah kiri, klik Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi untuk membukanya.
Pada tab Code, tempel kode contoh ke editor lalu klik Deploy.
PentingHandler pada contoh ini adalah metode
handlerdalamindex.py. Jika fungsi Anda menggunakan nama handler berbeda, perbarui pengaturan Handler sesuai kebutuhan.Klik ikon
di samping Test Function, pilih Configure Test Parameters, masukkan muatan berikut, lalu klik OK:{ "endpoint": "http://oss-cn-shenzhen-internal.aliyuncs.com", "bucket": "oss-********", "objectName": "oss-test-object", "message": "oss-test-content" }Klik Test Function.
Fungsi mengembalikan success.
Contoh 3: Jalankan perintah eksternal
Gunakan modul subprocess untuk membuat proses fork dan menjalankan perintah sistem.
import subprocess
def handler(event, context):
ret = subprocess.check_output(['ls', '-l'])
return retContoh ini menjalankan ls -l dan mengembalikan daftar direktori.
Contoh 4: Tangani permintaan pemicu HTTP
Fungsi yang dipanggil melalui pemicu HTTP menerima event JSON terstruktur. Respons harus mencakup statusCode, headers, isBase64Encoded, dan body.
Prasyarat
Fungsi event Python dengan pemicu HTTP yang telah dikonfigurasi. Lihat Buat fungsi event dan Konfigurasikan pemicu 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 Exception:
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
}Uji contoh ini
Masuk ke Konsol Function Compute. Di panel navigasi sebelah kiri, klik Functions.
Di bilah navigasi atas, pilih wilayah. Pada halaman Functions, klik fungsi untuk membukanya.
Pada tab Code, tempel kode contoh ke editor lalu klik Deploy.
Pada tab Triggers, salin titik akhir publik pemicu HTTP.
Jalankan perintah berikut untuk memanggil fungsi:
curl -i "https://test-python-ipgrwr****.cn-shanghai.fcapp.run" -d 'Hello fc3.0'Ganti
https://test-python-ipgrwr****.cn-shanghai.fcapp.rundengan titik akhir yang Anda salin.PentingJika Authentication Method diatur ke No Authentication, panggil fungsi langsung dengan curl atau Postman.
Jika Authentication Method diatur ke Signature Authentication atau JWT Authentication, tandatangani permintaan sesuai ketentuan. Lihat Authentication.
Tanggapan akan tampak seperti:
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.0Kemungkinan error
Handler ini mengharapkan event pemicu HTTP. Jika Anda memanggilnya menggunakan Test Function di konsol dengan string biasa seperti "Hello, FC!", fungsi akan mengembalikan:
The request did not come from an HTTP Trigger, event: "Hello, FC!"