Bağımlılıkları veya üçüncü taraf kitaplığını Azure İşlevleri
Bu makalede, işlev uygulamalarınıza üçüncü taraf bağımlılıkları eklemeyi öğreneceksiniz. Üçüncü taraf bağımlılıklarına örnek olarak json dosyaları, ikili dosyalar ve makine öğrenmesi modelleri verilebilir.
Bu makalede şunları öğreneceksiniz:
- İşlev Kodu projesi aracılığıyla bağımlılıkları getirme
- Azure Fileshare'i bağlama yoluyla bağımlılıkları getirme
Proje dizininden bağımlılıkları getirme
Bağımlılıkları getirmenin en basit yollarından biri, dosyaları/yapıtı İşlevler proje dizini yapısındaki işlev uygulama koduyla bir araya getirmektir. Python işlevleri projesindeki dizin örneklerine bir örnek aşağıda verilmiştir:
<project_root>/
| - my_first_function/
| | - __init__.py
| | - function.json
| | - example.py
| - dependencies/
| | - dependency1
| - .funcignore
| - host.json
| - local.settings.json
Bağımlılıkları İşlevler uygulaması proje dizini içindeki bir klasöre yerleştirerek bağımlılıklar klasörü kodla birlikte dağıtılır. Sonuç olarak işlev kodunuz dosya sistemi API'sini kullanarak buluttaki bağımlılıklara erişebilir.
Kodunuzdaki bağımlılıklara erişme
Aşağıda dizine eklenen bağımlılıklara erişmeye ve bu bağımlılığı yürütmeye ffmpeg
<project_root>/ffmpeg_lib
yönelik bir örnek verilmiştir.
import logging
import azure.functions as func
import subprocess
FFMPEG_RELATIVE_PATH = "../ffmpeg_lib/ffmpeg"
def main(req: func.HttpRequest,
context: func.Context) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
command = req.params.get('command')
# If no command specified, set the command to help
if not command:
command = "-h"
# context.function_directory returns the current directory in which functions is executed
ffmpeg_path = "/".join([str(context.function_directory), FFMPEG_RELATIVE_PATH])
try:
byte_output = subprocess.check_output([ffmpeg_path, command])
return func.HttpResponse(byte_output.decode('UTF-8').rstrip(),status_code=200)
except Exception as e:
return func.HttpResponse("Unexpected exception happened when executing ffmpeg. Error message:" + str(e),status_code=200)
Not
Linux ortamındaki ffmpeg ikilisine hak sağlamak Execute
için kullanmanız chmod
gerekebilir
Bağımlılıkları getirmenin en basit yollarından biri, dosyaları/yapıtı işlevler proje dizini yapısındaki işlev uygulama koduyla birlikte yerleştirmektir. Java işlevleri projesindeki dizin örneklerine bir örnek aşağıda verilmiştir:
<project_root>/
| - src/
| | - main/java/com/function
| | | - Function.java
| | - test/java/com/function
| - artifacts/
| | - dependency1
| - host.json
| - local.settings.json
| - pom.xml
Java için özellikle kaynakları kopyalarken yapıtları derleme/hedef klasörüne eklemeniz gerekir. Maven'da nasıl yapılacağını gösteren bir örnek aşağıda verilmiştir:
...
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<overwrite>true</overwrite>
<outputDirectory>${stagingDirectory}</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}</directory>
<includes>
<include>host.json</include>
<include>local.settings.json</include>
<include>artifacts/**</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
...
Bağımlılıkları İşlevler uygulaması proje dizini içindeki bir klasöre yerleştirerek bağımlılıklar klasörü kodla birlikte dağıtılır. Sonuç olarak işlev kodunuz dosya sistemi API'sini kullanarak buluttaki bağımlılıklara erişebilir.
Kodunuzdaki bağımlılıklara erişme
Aşağıda dizine eklenen bağımlılıklara erişmeye ve bu bağımlılığı yürütmeye ffmpeg
<project_root>/ffmpeg_lib
yönelik bir örnek verilmiştir.
public class Function {
final static String BASE_PATH = "BASE_PATH";
final static String FFMPEG_PATH = "/artifacts/ffmpeg/ffmpeg.exe";
final static String HELP_FLAG = "-h";
final static String COMMAND_QUERY = "command";
@FunctionName("HttpExample")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) throws IOException{
context.getLogger().info("Java HTTP trigger processed a request.");
// Parse query parameter
String flags = request.getQueryParameters().get(COMMAND_QUERY);
if (flags == null || flags.isBlank()) {
flags = HELP_FLAG;
}
Runtime rt = Runtime.getRuntime();
String[] commands = { System.getenv(BASE_PATH) + FFMPEG_PATH, flags};
Process proc = rt.exec(commands);
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(proc.getInputStream()));
String out = stdInput.lines().collect(Collectors.joining("\n"));
if(out.isEmpty()) {
BufferedReader stdError = new BufferedReader(new
InputStreamReader(proc.getErrorStream()));
out = stdError.lines().collect(Collectors.joining("\n"));
}
return request.createResponseBuilder(HttpStatus.OK).body(out).build();
}
Not
Bu kod parçacığının Azure'da çalışmasını sağlamak için "/home/site/wwwroot" değeriyle "BASE_PATH" özel bir uygulama ayarı belirtmeniz gerekir
Dosya paylaşımını bağlayarak bağımlılıkları getirme
İşlev uygulamanızı Linux'ta çalıştırırken üçüncü taraf bağımlılıkları getirmenin başka bir yolu vardır. İşlevler, Azure Dosyalar'de barındırılan bir dosya paylaşımını bağlamanıza olanak tanır. Bağımlılıkları veya yapıtları uygulama kodunuzdan ayırmayı istediğinizde bu yaklaşımı göz önünde bulundurun.
İlk olarak bir Azure Depolama Hesabı oluşturmanız gerekir. Hesapta, Azure dosyalarında da dosya paylaşımı oluşturmanız gerekir. Bu kaynakları oluşturmak için bu kılavuzu izleyin
Depolama hesabını ve dosya paylaşımını oluşturduktan sonra, aşağıdaki örnekte gösterildiği gibi az webapp config storage-account add komutunu kullanarak dosya paylaşımını işlevler uygulamanıza ekleyin.
az webapp config storage-account add \
--name < Function-App-Name > \
--resource-group < Resource-Group > \
--subscription < Subscription-Id > \
--custom-id < Unique-Custom-Id > \
--storage-type AzureFiles \
--account-name < Storage-Account-Name > \
--share-name < File-Share-Name > \
--access-key < Storage-Account-AccessKey > \
--mount-path </path/to/mount>
Bayrak | Değer |
---|---|
custom-id | Herhangi bir benzersiz dize |
depolama türü | Şu anda yalnızca AzureFiles desteklenmektedir |
paylaşım adı | Önceden var olan paylaşım |
bağlama yolu | Paylaşımın kapsayıcı içinde erişilebilir olacağı yol. Değerin biçiminde /dir-name olması gerekir ve ile başlayamaz /home |
Dosya paylaşımı yapılandırmasını değiştirmek/silmek için daha fazla komut burada bulunabilir
Bağımlılıkları Azure Dosyalar'a yükleme
Bağımlılığınızı Azure Dosyalar'a yükleme seçeneğinden biri Azure portal kullanmaktır. Portalı kullanarak bağımlılıkları karşıya yükleme yönergeleri için bu kılavuza bakın. Bağımlılıklarınızı Azure Dosyalar'a yüklemenin diğer seçenekleri Azure CLI ve PowerShell üzerindendir.
Kodunuzdaki bağımlılıklara erişme
Bağımlılıklarınız dosya paylaşımına yüklendikten sonra, bağımlılıklara kodunuzdan erişebilirsiniz. Bağlı paylaşım, gibi /path/to/mount
belirtilen bağlama yolunda kullanılabilir. Dosya sistemi API'lerini kullanarak hedef dizine erişebilirsiniz.
Aşağıdaki örnekte, bağlı bir dosya paylaşımında ffmpeg
depolanan kitaplığa erişen HTTP tetikleyici kodu gösterilmektedir.
import logging
import azure.functions as func
import subprocess
FILE_SHARE_MOUNT_PATH = os.environ['FILE_SHARE_MOUNT_PATH']
FFMPEG = "ffmpeg"
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
command = req.params.get('command')
# If no command specified, set the command to help
if not command:
command = "-h"
try:
byte_output = subprocess.check_output(["/".join(FILE_SHARE_MOUNT_PATH, FFMPEG), command])
return func.HttpResponse(byte_output.decode('UTF-8').rstrip(),status_code=200)
except Exception as e:
return func.HttpResponse("Unexpected exception happened when executing ffmpeg. Error message:" + str(e),status_code=200)
Bu kodu Azure'daki bir işlev uygulamasına dağıttığınızda, bağlı dosya paylaşım yolunun FILE_SHARE_MOUNT_PATH
anahtar adına ve değerine sahip bir uygulama ayarı oluşturmanız gerekir. Bu örnekte şöyledir/azure-files-share
: . Yerel hata ayıklama yapmak için, öğesini bağımlılıklarınızın yerel makinenizde depolandığı dosya yoluyla doldurmanız FILE_SHARE_MOUNT_PATH
gerekir. aşağıda kullanılarak ayarlanacağı FILE_SHARE_MOUNT_PATH
bir örnek verilmiştir local.settings.json
:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "python",
"FILE_SHARE_MOUNT_PATH" : "PATH_TO_LOCAL_FFMPEG_DIR"
}
}
Sonraki adımlar
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin