Sdílet prostřednictvím


Rychlý start: Vytvoření aplikace Durable Functions, která používá poskytovatele úložiště MSSQL

Funkce Durable Functions, která je funkcí Azure Functions, slouží k zápisu stavových funkcí v bezserverovém prostředí. Durable Functions spravuje stav, kontrolní body a restartuje ve vaší aplikaci.

Durable Functions podporuje několik poskytovatelů úložiště, označovaných také jako back-endy, pro ukládání orchestrace a stavu modulu runtime entity. V tomto rychlém startu vytvoříte aplikaci Durable Functions pro použití zprostředkovatele úložiště Microsoft SQL Server (MSSQL) pomocí editoru Visual Studio Code.

Tento rychlý start vytvoří aplikaci .NET (izolovaný model) pro demonstrační účely. Obsah uvedený v tomto článku se vztahuje na jiné jazyky podobným způsobem.

Poznámka:

  • Back-end MSSQL byl navržen tak, aby maximalizoval přenositelnost aplikací a kontrolu nad vašimi daty. Používá Microsoft SQL Server k zachování všech dat centra úloh, aby uživatelé získali výhody moderní infrastruktury systému pro správu databází na podnikové úrovni (DBMS). Další informace o tom, kdy použít poskytovatele úložiště MSSQL, najdete v přehledu poskytovatelů úložiště.

  • Migrace dat centra úloh mezi poskytovateli úložiště se v současné době nepodporuje. Aplikace funkcí, které mají existující data modulu runtime, začínají po přechodu na back-end MSSQL s čerstvým prázdným centrem úloh. Podobně nelze zachovat obsah centra úloh vytvořený pomocí MSSQL, pokud přepnete na jiného poskytovatele úložiště.

Požadavky

K dokončení tohoto rychlého startu potřebujete:

Vytvoření projektu služby Azure Functions

V editoru Visual Studio Code vytvořte místní projekt Azure Functions.

  1. V nabídce Zobrazit vyberte paletu příkazů (nebo vyberte Ctrl+Shift+P).

  2. Na příkazovém řádku (>) zadejte a pak vyberte Azure Functions: Vytvořit nový projekt.

    Snímek obrazovky znázorňující příkaz pro vytvoření projektu Functions

  3. Vyberte Procházet. V dialogovém okně Vybrat složku přejděte do složky, která se má použít pro váš projekt, a pak zvolte Vybrat.

  4. Na příkazovém řádku vyberte nebo zadejte následující hodnoty:

    Podnět Činnost Popis
    Výběr jazyka pro projekt aplikace funkcí Vyberte .NET. Vytvoří místní projekt funkcí jazyka C#.
    Výběr modulu runtime .NET Vyberte izolovanou technologii .NET 8.0. Vytvoří projekt Functions, který podporuje .NET 8 spuštěný v izolovaném pracovním procesu a modul runtime Azure Functions 4.0.
    Výběr šablony pro první funkci projektu Vyberte Orchestraci trvalých funkcí. Vytvoří orchestraci Durable Functions.
    Volba typu odolného úložiště Vyberte MSSQL. Vybere poskytovatele úložiště MSSQL.
    Zadejte název funkce. Zadejte HelloOrchestration. Název funkce orchestrace.
    Zadání oboru názvů Zadejte Company.Function. Obor názvů pro vygenerovanou třídu.
    Vyberte, jak chcete projekt otevřít. Vyberte Otevřít v aktuálním okně. Otevře Visual Studio Code ve složce, kterou jste vybrali.

Visual Studio Code nainstaluje Nástroje Azure Functions Core Tools, pokud je potřeba k vytvoření projektu. Vytvoří také projekt aplikace funkcí ve složce. Tento projekt obsahuje konfigurační soubory host.json a local.settings.json .

Další soubor, HelloOrchestration.cs, obsahuje základní stavební bloky aplikace Durable Functions:

Metoda Popis
HelloOrchestration Definuje orchestraci aplikace Durable Functions. V tomto případě se orchestrace spustí, vytvoří seznam a pak přidá výsledek tří volání funkcí do seznamu. Když se tři volání funkce dokončí, vrátí seznam.
SayHello Jednoduchá aplikace funkcí, která vrací hello. Tato funkce obsahuje obchodní logiku, která je orchestrovaná.
HelloOrchestration_HttpStart Funkce aktivovaná protokolem HTTP, která spouští instanci orchestrace a vrací odpověď na stav kontroly.

Další informace o těchto funkcích naleznete v tématu Durable Functions typy a funkce.

Nastavte si databázi

Poznámka:

Pokud už máte databázi kompatibilní s MSSQL, můžete tuto část přeskočit a přeskočit další část o nastavení místní databáze založené na Dockeru.

Vzhledem k tomu, že back-end MSSQL je navržený pro přenositelnost, máte několik možností, jak nastavit zálohovací databázi. Můžete například nastavit místní instanci SQL Serveru, použít plně spravovanou instanci Azure SQL Database nebo použít jakoukoli jinou možnost hostování kompatibilní s SQL Serverem.

Místní offline vývoj můžete provést také pomocí SQL Serveru Express na místním počítači s Windows nebo použít image Dockeru SQL Serveru spuštěnou v kontejneru Dockeru.

Tento rychlý start se zaměřuje na použití image Dockeru SQL Serveru.

Nastavení místní instance SQL Serveru založeného na Dockeru

Pomocí následujících příkazů PowerShellu nastavte místní databázi SQL Serveru v Dockeru. PowerShell můžete nainstalovat ve Windows, macOS nebo Linuxu.

# primary parameters
$pw        = "yourStrong(!)Password"
$edition   = "Developer"
$port      = 1433
$tag       = "2019-latest"
$dbname    = "DurableDB"
$collation = "Latin1_General_100_BIN2_UTF8"

# pull the image from the Microsoft container registry
docker pull mcr.microsoft.com/mssql/server:$tag

# run the image and provide some basic setup parameters
docker run --name mssql-server -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=$pw" -e "MSSQL_PID=$edition" -p ${port}:1433 -d mcr.microsoft.com/mssql/server:$tag

# wait a few seconds for the container to start...

# create the database with strict binary collation
docker exec -it mssql-server /opt/mssql-tools/bin/sqlcmd -S . -U sa -P "$pw" -Q "CREATE DATABASE [$dbname] COLLATE $collation"

# if sqlcmd is in the mssql-tools18 folder
# docker exec -it mssql-server /opt/mssql-tools18/bin/sqlcmd -C -S . -U sa -P "$pw" -Q "CREATE DATABASE [$dbname] COLLATE $collation"

Teď byste měli mít místní SQL Server spuštěný v Dockeru a naslouchat na portu 1443. Pokud dojde ke konfliktu portů 1443 s jinou službou, spusťte tyto příkazy znovu po změně proměnné $port na jinou hodnotu.

Pokud chcete ověřit instalaci databáze, zadejte dotaz na novou databázi SQL:

docker exec -it mssql-server /opt/mssql-tools/bin/sqlcmd -S . -U sa -P "$pw" -Q "SELECT name FROM sys.databases"

Pokud se instalace databáze úspěšně dokončila, zobrazí se ve výstupu příkazového řádku název databáze (například DurableDB):

name

--------------------------------------------------------------
master

tempdb

model

msdb

DurableDB

Poznámka:

Pokud chcete zastavit a odstranit spuštěný kontejner, můžete ho použít docker stop <containerName> a docker rm <containerName> v uvedeném pořadí. Tyto příkazy můžete použít k opětovnému vytvoření kontejneru a k zastavení kontejneru po dokončení tohoto rychlého startu. Pokud potřebujete další pomoc, spusťte docker --helppříkaz .

Řešení problémů

Pokud při spuštění docker exec databáze narazíte na chybovou odpověď démona: Modul runtime OCI exec selhal, pravděpodobně /opt/mssql-tools/bin/sqlcmd složka neexistuje. Otevřete Docker Desktop, vyberte kontejner Dockeru SQL Serveru, vyberte Soubory a vyhledejte složku mssql-tools. Zkontrolujte, jestli má tato složka jiný název, například /opt/mssql-tools18/bin/sqlcmd. Odpovídajícím způsobem aktualizujte příkaz.

V ovladači ODBC 18 pro SQL Server je možnost Šifrovat připojení nastavena na true ve výchozím nastavení. Pokud při provádění databázových operací narazíte na "chybu:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate", připojte docker exec, což odpovídá možnosti ADO.net -C.

Přidání připojovacího řetězce SQL do local.settings.json

Back-end MSSQL potřebuje pro přístup k vaší databázi připojovací řetězec. Způsob získání připojovací řetězec závisí především na konkrétním poskytovateli serveru MSSQL.

Pokud použijete předchozí příkazy Dockeru beze změny parametrů, vaše připojovací řetězec je:

Server=localhost,1433;Database=DurableDB;User Id=sa;Password=yourStrong(!)Password;

V local.settings.json přiřaďte připojovací řetězec instance SQL Serveru běžícího na Dockeru do SQLDB_Connection. Tuto proměnnou přidal Visual Studio Code, když jste jako back-end pro aplikaci Durable Functions vybrali MSSQL:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true", 
    "SQLDB_Connection": "Server=localhost,1433;Database=DurableDB;User Id=sa;Password=yourStrong(!)Password;",
    "FUNCTIONS_WORKER_RUNTIME": "<dependent on your programming language>"
  }
}

Místní testování

Otevřete okno terminálu v kořenové složce aplikace a spusťte azurite start. Azurite je emulátor služby Azure Storage, který je nutný pro spuštění libovolné aplikace funkcí.

Otevřete v kořenové složce aplikace další okno terminálu a spusťte aplikaci Funkcí spuštěním func host startpříkazu .

  1. V okně terminálu zkopírujte koncový bod adresy URL funkce aktivované protokolem HTTP.

    Snímek obrazovky s místním oknem výstupu Azure

  2. Pomocí testovacího nástroje HTTP odešlete požadavek HTTP POST do koncového bodu adresy URL.

    Odpověď je počáteční výsledek funkce HTTP. Dá vám vědět, že orchestrace Durable Functions byla úspěšně spuštěna. Zatím nezobrazuje konečný výsledek orchestrace. Odpověď obsahuje několik užitečných adres URL.

  3. Zkopírujte hodnotu adresy URL , statusQueryGetUrivložte ji do adresního řádku prohlížeče a spusťte požadavek. Alternativně můžete k vydání požadavku GET dál používat testovací nástroj HTTP.

    Požadavek se dotazuje instance orchestrace na stav. Měli byste vidět, že instance byla dokončena a že obsahuje výstupy nebo výsledky aplikace Durable Functions, jako je v tomto příkladu:

    {
        "name":"HelloCities",
        "instanceId":"7f99f9474a6641438e5c7169b7ecb3f2",
        "runtimeStatus":"Completed",
        "input":null,
        "customStatus":null,
        "output":"Hello, Tokyo! Hello, London! Hello, Seattle!",
        "createdTime":"2023-01-31T18:48:49Z",
        "lastUpdatedTime":"2023-01-31T18:48:56Z"
    }
    

Spuštění aplikace v Azure

Pokud chcete aplikaci spustit v Azure, musíte vytvořit různé prostředky. Pro pohodlné pozdější vyčištění vytvořte všechny prostředky ve stejné skupině zdrojů.

Vytvoření databáze Azure SQL

Poznámka:

Pokud už máte databázi Azure SQL nebo jinou veřejně přístupnou instanci SQL Serveru, kterou chcete použít, můžete přejít k další části.

Neaktivujte nastavení Povolit službám a prostředkům Azure přístup k tomuto serveru [SQL] pro produkční scénáře. Skutečné aplikace by měly implementovat bezpečnější přístupy, jako jsou silnější omezení brány firewall nebo konfigurace virtuální sítě.

Na webu Azure Portal můžete vytvořit databázi Azure SQL. Během vytváření:

  • Povolit službám a prostředkům Azure přístup k tomuto serveru (v části Sítě)
  • Nastavte hodnotu kolace databáze (v části Další nastavení) na Latin1_General_100_BIN2_UTF8hodnotu .

Vytvoření aplikace Azure Functions a podpůrných prostředků

  1. Otevřete okno terminálu a přihlaste se k Azure:

    az login
    
  2. Ve stejné skupině prostředků a oblasti jako databázi SQL vytvořte následující prostředky:

    • Účet úložiště pro obecné účely, který slouží k ukládání důležitých dat aplikace, jako je samotný kód aplikace. Názvy účtů úložiště musí obsahovat jenom číslice se třemi až 24 znaky a malými písmeny.
    • Plán aplikace Function Premium
    • Aplikace funkcí
    # Variables
    location=<REGION>
    resourceGroup=<RESOURCE_GROUP_NAME>
    storage=<STORAGE_NAME>
    planName=<PREMIUM_PLAN_NAME>
    functionApp=<APP_NAME>
    skuStorage="Standard_LRS"
    skuPlan="EP1"
    functionsVersion="4"
    
    # Create an Azure storage account
    echo "Creating $storage"
    az storage account create --name $storage --location "$location" --resource-group $resourceGroup --sku $skuStorage --allow-blob-public-access false
    
    # Create a premium plan
    echo "Creating $premiumPlan"
    az functionapp plan create --name $planName --resource-group $resourceGroup --location "$location" --sku $skuPlan
    
    # Create a function app hosted in the premium plan
    echo "Creating $functionApp"
    az functionapp create --name $functionApp --storage-account $storage --plan $planName --resource-group $resourceGroup --functions-version $functionsVersion
    

Vytvoření spravované identity Azure

Spravované identity usnadňují zabezpečení vaší aplikace odstraněním tajných kódů z vaší aplikace, jako jsou přihlašovací údaje v připojovacích řetězcích. Můžete si vybrat mezi spravovanou identitou přiřazenou systémem a přiřazenou uživatelem. Tento rychlý start ukazuje nastavení spravované identity přiřazené uživatelem, což je doporučená možnost, protože není svázaná s životním cyklem aplikace.

Následující příkazy vytvoří prostředek identity a přiřadí ho aplikaci:

# Variables
subscription=<SUBSCRIPTION_ID>
identity=<IDENTITY_NAME>

# Create a managed identity resource
echo "Creating $identity"
az identity create -g $resourceGroup -n $identity --location "$location"

# Construct the identity resource ID 
resourceId="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$identity"

# Assign the identity to the Azure Functions app
echo "Assigning $identity to app"
az functionapp identity assign -g $resourceGroup -n $functionApp --identities "$resourceId"

# Get the identity's ClientId and PrincipalId (also called ObjectId) for a later step. 
clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)

principalId=$(az identity show --name $identity --resource-group $resourceGroup --query 'principalId' --output tsv)

Udělení přístupu ke službě Azure Storage a Azure SQL Database

Azure Storage

Přiřaďte roli Vlastník dat objektu blob úložiště pro přístup k účtu úložiště.

# Set the scope of the access
scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"

# Assign the role
echo "Assign Storage Blob Data Owner role to identity"
az role assignment create --assignee "$clientId" --role "Storage Blob Data Owner" --scope "$scope"

Azure SQL Database

Poznámka:

Ověřování v databázi Azure SQL pomocí spravované identity se při hostování aplikace Durable Functions v plánu Flex Consumption nepodporuje. Pokud je vaše aplikace hostovaná v plánu Flex Consumption, přejděte do části Nastavení aplikace .

  1. Začněte nastavením identity vývojáře jako správce databáze.

    Přiřazená osoba je vaše identita, proto ji změňte na svůj e-mail.

    assignee=$(az ad user show --id "someone@example.com" --query "id" --output tsv)
    

    Nastavte přiřazeného jako správce databáze Azure SQL.

    az sql server ad-admin create --resource-group $resourceGroup --server-name <SQL_SERVER_NAME> --display-name ADMIN --object-id "$assignee"
    
  2. Připojte se k dříve vytvořené databázi SQL pomocí nástrojů, jako je Azure Data Studio nebo SQL Management Server Studio. Nebo můžete spustit následující příkaz SQLCMD pro připojení:

    sqlcmd -S <SQL_SERVER_NAME>.database.windows.net -d <DATABASE_NAME> -U <someone@example.com> -P "ACCOUNT_PASSWORD" -G -l 30
    

    Udělením přístupu vaší identitě db_owner spusťte následující dotaz na databázi. Jedná se IDENTITY_OBJECT_ID o Id objektu zabezpečení z kroku vytvoření identity.

    CREATE USER "<IDENTITY_NAME>" FROM EXTERNAL PROVIDER With OBJECT_ID='<IDENTITY_OBJECT_ID>'
    ALTER ROLE db_owner ADD MEMBER "<IDENTITY_NAME>";
    GO
    
  3. Připojte se k master databázi a udělte svojí identitě (role) dbmanager přístup:

    CREATE USER "<IDENTITY_NAME>" FROM EXTERNAL PROVIDER With OBJECT_ID='<IDENTITY_OBJECT_ID>'
    ALTER ROLE dbmanager ADD MEMBER "<IDENTITY_NAME>";
    GO
    

Nastavení požadovaných aplikací

Do aplikace musíte přidat následující nastavení aplikace:

  • AzureWebJobsStorage__accountName: Název účtu služby Azure Storage
  • AzureWebJobsStorage__clientId: ClientId spravované identitě
  • AzureWebJobsStorage__credential: Typ přihlašovacích údajů, který je spravovaná identita
  • SQLDB_Connection: Připojovací řetězec databáze SQL

Pokud k ověření v databázi SQL používáte spravovanou identitu přiřazenou uživatelem, měl by připojovací řetězec vypadat takto:

dbserver=<SQL_SERVER_NAME>
sqlDB=<SQL_DB_NAME>
clientId=<IDENTITY_CLIENT_ID>

sqlconnstr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$clientId;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Authentication='Active Directory Managed Identity';"

U aplikací Flex Consumption teď použijte připojovací řetězec k ověření. Najdete ho tak, že přejdete na prostředek databáze SQL na webu Azure Portal, přejdete na kartu Nastavení a pak kliknete na Připojovací řetězce:

Snímek obrazovky zobrazující připojovací řetězec databáze

Připojovací řetězec by měl mít tento formát:

dbserver=<SQL_SERVER_NAME>
sqlDB=<SQL_DB_NAME>
username=<DB_USER_LOGIN>
password=<DB_USER_PASSWORD>

sqlconnstr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$username;Password=$password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"

Spuštěním následujícího příkazu nastavte nastavení:

az functionapp config appsettings set --name $functionApp --resource-group $resourceGroup --settings AzureWebJobsStorage__accountName="$storage" AzureWebJobsStorage__clientId="$clientId" AzureWebJobsStorage__credential="managedidentity" SQLDB_Connection=$sqlconnstr

Odstraňte existující AzureWebJobsStorage nastavení:

az functionapp config appsettings delete --name $functionApp --resource-group $resourceGroup --setting-names "AzureWebJobsStorage"

Nasazení místního projektu do Azure a testování

Nakonec ve složce kořenového projektu nasaďte aplikaci do Azure spuštěním příkazu:

func azure functionapp publish $functionApp

Po dokončení nasazení spusťte následující příkaz a získejte adresu URL triggeru HTTP:

az functionapp function list --resource-group $resourceGroup --name $functionApp  --query '[].{Function:name, URL:invokeUrlTemplate}' --output json

Testujte stejně jako při místním vývoji pomocí testovacího nástroje HTTP.

Můžete také ověřit, jestli je back-end MSSQL správně nakonfigurovaný, a to dotazováním databáze na data centra úloh.

Můžete například dotazovat instance orchestrace v podokně přehledu databáze SQL. Vyberte Editor Power Query, ověřte a spusťte následující dotaz:

SELECT TOP 5 InstanceID, RuntimeStatus, CreatedTime, CompletedTime FROM dt.Instances

Po spuštění jednoduchého orchestrátoru by se měl zobrazit alespoň jeden výsledek, jak je znázorněno v tomto příkladu:

Snímek obrazovky znázorňující výsledky Editor Power Query Azure SQL pro dotaz SQL

Další kroky