Azure İşlevleri özel işleyicileri
Her İşlev uygulaması dile özgü bir işleyici tarafından yürütülür. Azure İşlevleri varsayılan olarak birçok dil işleyicisi olsa da, diğer dilleri veya çalışma zamanlarını kullanmak isteyebileceğiniz durumlar vardır.
Özel işleyiciler, İşlevler konağından olay alan basit web sunucularıdır. HTTP temel öğelerini destekleyen tüm diller özel bir işleyici uygulayabilir.
Özel işleyiciler, şu durumlarda en uygun olanlardır:
- Şu anda kullanıma sunulmayan Go veya Rust gibi bir dilde işlev uygulaması uygulayın.
- Deno gibi varsayılan olarak öne çıkarılmayan bir çalışma zamanında işlev uygulaması uygulayın.
Özel işleyicilerle, uzantı paketleri aracılığıyla tetikleyicileri ve giriş ve çıkış bağlamalarını kullanabilirsiniz.
Go ve Rust'ta hızlı başlangıçlarla Azure İşlevleri özel işleyicileri kullanmaya başlayın.
Genel bakış
Aşağıdaki diyagramda İşlevler konağı ile özel işleyici olarak uygulanan bir web sunucusu arasındaki ilişki gösterilmektedir.
- Her olay İşlevler konağına gönderilen bir isteği tetikler. Olay, Azure İşlevleri tarafından desteklenen herhangi bir tetikleyicidir.
- İşlevler ana bilgisayarı daha sonra web sunucusuna bir istek yükü gönderir. Yük, işlev için tetikleyici ve giriş bağlama verilerini ve diğer meta verileri tutar.
- Web sunucusu tek tek işlevi yürütür ve İşlevler konağına bir yanıt yükü döndürür.
- İşlevler konağı, yanıttan verileri işleme için işlevin çıkış bağlamalarına geçirir.
Özel işleyici olarak uygulanan bir Azure İşlevleri uygulamasının host.json, local.settings.json ve function.json dosyalarını birkaç kurala göre yapılandırması gerekir.
Uygulama yapısı
Özel işleyici uygulamak için uygulamanızda aşağıdaki yönlere ihtiyacınız vardır:
- Uygulamanızın kökünde bir host.json dosyası
- Uygulamanızın kökünde bir local.settings.json dosyası
- Her işlev için bir function.json dosyası (işlev adıyla eşleşen bir klasörün içinde)
- Web sunucusu çalıştıran bir komut, betik veya yürütülebilir dosya
Aşağıdaki diyagramda, bu dosyaların "MyQueueFunction" adlı bir işlev ve handler.exe adlı özel işleyici yürütülebilir dosyası için dosya sisteminde nasıl göründüğü gösterilmektedir.
| /MyQueueFunction
| function.json
|
| host.json
| local.settings.json
| handler.exe
Yapılandırma
Uygulama, host.json ve local.settings.json dosyaları aracılığıyla yapılandırılır.
host.json
host.json, İşlevler konağına HTTP olaylarını işleyebilen bir web sunucusuna işaret ederek isteklerin nereye gönderileceği bildirmektedir.
Özel işleyici, host.json dosyasını bölüm aracılığıyla customHandler
web sunucusunun nasıl çalıştırılmasıyla ilgili ayrıntılarla yapılandırarak tanımlanır.
{
"version": "2.0",
"customHandler": {
"description": {
"defaultExecutablePath": "handler.exe"
}
}
}
bölümü tarafından customHandler
defaultExecutablePath
tanımlanan bir hedefi gösterir. Yürütme hedefi, web sunucusunun uygulandığı bir komut, yürütülebilir dosya veya dosya olabilir.
Yürütülebilir dosyaya arguments
bağımsız değişken geçirmek için dizisini kullanın. Bağımsız değişkenler, gösterimi kullanarak %%
ortam değişkenlerinin (uygulama ayarları) genişletilmesine destek olur.
ile yürütülebilir dosya workingDirectory
tarafından kullanılan çalışma dizinini de değiştirebilirsiniz.
{
"version": "2.0",
"customHandler": {
"description": {
"defaultExecutablePath": "app/handler.exe",
"arguments": [
"--database-connection-string",
"%DATABASE_CONNECTION_STRING%"
],
"workingDirectory": "app"
}
}
}
Bağlama desteği
Standart tetikleyiciler ve giriş ve çıkış bağlamaları, host.json dosyanızdaki uzantı paketlerine başvurarak kullanılabilir.
local.settings.json
local.settings.json, işlev uygulamasını yerel olarak çalıştırırken kullanılan uygulama ayarlarını tanımlar. Gizli diziler içerebileceği için local.settings.json kaynak denetiminden dışlanmalıdır. Bunun yerine Azure'da uygulama ayarlarını kullanın.
Özel işleyiciler için local.settings.json olarak ayarlayın Custom
FUNCTIONS_WORKER_RUNTIME
.
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "Custom"
}
}
İşlev meta verileri
Özel işleyiciyle kullanıldığında, function.json içeriği başka bir bağlam altında işlev tanımlama yönteminizden farklı değildir. Tek gereksinim, function.json dosyalarının işlev adıyla eşleşmesi için adlı bir klasörde bulunması gerektiğidir.
Aşağıdaki function.json kuyruk tetikleyicisi ve kuyruk çıkış bağlaması olan bir işlevi yapılandırır. MyQueueFunction adlı bir klasörde olduğundan MyQueueFunction adlı bir işlev tanımlar.
MyQueueFunction/function.json
{
"bindings": [
{
"name": "myQueueItem",
"type": "queueTrigger",
"direction": "in",
"queueName": "messages-incoming",
"connection": "AzureWebJobsStorage"
},
{
"name": "$return",
"type": "queue",
"direction": "out",
"queueName": "messages-outgoing",
"connection": "AzureWebJobsStorage"
}
]
}
İstek yükü
Kuyruk iletisi alındığında İşlevler konağı, gövdede yükü olan özel işleyiciye bir HTTP gönderi isteği gönderir.
Aşağıdaki kod örnek istek yükünü temsil eder. Yük, iki üyeye sahip bir JSON yapısı içerir: Data
ve Metadata
.
Üye, Data
function.json dosyasındaki bağlamalar dizisinde tanımlanan giriş ve tetikleyici adlarıyla eşleşen anahtarlar içerir.
Üye, Metadata
olay kaynağından oluşturulan meta verileri içerir.
{
"Data": {
"myQueueItem": "{ message: \"Message sent\" }"
},
"Metadata": {
"DequeueCount": 1,
"ExpirationTime": "2019-10-16T17:58:31+00:00",
"Id": "800ae4b3-bdd2-4c08-badd-f08e5a34b865",
"InsertionTime": "2019-10-09T17:58:31+00:00",
"NextVisibleTime": "2019-10-09T18:08:32+00:00",
"PopReceipt": "AgAAAAMAAAAAAAAAAgtnj8x+1QE=",
"sys": {
"MethodName": "QueueTrigger",
"UtcNow": "2019-10-09T17:58:32.2205399Z",
"RandGuid": "24ad4c06-24ad-4e5b-8294-3da9714877e9"
}
}
}
Yanıt yükü
Kural gereği işlev yanıtları anahtar/değer çiftleri olarak biçimlendirilir. Desteklenen anahtarlar şunlardır:
Veri türü | Açıklamalar | |
---|---|---|
Outputs |
nesne | function.json dizi tarafından bindings tanımlanan yanıt değerlerini tutar.Örneğin, bir işlev "myQueueOutput" adlı bir kuyruk çıkış bağlamasıyla yapılandırılmışsa, Outputs özel işleyici tarafından kuyruğa gönderilen iletilere ayarlanan adlı myQueueOutput bir anahtar içerir. |
Logs |
dizi | İletiler İşlev çağırma günlüklerinde görünür. Azure'da çalışırken iletiler Application Insights'ta görünür. |
ReturnValue |
Dize | Çıktı function.json dosyasında olduğu gibi $return yapılandırıldığında yanıt sağlamak için kullanılır. |
Bu bir yanıt yükü örneğidir.
{
"Outputs": {
"res": {
"body": "Message enqueued"
},
"myQueueOutput": [
"queue message 1",
"queue message 2"
]
},
"Logs": [
"Log message 1",
"Log message 2"
],
"ReturnValue": "{\"hello\":\"world\"}"
}
Örnekler
Özel işleyiciler, HTTP olaylarını almayı destekleyen herhangi bir dilde uygulanabilir. Aşağıdaki örneklerde, Go programlama dilini kullanarak özel işleyicinin nasıl uygulanacakları gösterilmektedir.
Bağlamaları olan işlev
Bu örnekte uygulanan senaryo, bir ürün siparişini temsil eden yüke sahip olan öğesini kabul POST
eden adlı order
bir işlev içerir. İşleve bir sipariş gönderildiğinde, Kuyruk Depolama iletisi oluşturulur ve bir HTTP yanıtı döndürülür.
Uygulama
order adlı bir klasörde function.json dosyası HTTP ile tetiklenen işlevi yapılandırıyor.
sipariş/function.json
{
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": ["post"]
},
{
"type": "http",
"direction": "out",
"name": "res"
},
{
"type": "queue",
"name": "message",
"direction": "out",
"queueName": "orders",
"connection": "AzureWebJobsStorage"
}
]
}
Bu işlev, HTTP yanıtı döndüren ve Kuyruk depolama iletisi veren HTTP ile tetiklenen bir işlev olarak tanımlanır.
Uygulamanın kökünde, host.json dosyası (handler
Linux veya macOS'ta) adlı handler.exe
yürütülebilir dosyayı çalıştıracak şekilde yapılandırılır.
{
"version": "2.0",
"customHandler": {
"description": {
"defaultExecutablePath": "handler.exe"
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
bu, İşlevler çalışma zamanına gönderilen HTTP isteğidir.
POST http://127.0.0.1:7071/api/order HTTP/1.1
Content-Type: application/json
{
"id": 1005,
"quantity": 2,
"color": "black"
}
İşlevler çalışma zamanı, özel işleyiciye aşağıdaki HTTP isteğini gönderir:
POST http://127.0.0.1:<FUNCTIONS_CUSTOMHANDLER_PORT>/order HTTP/1.1
Content-Type: application/json
{
"Data": {
"req": {
"Url": "http://localhost:7071/api/order",
"Method": "POST",
"Query": "{}",
"Headers": {
"Content-Type": [
"application/json"
]
},
"Params": {},
"Body": "{\"id\":1005,\"quantity\":2,\"color\":\"black\"}"
}
},
"Metadata": {
}
}
Not
Yükün bazı bölümleri kısa bir süre için kaldırıldı.
handler.exe, bir web sunucusu çalıştıran ve İşlevler ana bilgisayarından işlev çağırma isteklerine yanıt veren derlenmiş Go özel işleyici programıdır.
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
)
type InvokeRequest struct {
Data map[string]json.RawMessage
Metadata map[string]interface{}
}
type InvokeResponse struct {
Outputs map[string]interface{}
Logs []string
ReturnValue interface{}
}
func orderHandler(w http.ResponseWriter, r *http.Request) {
var invokeRequest InvokeRequest
d := json.NewDecoder(r.Body)
d.Decode(&invokeRequest)
var reqData map[string]interface{}
json.Unmarshal(invokeRequest.Data["req"], &reqData)
outputs := make(map[string]interface{})
outputs["message"] = reqData["Body"]
resData := make(map[string]interface{})
resData["body"] = "Order enqueued"
outputs["res"] = resData
invokeResponse := InvokeResponse{outputs, nil, nil}
responseJson, _ := json.Marshal(invokeResponse)
w.Header().Set("Content-Type", "application/json")
w.Write(responseJson)
}
func main() {
customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
if !exists {
customHandlerPort = "8080"
}
mux := http.NewServeMux()
mux.HandleFunc("/order", orderHandler)
fmt.Println("Go server Listening on: ", customHandlerPort)
log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
}
Bu örnekte, özel işleyici HTTP olaylarını işlemek için bir web sunucusu çalıştırır ve aracılığıyla FUNCTIONS_CUSTOMHANDLER_PORT
istekleri dinleyecek şekilde ayarlanır.
İşlevler konağı konumunda /api/order
özgün HTTP isteği almış olsa da, işlev adını (klasör adı) kullanarak özel işleyiciyi çağırır. Bu örnekte, işlevi yolunda /order
tanımlanır. Konak, özel işleyiciye yolunda /order
bir HTTP isteği gönderir.
İstekler bu işleve gönderildikçe POST
, tetikleyici verileri ve işlev meta verileri HTTP istek gövdesi aracılığıyla kullanılabilir. Özgün HTTP isteği gövdesine yükünün Data.req.Body
içinde erişilebilir.
İşlevin yanıtı, üyenin Outputs
anahtarların function.json dosyasında tanımlandığı şekilde çıkışlarla eşleştiği bir JSON değeri tuttuğu anahtar/değer çiftleri halinde biçimlendirilir.
Bu, bu işleyicinin İşlevler konağına döndürdüğü örnek bir yükdür.
{
"Outputs": {
"message": "{\"id\":1005,\"quantity\":2,\"color\":\"black\"}",
"res": {
"body": "Order enqueued"
}
},
"Logs": null,
"ReturnValue": null
}
Çıktıyı message
istekten gelen sipariş verilerine eşit olarak ayarlayarak işlev, verileri yapılandırılan kuyruğa sipariş eden çıkışlar oluşturur. İşlevler ana bilgisayarı, içinde yapılandırılan res
HTTP yanıtını da çağırana döndürür.
Yalnızca HTTP işlevi
Ek bağlamaları veya çıkışları olmayan HTTP ile tetiklenen işlevler için, işleyicinizin özel işleyici isteği ve yanıt yükleri yerine doğrudan HTTP isteği ve yanıtıyla çalışmasını isteyebilirsiniz. Bu davranış host.json ayarı kullanılarak enableForwardingHttpRequest
yapılandırılabilir.
Önemli
Özel işleyiciler özelliğinin birincil amacı, şu anda Azure İşlevleri birinci sınıf desteği olmayan dilleri ve çalışma zamanlarını etkinleştirmektir. Web uygulamalarını özel işleyiciler kullanarak çalıştırmak mümkün olsa da Azure İşlevleri standart bir ters proxy değildir. Yanıt akışı, HTTP/2 ve WebSockets gibi bazı özellikler kullanılamaz. BELIRLI üst bilgiler ve yollar gibi HTTP isteğinin bazı bileşenleri kısıtlanabilir. Uygulamanız aşırı soğuk başlatmayla da karşılaşabilir.
Bu koşulları ele almak için web uygulamalarınızı Azure Uygulaması Hizmetinde çalıştırmayı göz önünde bulundurun.
Aşağıdaki örnekte ek bağlamalar veya çıkışlar olmadan HTTP ile tetiklenen bir işlevin nasıl yapılandırıldığı gösterilmektedir. Bu örnekte uygulanan senaryo, veya POST
kabul eden adlı hello
bir GET
işlev içerir.
Uygulama
hello adlı klasörde function.json dosyası HTTP ile tetiklenen işlevi yapılandırıyor.
hello/function.json
{
"bindings": [
{
"type": "httpTrigger",
"authLevel": "anonymous",
"direction": "in",
"name": "req",
"methods": ["get", "post"]
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
işlevi hem hem de GET
POST
isteklerini kabul etmek üzere yapılandırılır ve sonuç değeri adlı res
bir bağımsız değişken aracılığıyla sağlanır.
Uygulamanın kökünde, host.json dosyası çalıştırılacak handler.exe
şekilde yapılandırılır ve enableForwardingHttpRequest
olarak true
ayarlanır.
{
"version": "2.0",
"customHandler": {
"description": {
"defaultExecutablePath": "handler.exe"
},
"enableForwardingHttpRequest": true
}
}
olduğunda enableForwardingHttpRequest
true
, yalnızca HTTP işlevlerinin davranışı varsayılan özel işleyici davranışından şu şekilde farklıdır:
- HTTP isteği, özel işleyiciler istek yükünü içermez. Bunun yerine İşlevler ana bilgisayarı, işleyiciyi özgün HTTP isteğinin bir kopyasıyla çağırır.
- İşlevler ana bilgisayarı, herhangi bir sorgu dizesi parametresi de dahil olmak üzere özgün istekle aynı yola sahip işleyiciyi çağırır.
- İşlevler ana bilgisayarı, özgün isteğe yanıt olarak işleyicinin HTTP yanıtının bir kopyasını döndürür.
aşağıda İşlevler konağına gönderilen bir POST isteği yer alır. İşlevler konağı daha sonra isteğin bir kopyasını aynı yoldaki özel işleyiciye gönderir.
POST http://127.0.0.1:7071/api/hello HTTP/1.1
Content-Type: application/json
{
"message": "Hello World!"
}
handler.go dosyası bir web sunucusu ve HTTP işlevi uygular.
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
if r.Method == "GET" {
w.Write([]byte("hello world"))
} else {
body, _ := ioutil.ReadAll(r.Body)
w.Write(body)
}
}
func main() {
customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
if !exists {
customHandlerPort = "8080"
}
mux := http.NewServeMux()
mux.HandleFunc("/api/hello", helloHandler)
fmt.Println("Go server Listening on: ", customHandlerPort)
log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
}
Bu örnekte, özel işleyici HTTP olaylarını işlemek için bir web sunucusu oluşturur ve aracılığıyla FUNCTIONS_CUSTOMHANDLER_PORT
istekleri dinleyecek şekilde ayarlanır.
GET
istekler bir dize döndürülerek işlenir ve POST
istekler istek gövdesine erişebilir.
Buradaki /api/hello
order işlevinin yolu, özgün istekle aynıdır.
Not
FUNCTIONS_CUSTOMHANDLER_PORT
işlevi çağırmak için kullanılan genel kullanıma yönelik bağlantı noktası değildir. Bu bağlantı noktası, İşlevler konağı tarafından özel işleyiciyi çağırmak için kullanılır.
Dağıtılıyor
Her Azure İşlevleri barındırma seçeneğine özel bir işleyici dağıtılabilir. İşleyiciniz işletim sistemi veya platform bağımlılıkları (dil çalışma zamanı gibi) gerektiriyorsa, özel bir kapsayıcı kullanmanız gerekebilir.
Azure'da özel işleyiciler için bir işlev uygulaması oluştururken yığın olarak .NET Core'un seçilmesini öneririz.
Azure İşlevleri Core Tools kullanarak özel bir işleyici uygulaması dağıtmak için aşağıdaki komutu çalıştırın.
func azure functionapp publish $functionAppName
Not
Özel işleyicinizi çalıştırmak için gereken tüm dosyaların klasörde olduğundan ve dağıtıma dahil olduğundan emin olun. Özel işleyiciniz ikili yürütülebilir dosyaysa veya platforma özgü bağımlılıklara sahipse, bu dosyaların hedef dağıtım platformuyla eşleştiğinden emin olun.
Kısıtlamalar
- Özel işleyici web sunucusunun 60 saniye içinde başlatılması gerekir.
Örnekler
İşlevleri çeşitli dillerde uygulama örnekleri için GitHub deposu özel işleyici örneklerine bakın.
Sorun giderme ve destek
İzleme günlüğü
Özel işleyici işleminiz başlatılamıyorsa veya İşlevler konağıyla iletişimde sorun yaşıyorsa, konaktan daha fazla tanılama iletisi görmek için Trace
işlev uygulamasının günlük düzeyini artırabilirsiniz.
İşlev uygulamasının varsayılan günlük düzeyini değiştirmek için host.json bölümündeki ayarı logging
yapılandırınlogLevel
.
{
"version": "2.0",
"customHandler": {
"description": {
"defaultExecutablePath": "handler.exe"
}
},
"logging": {
"logLevel": {
"default": "Trace"
}
}
}
İşlevler ana bilgisayarı, özel işleyici işlemiyle ilgili bilgiler de dahil olmak üzere ek günlük iletileri oluşturur. Özel işleyici işleminizi başlatma veya özel işleyicinizdeki işlevleri çağırma sorunlarını araştırmak için günlükleri kullanın.
Günlükler yerel olarak konsola yazdırılır.
Azure'da, günlük iletilerini görüntülemek için Application Insights izlemelerini sorgulayın. Uygulamanız yüksek hacimli günlükler üretirse Application Insights'a günlük iletilerinin yalnızca bir alt kümesi gönderilir. Tüm iletilerin günlüğe kaydedildiğinden emin olmak için örneklemeyi devre dışı bırakın.
Özel işleyiciyi yalıtarak test edin
Özel işleyici uygulamaları bir web sunucusu işlemidir, bu nedenle kendi başına başlatmak ve sahte HTTP istekleri göndererek işlev çağrılarını test etmek yararlı olabilir. Yükleri olan HTTP istekleri göndermek için verilerinizin güvenliğini sağlayan bir araç seçtiğinizden emin olun. Daha fazla bilgi için bkz . HTTP test araçları.
Bu stratejiyi, özel işleyicinizde otomatikleştirilmiş testler çalıştırmak için CI/CD işlem hatlarınızda da kullanabilirsiniz.
Yürütme ortamı
Özel işleyiciler, tipik bir Azure İşlevleri uygulamasıyla aynı ortamda çalışır. Ortamın çalışması için gereken tüm bağımlılıkları içerdiğinden emin olmak için işleyicinizi test edin. Ek bağımlılıklar gerektiren uygulamalar için, bunları Azure İşlevleri Premium planında barındırılan özel bir kapsayıcı görüntüsü kullanarak çalıştırmanız gerekebilir.
Destek alın
Özel işleyicileri olan bir işlev uygulamasında yardıma ihtiyacınız varsa, normal destek kanalları aracılığıyla bir istek gönderebilirsiniz. Ancak, özel işleyici uygulamaları oluşturmak için kullanılan çok çeşitli olası diller nedeniyle destek sınırsız değildir.
İşlevler ana bilgisayarında özel işleyici işlemi başlatılırken veya özel işleyici işlemiyle iletişim kurarken sorun yaşanırsa destek sağlanır. Seçilen dil veya çerçeveyle ilgili sorunlar gibi özel işleyici sürecinizin iç çalışmalarına özgü sorunlar için Destek Ekibimiz bu bağlamda yardım sağlayamıyor.
Sonraki adımlar
Özel işleyiciler hızlı başlangıcıyla Go veya Rust'ta bir Azure İşlevleri uygulaması oluşturmaya başlayın.