Vytvoření aplikace funkcí ve vlastním kontejneru v Azure Container Apps

V tomto článku vytvoříte aplikaci Azure Functions běžící v kontejneru Linuxu a nasadíte ji do prostředí Azure Container Apps z registru kontejneru. Nasazením do Container Apps můžete integrovat aplikace funkcí do nativních cloudových mikroslužeb. Další informace najdete v tématu hostování Azure Functions pomocí Azure Container Apps.

Dokončením tohoto rychlého startu vznikají malé náklady v účtu Azure; které můžete minimalizovat vyčištěním prostředků po dokončení.

Zvolte vývojový jazyk

Nejprve pomocí nástrojů Azure Functions vytvoříte kód projektu jako aplikaci funkcí v kontejneru Dockeru pomocí základní image Linuxu specifické pro jazyk. Ujistěte se, že jste v horní části článku vybrali jazyk podle svého výběru.

Core Tools automaticky vygeneruje soubor Dockerfile pro váš projekt, který používá nejaktuálnější verzi správné základní image pro váš jazyk funkcí. Kontejner byste měli pravidelně aktualizovat z nejnovější základní image a znovu nasadit z aktualizované verze kontejneru. Další informace najdete v tématu Vytváření kontejnerizovaných aplikací funkcí.

Požadavky

Než začnete, musíte mít splněné následující požadavky:

  • Nainstalujte Azure CLI verze 2.4 nebo novější.

Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.

Pokud chcete publikovat image kontejnerizované aplikace funkcí, kterou vytvoříte do registru kontejneru, potřebujete ID Dockeru a Desktop Docker spuštěný na místním počítači. Pokud nemáte ID Dockeru, můžete vytvořit účet Dockeru.

Musíte také dokončit část Vytvoření registru kontejneru v rychlém startu Služby Container Registry. Poznamenejte si plně kvalifikovaný název přihlašovacího serveru.

Vytvoření a aktivace virtuálního prostředí

V vhodné složce spusťte následující příkazy pro vytvoření a aktivaci virtuálního prostředí s názvem .venv. Nezapomeňte použít některou z verzí Pythonu podporovaných službou Azure Functions.

python -m venv .venv
source .venv/bin/activate

Pokud Python nenainstaloval balíček venv do distribuce Linuxu, spusťte následující příkaz:

sudo apt-get install python3-venv

V tomto aktivovaném virtuálním prostředí spustíte všechny následující příkazy.

Vytvoření a otestování projektu místních funkcí

V terminálu nebo příkazovém řádku spusťte následující příkaz pro vybraný jazyk a vytvořte projekt aplikace funkcí v aktuální složce:

func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker

V prázdné složce spusťte následující příkaz, který vygeneruje projekt Functions z archetypu Maven:

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker

Parametr -DjavaVersion říká modulu runtime Functions, kterou verzi Javy použít. Pokud chcete funkce spouštět ve verzi Java 11, použijte -DjavaVersion=11. Pokud nezadáte -DjavaVersion, Maven jako výchozí nastaví Javu 8. Další informace najdete v tématu Verze Javy.

Důležité

Chcete-li dokončit tento článek, musí být proměnná prostředí JAVA_HOME nastavena na instalační umístění správné verze sady JDK.

Maven vás požádá o hodnoty potřebné k dokončení generování projektu při nasazení. Postupujte podle pokynů a zadejte následující informace:

Podnět Hodnota Description
groupId com.fabrikam Hodnota, která jednoznačně identifikuje váš projekt ve všech projektech podle pravidel pojmenování balíčků pro Javu.
artifactId fabrikam-functions Hodnota, která je názvem souboru JARu bez čísla verze.
version 1.0-SNAPSHOT Vyberte výchozí hodnotu.
balíček com.fabrikam.functions Hodnota, která je balíčkem Java pro vygenerovaný kód funkce. Použijte výchozí hodnotu.

Potvrďte zadáním Y nebo stisknutím klávesy Enter.

Maven vytvoří soubory projektu v nové složce s názvem artifactId, což je fabrikam-functionsv tomto příkladu .

Tato --docker možnost vygeneruje soubor Dockerfile pro projekt, který definuje vhodný kontejner pro použití se službou Azure Functions a vybraným modulem runtime.

Přejděte do složky projektu:

cd fabrikam-functions

Pomocí následujícího příkazu přidejte do projektu funkci, kde --name argument je jedinečný název funkce a --template argument určuje aktivační událost funkce. func new vytvoří v projektu soubor kódu jazyka C#.

func new --name HttpExample --template "HTTP trigger"

Pomocí následujícího příkazu přidejte do projektu funkci, kde --name argument je jedinečný název funkce a --template argument určuje aktivační událost funkce. func new vytvoří podsložku odpovídající názvu funkce, která obsahuje konfigurační soubor s názvem function.json.

func new --name HttpExample --template "HTTP trigger"

Pokud chcete funkci otestovat místně, spusťte místního hostitele modulu runtime Azure Functions v kořenové složce projektu. Pokud chcete zajistit, aby se funkce při hostování v Dockeru volala později, zkontrolujte, jestli je úroveň autorizace nastavená na AuthorizationLevel.Anonymous, nebo ji nastavte, pokud ještě není nakonfigurovaná.

func start  
func start  
npm install
npm start
mvn clean package  
mvn azure-functions:run

Jakmile se koncový HttpExample bod zapíše do výstupu, přejděte na tento koncový bod. Ve výstupu odpovědi by se měla zobrazit uvítací zpráva.

Jakmile se koncový HttpExample bod zapíše do výstupu, přejděte na http://localhost:7071/api/HttpExample?name=Functions. Prohlížeč musí zobrazit zprávu "hello", která vrátí zpět Functions, hodnotu zadanou parametrem name dotazu.

Stisknutím kláves Ctrl+C (Command+C na macOS) zastavte hostitele.

Postavte obraz kontejneru a ověřte lokálně

(Volitelné) Prozkoumejte soubor Dockerfile v kořenové složce projektu. Soubor Dockerfile popisuje požadované prostředí pro spuštění aplikace funkcí v Linuxu. Úplný seznam podporovaných základních obrazů pro Azure Functions naleznete na stránce základní image Azure Functions.

V kořenové složce projektu spusťte příkaz docker buildu , zadejte název jako azurefunctionsimagea označte jako v1.0.0. Položku <DOCKER-ID> nahraďte ID vašeho účtu Docker Hubu. Tento příkaz sestaví image Dockeru pro kontejner.

docker build --tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 .

Po dokončení příkazu můžete nový kontejner spustit místně.

Pokud chcete ověřit sestavení, spusťte image v místním kontejneru pomocí příkazu docker run , nahraďte <DOCKER-ID> znovu ID účtu Docker Hubu a přidejte argument porty takto -p 8080:80:

docker run -p 8080:80 -it <DOCKER-ID>/azurefunctionsimage:v1.0.0

Po spuštění obrázku v místním kontejneru přejděte na http://localhost:8080/api/HttpExample, který musí zobrazit stejnou zprávu s pozdravem jako předtím. Vzhledem k tomu, že funkce aktivovaná protokolem HTTP, kterou jste vytvořili, používá anonymní autorizaci, můžete volat funkci spuštěnou v kontejneru, aniž byste museli získat přístupový klíč. Další informace najdete v tématu Autorizační klíče.

Po spuštění image v místním kontejneru přejděte na http://localhost:8080/api/HttpExample?name=Functions, který musí zobrazit stejnou zprávu "hello" jako předtím. Vzhledem k tomu, že funkce aktivovaná protokolem HTTP, kterou jste vytvořili, používá anonymní autorizaci, můžete volat funkci spuštěnou v kontejneru, aniž byste museli získat přístupový klíč. Další informace najdete v tématu Autorizační klíče.

Po ověření funkční aplikace v kontejneru ukončete spuštění stisknutím kláves Ctrl+C (Command+C v macOS).

Publikování image kontejneru do registru

Pokud chcete image kontejneru zpřístupnit pro nasazení do hostitelského prostředí, musíte ji odeslat do registru kontejneru. Osvědčeným postupem zabezpečení je použít instanci služby Azure Container Registry a vynutit připojení založená na spravovaných identitách. Docker Hub vyžaduje, abyste se ověřili pomocí sdílených tajných kódů, díky kterým bude vaše nasazení zranitelnější.

Azure Container Registry je služba privátního registru pro vytváření, ukládání a správu imagí kontejnerů a souvisejících artefaktů. Pro publikování kontejnerů do služeb Azure byste měli použít službu privátního registru.

  1. Pomocí tohoto příkazu se přihlaste k instanci registru pomocí aktuálních přihlašovacích údajů Azure. Nahraďte <REGISTRY-NAME> názvem vaší instance služby Container Registry.

    az acr login --name <REGISTRY-NAME>
    
  2. Pomocí tohoto příkazu označte image plně kvalifikovaným názvem přihlašovacího serveru registru. Nahraďte <LOGIN-SERVER> plně kvalifikovaným názvem vašeho přihlašovacího serveru registru a <DOCKER-ID> vaším Docker ID.

    docker tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 <LOGIN-SERVER>/azurefunctionsimage:v1.0.0 
    
  3. Pomocí tohoto příkazu odešlete kontejner do instance registru:

    docker push <LOGIN-SERVER>/azurefunctionsimage:v1.0.0
    

Vytvoření podpůrných prostředků Azure pro vaši funkci

Než budete moct nasadit kontejner do Azure, musíte vytvořit tři prostředky:

  • Skupina prostředků, což je logický kontejner pro související prostředky.

  • Účet úložiště Azure, který slouží k udržování stavu a dalších informací o vašich funkcích.

  • Prostředí Azure Container Apps s pracovním prostorem služby Log Analytics

  • Spravovaná identita přiřazená uživatelem, která vaší aplikaci funkcí umožňuje zabezpečené připojení k prostředkům Azure bez použití sdílených tajných kódů. Připojení k účtu úložiště Azure i k instanci služby Azure Container Registry se místo toho provádí pomocí ověřování Microsoft Entra s identitou, která se doporučuje pro tento scénář.

    Poznámka:

    Docker Hub nepodporuje spravované identity.

Pomocí těchto příkazů vytvořte požadované prostředky Azure:

  1. V případě potřeby se přihlaste k Azure:

    Příkaz az login vás přihlásí ke svému účtu Azure. Použijte az account set , když máte více než jedno předplatné přidružené k vašemu účtu.

  2. Spuštěním následujícího příkazu aktualizujte Azure CLI na nejnovější verzi:

    az upgrade
    

    Pokud vaše verze Azure CLI není nejnovější verzí, zahájí se instalace. Způsob upgradu závisí na vašem operačním systému. Po dokončení upgradu můžete pokračovat.

  3. Spusťte následující příkazy, které upgradují rozšíření Azure Container Apps a zaregistrují obory názvů vyžadované službou Container Apps:

    az extension add --name containerapp --upgrade -y
    az provider register --namespace Microsoft.Web 
    az provider register --namespace Microsoft.App 
    az provider register --namespace Microsoft.OperationalInsights 
    
  4. Vytvořte skupinu prostředků s názvem AzureFunctionsContainers-rg.

    az group create --name AzureFunctionsContainers-rg --location eastus
    

    Tento az group create příkaz vytvoří skupinu prostředků v oblasti USA – východ. Pokud místo toho chcete použít oblast blízko vás, použijte dostupný kód oblasti vrácený příkazem az account list-locations . Následující příkazy je nutné upravit, aby místo eastus používaly vaši vlastní oblast.

  5. Vytvořte prostředí Azure Container Apps.

    az containerapp env create --name MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --location eastus
    

    Dokončení tohoto příkazu může trvat několik minut.

  6. Ve skupině prostředků a oblasti vytvořte účet úložiště pro obecné účely bez přístupu ke sdílenému klíči. V příkazu nahraďte <STORAGE-NAME> názvem, který je vhodný pro vás a jedinečný v Azure Storage. Názvy úložišť musí obsahovat jenom 3 až 24 znaků a malá písmena.

    az storage account create --name <STORAGE-NAME> --location eastus --resource-group AzureFunctionsContainers-rg --sku Standard_LRS --allow-blob-public-access false --allow-shared-key-access false
    

    Příkaz az storage account create vytvoří účet úložiště, který je přístupný pouze pomocí identit ověřených microsoftem Entra, které mají udělená oprávnění ke konkrétním prostředkům.

    Standard_LRS určuje účet pro obecné účely podporovaný službou Functions.

  7. Vytvořte spravovanou identitu a pomocí vrácené principalId jí udělte přístup k vašemu účtu úložiště i oprávnění k provádění pull operací v instanci registru. Nahraďte <REGISTRY-NAME> názvem existujícího registru kontejnerů, <USER-IDENTITY-NAME> názvem vaší spravované identity a <STORAGE-NAME> názvem účtu úložiště, respektive.

    principalId=$(az identity create --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --location eastus --query principalId -o tsv) 
    acrId=$(az acr show --name <REGISTRY-NAME> --query id --output tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role acrpull --scope $acrId
    storageId=$(az storage account show --resource-group AzureFunctionsContainers-rg --name <STORAGE-NAME> --query 'id' -o tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role "Storage Blob Data Owner" --scope $storageId
    

    Příkaz az identity create vytvoří spravovanou identitu přiřazenou uživatelem a az role assignment createpříkazy přidají vaši identitu do požadovaných rolí.

    Spravovaná identita je teď dostupná pro aplikaci pro přístup k účtu úložiště i ke službě Azure Container Registry bez použití sdílených tajných kódů.

Vytvoření a konfigurace aplikace funkcí v Azure pomocí image

Aplikace funkcí v Azure spravuje spouštění vašich funkcí v prostředí Azure Container Apps. V této části použijete prostředky Azure z předchozí části k vytvoření aplikace funkcí z image v registru kontejneru v prostředí Container Apps. Prostředí také nakonfigurujete s připojovacím řetězcem pro připojení k požadovanému účtu Azure Storage.

az containerapp create --kind=functionapp Pomocí příkazu vytvořte aplikaci funkcí v novém spravovaném prostředí, které je podporováno službou Azure Container Apps. az containerapp create --kind-functionapp Parametr --environment určuje prostředí Container Apps.

Návod

Pokud chcete zajistit, aby vaše aplikace funkcí používala připojení založené na spravované identitě k vaší instanci registru, nenastavujte --image parametr v az containerapp create --kind=functionapp. Když nastavíte --image na plně kvalifikovaný název vašeho obrazu v úložišti, sdílené tajné přihlašovací údaje se získají z vašeho registru a uloží se v nastavení aplikace.

Nejprve musíte získat plně kvalifikovanou hodnotu ID spravované identity přiřazené uživatelem s oprávněním pro načtení z registru, a poté použít příkaz az containerapp create --kind=functionapp k vytvoření funkční aplikace pomocí výchozího obrazu a s touto identitou přiřazenou.

UAMI_RESOURCE_ID=$(az identity show --name $uami_name --resource-group $group --query id -o tsv)

az containerapp create --name <APP-NAME> --storage-account <STORAGE-NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --assign-identity $UAMI_RESOURCE_ID

V az containerapp create --kind=functionapp--assign-identity přiřadí vaši spravovanou identitu nové aplikaci. Protože jste nenastavili parametr --image, az functionapp create aplikace byla vytvořena pomocí zástupného obrázku.

V tomto příkladu nahraďte <APP-NAME> název nové aplikace funkcí a <STORAGE-NAME> také názvem vašeho účtu úložiště.

Nakonec musíte aktualizovat nastavení webu linuxFxVersion na plně kvalifikovaný název vašeho obrazu v úložišti. Musíte také aktualizovat acrUseManagedIdentityCreds nastavení a acrUserManagedIdentityIDnastavení stránky tak, aby se spravované identity používaly při získávání obrazu z registru.

UAMI_RESOURCE_ID=$(az identity show --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --query id -o tsv)
az resource patch --resource-group AzureFunctionsContainers-rg --name <APP-NAME> --resource-type "Microsoft.Web/sites" --properties "{ \"siteConfig\": { \"linuxFxVersion\": \"DOCKER|<REGISTRY-NAME>.azurecr.io/azurefunctionsimage:v1.0.0\", \"acrUseManagedIdentityCreds\": true, \"acrUserManagedIdentityID\":\"$UAMI_RESOURCE_ID\", \"appSettings\": [{\"name\": \"DOCKER_REGISTRY_SERVER_URL\", \"value\": \"<REGISTRY-NAME>.azurecr.io\"}]}}"

Kromě požadovaných nastavení az resource patch webu příkaz také aktualizuje DOCKER_REGISTRY_SERVER_URL nastavení aplikace na adresu URL vašeho serveru registru.

V tomto příkladu nahraďte <APP-NAME>, <REGISTRY-NAME>a <USER-IDENTITY-NAME> názvy vaší aplikace funkcí, registru kontejneru a identity v uvedeném pořadí.

Zadáním --workload-profile-name "Consumption" vytvoříte aplikaci v prostředí pomocí výchozího Consumption profilu úlohy, který stojí stejně jako spuštění v plánu Container Apps Consumption. Při prvním vytvoření aplikace funkcí načte počáteční image z registru.

Aktualizace nastavení aplikace

Pokud chcete hostiteli Functions povolit připojení k výchozímu účtu úložiště pomocí sdílených tajných kódů, musíte nastavení připojovacího řetězce nahradit ekvivalentním nastavením, které používá uživatelsky přiřazenou spravovanou identitu k připojení k účtu úložiště.

  1. Odeberte stávající nastavení řetězce připojení AzureWebJobsStorage:

    az containerapp config appsettings delete --name <APP-NAME> --resource-group AzureFunctionsContainers-rg --setting-names AzureWebJobsStorage 
    

    Příkaz az containerapp config appsettings delete odebere toto nastavení z vaší aplikace. Nahraďte <APP-NAME> názvem vaší aplikační funkce.

  2. Přidejte ekvivalentní nastavení s předponou AzureWebJobsStorage__ , která definuje připojení spravované identity přiřazené uživatelem k výchozímu účtu úložiště:

    clientId=$(az identity show --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --query 'clientId' -o tsv)
    az containerapp config appsettings set --name <APP-NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage__accountName=<STORAGE-NAME> AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId
    

    V tomto příkladu nahraďte <APP-NAME>, <USER-IDENTITY-NAME><STORAGE-NAME>názvem vaší aplikace funkcí, názvem vaší identity a názvem účtu úložiště.

V tomto okamžiku jsou vaše funkce spuštěné v prostředí Container Apps s už přidanými požadovanými nastaveními aplikace. V případě potřeby můžete do aplikace Functions přidat další nastavení standardním způsobem. Další informace naleznete v tématu Práce s nastavením aplikace.

Návod

Když provedete následné změny kódu funkce, budete muset znovu sestavit kontejner, znovu publikovat image do registru a aktualizovat aplikaci funkcí novou verzí image.

Ověření funkcí v Azure

Když je image nasazená do vaší aplikace funkcí v Azure, můžete tuto funkci vyvolat prostřednictvím požadavků HTTP. Získejte podrobné informace o konkrétní funkci:

    az containerapp function show \
    --resource-group AzureFunctionsContainers-rg \
    --name <APP-NAME> \
    --function-name HttpExample 

Nahraďte <APP-NAME> názvem vaší aplikační funkce. Pomocí adresy URL, kterou jste právě získali, volejte HttpExample koncový bod funkce a připojte řetězec dotazu ?name=Functions.

Adresa URL požadavku by měla vypadat přibližně takto:

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample

Go momentálně tuto funkci nepodporuje.

Vyčistěte zdroje

Pokud chcete pokračovat v práci s funkcí Azure Functions pomocí prostředků, které jste vytvořili v tomto článku, můžete všechny tyto prostředky ponechat na místě.

Až budete s nasazením této funkční aplikace hotovi, odstraňte AzureFunctionsContainers-rg skupinu prostředků a vyčistěte všechny prostředky, které tato skupina obsahuje.

az group delete --name AzureFunctionsContainers-rg

Další krok