Aracılığıyla paylaş


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/mountbelirtilen 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