Megosztás a következőn keresztül:


Függőségek vagy harmadik féltől származó kódtár használata Azure Functions

Ebből a cikkből megtudhatja, hogyan hozhatja be külső függőségeket a függvényalkalmazásokba. A külső függőségek közé tartoznak például a json-fájlok, a bináris fájlok és a gépi tanulási modellek.

Ebben a cikkben az alábbiakkal ismerkedhet meg:

  • Függőségek behozása Functions Code-projekten keresztül
  • Függőségek behozása az Azure Fileshare csatlakoztatásával

Függőségek behozása a projektkönyvtárból

A függőségek egyik legegyszerűbb módja, ha a függvényalkalmazás kódjával együtt helyezi el a fájlokat/összetevőket a Functions projekt könyvtárstruktúrájában. Íme egy példa egy Python-függvényprojekt címtármintáira:

<project_root>/
 | - my_first_function/
 | | - __init__.py
 | | - function.json
 | | - example.py
 | - dependencies/
 | | - dependency1
 | - .funcignore
 | - host.json
 | - local.settings.json

Ha a függőségeket egy mappába helyezi a Functions alkalmazás projektkönyvtárában, a függőségek mappa a kóddal együtt lesz üzembe helyezve. Ennek eredményeképpen a függvénykód a fájlrendszer API-jának használatával érheti el a felhőben lévő függőségeket.

A kódban lévő függőségek elérése

Íme egy példa a címtárba helyezett függőségek elérésére és végrehajtására ffmpeg<project_root>/ffmpeg_lib .

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)

Megjegyzés

Előfordulhat, hogy az ffmpeg bináris fájlhoz való jog megadásához Execute linuxos környezetben kell használnia chmod

A függőségek egyik legegyszerűbb módja, ha a fájlokat/összetevőt a függvényalkalmazás kódjával együtt helyezi el a functions projekt könyvtárstruktúrájában. Íme egy példa egy Java-függvényprojekt címtármintáira:

<project_root>/
 | - src/
 | | - main/java/com/function
 | | | - Function.java
 | | - test/java/com/function
 | - artifacts/
 | | - dependency1
 | - host.json
 | - local.settings.json
 | - pom.xml

A Java esetében az erőforrások másolása során kifejezetten be kell foglalnia az összetevőket a build/cél mappába. Íme egy példa arra, hogyan teheti meg a Mavenben:

...
<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>
...

Ha a függőségeket egy mappába helyezi a Functions alkalmazás projektkönyvtárában, a függőségek mappa a kóddal együtt lesz üzembe helyezve. Ennek eredményeképpen a függvénykód a fájlrendszer API-jának használatával érheti el a felhőben lévő függőségeket.

A kódban lévő függőségek elérése

Íme egy példa a címtárba helyezett függőségek elérésére és végrehajtására ffmpeg<project_root>/ffmpeg_lib .

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();

    }

Megjegyzés

Ahhoz, hogy ez a kódrészlet működjön az Azure-ban, meg kell adnia egy "BASE_PATH" egyéni alkalmazásbeállítást a "/home/site/wwwroot" értékkel

Függőségek létrehozása fájlmegosztás csatlakoztatásával

Ha a függvényalkalmazást Linuxon futtatja, más módon is létrehozhat harmadik féltől származó függőségeket. A Functions lehetővé teszi egy Azure Files üzemeltetett fájlmegosztás csatlakoztatását. Ezt a megközelítést akkor érdemes figyelembe venni, ha el szeretné választani a függőségeket vagy összetevőket az alkalmazás kódjától.

Először létre kell hoznia egy Azure Storage-fiókot. A fiókban fájlmegosztást is létre kell hoznia az Azure-fájlokban. Az erőforrások létrehozásához kövesse ezt az útmutatót

Miután létrehozta a tárfiókot és a fájlmegosztást, az az webapp config storage-account add paranccsal csatolja a fájlmegosztást a függvényalkalmazáshoz az alábbi példában látható módon.

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>
Jelölő Érték
egyéni azonosító Bármely egyedi sztring
storage-type Jelenleg csak az AzureFiles támogatott
megosztás neve Meglévő megosztás
csatlakoztatási útvonal Elérési út, amelyen a megosztás elérhető lesz a tárolóban. Az értéknek formátumnak /dir-name kell lennie, és nem kezdődhet a következővel: /home

A fájlmegosztás konfigurációjának módosítására/törlésére vonatkozó további parancsok itt találhatók

Függőségek feltöltése a Azure Files

A függőségek Azure Files való feltöltésének egyik lehetősége a Azure Portal. Ebben az útmutatóban útmutatást talál a függőségek portálon való feltöltéséhez. A függőségek Azure Files való feltöltésének további lehetőségei az Azure CLI-vel és a PowerShell-lel érhetők el.

A kódban lévő függőségek elérése

Miután feltöltötte a függőségeket a fájlmegosztásba, elérheti a függőségeket a kódból. A csatlakoztatott megosztás a megadott csatlakoztatási útvonalon érhető el, például /path/to/mount. A célkönyvtárat fájlrendszer API-k használatával érheti el.

Az alábbi példa a csatlakoztatott fájlmegosztásban tárolt kódtárhoz hozzáférő ffmpeg HTTP-eseményindító-kódot mutatja be.

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)

Amikor üzembe helyezi ezt a kódot egy függvényalkalmazásban az Azure-ban, létre kell hoznia egy alkalmazásbeállítást a csatlakoztatott fájlmegosztási elérési út kulcsnevével FILE_SHARE_MOUNT_PATH és értékével, amely ebben a példában a következő /azure-files-share: . A helyi hibakereséshez fel kell töltenie a FILE_SHARE_MOUNT_PATH fájlt azzal a fájlútvonallal, ahol a függőségek a helyi gépen vannak tárolva. Íme egy példa a beállításhoz FILE_SHARE_MOUNT_PATH a következő használatával local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "FILE_SHARE_MOUNT_PATH" : "PATH_TO_LOCAL_FFMPEG_DIR"
  }
}

Következő lépések