Tworzenie pierwszych konteneryzowanych funkcji w usłudze Azure Container Apps
W tym artykule utworzysz aplikację funkcji działającą w kontenerze systemu Linux i wdrożysz ją w środowisku usługi Azure Container Apps z rejestru kontenerów. Wdrażając w usłudze Container Apps, możesz zintegrować aplikacje funkcji z mikrousługami natywnymi dla chmury. Aby uzyskać więcej informacji, zobacz Hostowanie usługi Azure Container Apps w usłudze Azure Functions.
W tym artykule pokazano, jak tworzyć funkcje działające w kontenerze systemu Linux i wdrażać kontener w środowisku usługi Container Apps.
Ukończenie tego przewodnika Szybki start wiąże się z niewielkim kosztem kilku centów USD lub mniej na koncie platformy Azure, co można zminimalizować, czyszcząc zasoby po zakończeniu pracy.
Ważne
Obsługa hostowania aplikacji funkcji w usłudze Azure Container Apps jest obecnie dostępna w wersji zapoznawczej.
Wybierz język programowania
Najpierw użyjesz narzędzi usługi Azure Functions, aby utworzyć kod projektu jako aplikację funkcji w kontenerze platformy Docker przy użyciu obrazu podstawowego systemu Linux specyficznego dla języka. Pamiętaj, aby wybrać wybrany język w górnej części artykułu.
Narzędzia Core Tools automatycznie generują plik Dockerfile dla projektu, który używa najbardziej aktualnej wersji poprawnego obrazu podstawowego dla języka funkcji. Należy regularnie aktualizować kontener z najnowszego obrazu podstawowego i ponownie wdrażać go ze zaktualizowanej wersji kontenera. Aby uzyskać więcej informacji, zobacz Tworzenie konteneryzowanych aplikacji funkcji.
Wymagania wstępne
Przed rozpoczęciem należy spełnić następujące wymagania:
Zainstaluj zestaw .NET 6 SDK.
Zainstaluj narzędzia Azure Functions Core Tools w wersji 4.0.5198 lub nowszej.
- Zainstaluj narzędzia Azure Functions Core Tools w wersji 4.x.
- Zainstaluj wersję Node.js obsługiwaną przez usługę Azure Functions.
- Zainstaluj wersję języka Python obsługiwaną przez usługę Azure Functions.
- Zainstaluj zestaw .NET 6 SDK.
Zainstaluj wersję zestawu Java Developer Kit obsługiwanego przez usługę Azure Functions.
Zainstaluj program Apache Maven w wersji 3.0 lub nowszej.
- Interfejs wiersza polecenia platformy Azure w wersji 2.4 lub nowszej.
Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.
Aby opublikować obraz aplikacji funkcji konteneryzowanej tworzony w rejestrze kontenerów, potrzebny jest identyfikator platformy Docker i platforma Docker uruchomiona na komputerze lokalnym. Jeśli nie masz identyfikatora platformy Docker, możesz utworzyć konto platformy Docker.
Należy również ukończyć sekcję Tworzenie rejestru kontenerów w przewodniku Szybki start usługi Container Registry, aby utworzyć wystąpienie rejestru. Zanotuj w pełni kwalifikowaną nazwę serwera logowania.
Tworzenie i aktywowanie środowiska wirtualnego
W odpowiednim folderze uruchom następujące polecenia, aby utworzyć i aktywować środowisko wirtualne o nazwie .venv
. Upewnij się, że używasz jednej z wersji języka Python obsługiwanych przez usługę Azure Functions.
python -m venv .venv
source .venv/bin/activate
Jeśli język Python nie zainstalował pakietu venv w dystrybucji systemu Linux, uruchom następujące polecenie:
sudo apt-get install python3-venv
Wszystkie kolejne polecenia są uruchamiane w tym aktywowanym środowisku wirtualnym.
Tworzenie i testowanie projektu funkcji lokalnych
W terminalu lub wierszu polecenia uruchom następujące polecenie dla wybranego języka, aby utworzyć projekt aplikacji funkcji w bieżącym folderze:
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
W pustym folderze uruchom następujące polecenie, aby wygenerować projekt usługi Functions na podstawie archetypu narzędzia Maven:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker
Parametr -DjavaVersion
informuje środowisko uruchomieniowe usługi Functions o wersji języka Java do użycia. Użyj polecenia -DjavaVersion=11
, jeśli chcesz, aby funkcje działały w języku Java 11. Jeśli nie określisz -DjavaVersion
parametru , program Maven domyślnie maven to Java 8. Aby uzyskać więcej informacji, zobacz Wersje języka Java.
Ważne
Aby ukończyć ten artykuł, zmienna JAVA_HOME
środowiskowa musi być ustawiona na lokalizację instalacji prawidłowej wersji zestawu JDK.
Narzędzie Maven prosi o podanie wartości potrzebnych do zakończenia generowania projektu we wdrożeniu. Postępuj zgodnie z monitami i podaj następujące informacje:
Monit | Wartość | Opis |
---|---|---|
Groupid | com.fabrikam |
Wartość, która jednoznacznie identyfikuje projekt we wszystkich projektach, zgodnie z regułami nazewnictwa pakietów dla języka Java. |
artifactId | fabrikam-functions |
Wartość, która jest nazwą pliku jar bez numeru wersji. |
version | 1.0-SNAPSHOT |
Wybierz wartość domyślną. |
Pakiet | com.fabrikam.functions |
Wartość, która jest pakietem Java dla wygenerowanego kodu funkcji. Użyj wartości domyślnej. |
Wpisz Y
lub naciśnij klawisz Enter, aby potwierdzić.
Narzędzie Maven tworzy pliki projektu w nowym folderze o nazwie artifactId, który w tym przykładzie to fabrikam-functions
.
Opcja --docker
generuje plik Dockerfile dla projektu, który definiuje odpowiedni kontener do użycia z usługą Azure Functions i wybranym środowiskiem uruchomieniowym.
Przejdź do folderu projektu:
cd fabrikam-functions
Użyj następującego polecenia, aby dodać funkcję do projektu, gdzie --name
argument jest unikatową nazwą funkcji, a --template
argument określa wyzwalacz funkcji. func new
tworzy plik kodu w języku C# w projekcie.
func new --name HttpExample --template "HTTP trigger" --authlevel anonymous
Użyj następującego polecenia, aby dodać funkcję do projektu, gdzie --name
argument jest unikatową nazwą funkcji, a --template
argument określa wyzwalacz funkcji. func new
Tworzy podfolder pasujący do nazwy funkcji zawierającej plik konfiguracji o nazwie function.json.
func new --name HttpExample --template "HTTP trigger" --authlevel anonymous
Aby przetestować funkcję lokalnie, uruchom lokalnego hosta środowiska uruchomieniowego usługi Azure Functions w katalogu głównym folderu projektu.
func start
func start
npm install
npm start
mvn clean package
mvn azure-functions:run
Po wyświetleniu punktu końcowego zapisanego HttpExample
w danych wyjściowych przejdź do tego punktu końcowego. W danych wyjściowych odpowiedzi powinien zostać wyświetlony komunikat powitalny.
Po wyświetleniu punktu końcowego zapisanego HttpExample
w danych wyjściowych przejdź do http://localhost:7071/api/HttpExample?name=Functions
strony . Przeglądarka musi wyświetlić komunikat "hello", który zwraca Functions
wartość , podaną do parametru name
zapytania.
Naciśnij klawisze Ctrl+C (polecenie+C w systemie macOS), aby zatrzymać hosta.
Kompilowanie obrazu kontenera i weryfikowanie go lokalnie
(Opcjonalnie) Sprawdź plik Dockerfile w katalogu głównym folderu projektu. Plik Dockerfile opisuje wymagane środowisko do uruchamiania aplikacji funkcji w systemie Linux. Pełną listę obsługiwanych obrazów podstawowych dla usługi Azure Functions można znaleźć na stronie obrazu podstawowego usługi Azure Functions.
W folderze głównym projektu uruchom polecenie docker build , podaj nazwę jako azurefunctionsimage
i tag jako v1.0.0
. Zastąp ciąg <DOCKER_ID>
identyfikatorem konta usługi Docker Hub. To polecenie powoduje skompilowanie obrazu platformy Docker dla kontenera.
docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
Po zakończeniu działania polecenia można uruchomić nowy kontener lokalnie.
Aby zweryfikować kompilację, uruchom obraz w kontenerze lokalnym przy użyciu polecenia docker run , zastąp <DOCKER_ID>
ponownie identyfikatorem konta usługi Docker Hub i dodaj argument portów jako -p 8080:80
:
docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0
Po uruchomieniu obrazu w kontenerze lokalnym przejdź do http://localhost:8080/api/HttpExample
adresu , który musi wyświetlić ten sam komunikat powitania, jak poprzednio. Ponieważ utworzona funkcja wyzwalana przez protokół HTTP używa autoryzacji anonimowej, można wywołać funkcję działającą w kontenerze bez konieczności uzyskiwania klucza dostępu. Aby uzyskać więcej informacji, zobacz klucze autoryzacji.
Po uruchomieniu obrazu w kontenerze lokalnym przejdź do http://localhost:8080/api/HttpExample?name=Functions
adresu , który musi wyświetlać ten sam komunikat "hello", co poprzednio. Ponieważ utworzona funkcja wyzwalana przez protokół HTTP używa autoryzacji anonimowej, można wywołać funkcję działającą w kontenerze bez konieczności uzyskiwania klucza dostępu. Aby uzyskać więcej informacji, zobacz klucze autoryzacji.
Po zweryfikowaniu aplikacji funkcji w kontenerze naciśnij klawisze Ctrl+C (Polecenie+C w systemie macOS), aby zatrzymać wykonywanie.
Publikowanie obrazu kontenera w rejestrze
Aby udostępnić obraz kontenera do wdrożenia w środowisku hostingu, należy wypchnąć go do rejestru kontenerów.
Azure Container Registry to prywatna usługa rejestru służąca do tworzenia, przechowywania obrazów kontenerów i powiązanych artefaktów oraz zarządzania nimi. Do publikowania kontenerów w usługach platformy Azure należy użyć prywatnej usługi rejestru.
Użyj następującego polecenia, aby zalogować się do wystąpienia rejestru:
az acr login --name <REGISTRY_NAME>
W poprzednim poleceniu zastąp
<REGISTRY_NAME>
ciąg nazwą wystąpienia usługi Container Registry.Użyj następującego polecenia, aby otagować obraz przy użyciu w pełni kwalifikowanej nazwy serwera logowania rejestru:
docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Zastąp
<LOGIN_SERVER>
ciąg w pełni kwalifikowaną nazwą serwera logowania rejestru i<DOCKER_ID>
identyfikatorem platformy Docker.Użyj następującego polecenia, aby wypchnąć kontener do wystąpienia rejestru:
docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Użyj następującego polecenia, aby włączyć wbudowane konto administratora, aby usługa Functions mogła nawiązać połączenie z rejestrem przy użyciu nazwy użytkownika i hasła:
az acr update -n <REGISTRY_NAME> --admin-enabled true
Użyj następującego polecenia, aby pobrać nazwę użytkownika i hasło administratora, które funkcje muszą połączyć się z rejestrem:
az acr credential show -n <REGISTRY_NAME> --query "[username, passwords[0].value]" -o tsv
Ważne
Nazwa użytkownika i hasło konta administratora są ważnymi poświadczeniami. Pamiętaj, aby przechowywać je bezpiecznie i nigdy nie w dostępnej lokalizacji, takiej jak repozytorium publiczne.
Tworzenie pomocniczych zasobów platformy Azure dla funkcji
Przed wdrożeniem kontenera na platformie Azure należy utworzyć trzy zasoby:
- Grupa zasobów, która jest kontenerem logicznym dla powiązanych zasobów.
- Konto magazynu, które służy do obsługi stanu i innych informacji o funkcjach.
- Środowisko usługi Azure Container Apps z obszarem roboczym usługi Log Analytics.
Użyj następujących poleceń, aby utworzyć te elementy.
Jeśli jeszcze tego nie zrobiono, zaloguj się do platformy Azure.
Polecenie
az login
powoduje zalogowanie cię do konta platformy Azure. Użyjaz account set
polecenia , jeśli masz więcej niż jedną subskrypcję skojarzona z twoim kontem.Uruchom następujące polecenie, aby zaktualizować interfejs wiersza polecenia platformy Azure do najnowszej wersji:
az upgrade
Jeśli twoja wersja interfejsu wiersza polecenia platformy Azure nie jest najnowszą wersją, rozpocznie się instalacja. Sposób uaktualniania zależy od systemu operacyjnego. Możesz kontynuować po zakończeniu uaktualniania.
Uruchom następujące polecenia, aby uaktualnić rozszerzenie usługi Azure Container Apps i zarejestrować przestrzenie nazw wymagane przez usługę 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
Utwórz grupę zasobów o nazwie
AzureFunctionsContainers-rg
.az group create --name AzureFunctionsContainers-rg --location eastus
To
az group create
polecenie tworzy grupę zasobów w regionie Wschodnie stany USA. Jeśli zamiast tego chcesz użyć regionu w pobliżu, użyj dostępnego kodu regionu zwróconego z polecenia az account list-locations . Należy zmodyfikować kolejne polecenia, aby używać regionu niestandardowegoeastus
zamiast . Obecnie obsługiwane regiony można używać tylko w wersji zapoznawczej.Tworzenie środowiska aplikacji kontenera platformy Azure z włączonymi profilami obciążeń.
az containerapp env create --name MyContainerappEnvironment --enable-workload-profiles --resource-group AzureFunctionsContainers-rg --location eastus
Wykonanie tego polecenia może potrwać do 10 minut.
Utwórz konto magazynu ogólnego przeznaczenia w grupie zasobów i regionie.
az storage account create --name <STORAGE_NAME> --location eastus --resource-group AzureFunctionsContainers-rg --sku Standard_LRS
Polecenie
az storage account create
tworzy konto magazynu.W poprzednim przykładzie zastąp
<STORAGE_NAME>
ciąg nazwą odpowiednią dla Ciebie i unikatową w usłudze Azure Storage. Nazwy magazynu muszą zawierać od 3 do 24 znaków i tylko małe litery.Standard_LRS
określa konto ogólnego przeznaczenia obsługiwane przez funkcje.Przed kontynuowaniem użyj tego polecenia, aby sprawdzić, czy środowisko jest gotowe.
az containerapp env show -n MyContainerappEnvironment -g AzureFunctionsContainers-rg
Tworzenie i konfigurowanie aplikacji funkcji na platformie Azure przy użyciu obrazu
Aplikacja funkcji na platformie Azure zarządza wykonywaniem funkcji w środowisku usługi Azure Container Apps. W tej sekcji użyjesz zasobów platformy Azure z poprzedniej sekcji, aby utworzyć aplikację funkcji na podstawie obrazu w rejestrze kontenerów w środowisku usługi Container Apps. Nowe środowisko można również skonfigurować przy użyciu parametry połączenia do wymaganego konta usługi Azure Storage.
Użyj polecenia , az functionapp create
aby utworzyć aplikację funkcji w nowym środowisku zarządzanym wspieranym przez usługę Azure Container Apps:
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime dotnet-isolated --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-server <LOGIN_SERVER> --registry-username <REGISTRY_NAME> --registry-password <ADMIN_PASSWORD>
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime node --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-server <LOGIN_SERVER> --registry-username <REGISTRY_NAME> --registry-password <ADMIN_PASSWORD>
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime java --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-server <LOGIN_SERVER> --registry-username <REGISTRY_NAME> --registry-password <ADMIN_PASSWORD>
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime powershell --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-server <LOGIN_SERVER> --registry-username <REGISTRY_NAME> --registry-password <ADMIN_PASSWORD>
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime python --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-server <LOGIN_SERVER> --registry-username <REGISTRY_NAME> --registry-password <ADMIN_PASSWORD>
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime node --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-server <LOGIN_SERVER> --registry-username <REGISTRY_NAME> --registry-password <ADMIN_PASSWORD>
W poleceniu az functionapp create
--environment
parametr określa środowisko Container Apps, a --image
parametr określa obraz do użycia dla aplikacji funkcji. W tym przykładzie zastąp <STORAGE_NAME>
ciąg nazwą użytą w poprzedniej sekcji dla konta magazynu. Zastąp <APP_NAME>
również globalnie unikatową nazwą odpowiednią dla Ciebie, <LOGIN_SERVER>
w pełni kwalifikowanym serwerem usługi Container Registry, <REGISTRY_NAME>
nazwą rejestru konta i <ADMIN_PASSWORD>
hasłem do konta administratora.
Ważne
Nazwa użytkownika i hasło konta administratora są ważnymi poświadczeniami. Pamiętaj, aby przechowywać je bezpiecznie i nigdy nie w dostępnej lokalizacji, takiej jak repozytorium publiczne.
Określenie tworzenia --workload-profile-name "Consumption"
aplikacji w środowisku przy użyciu domyślnego Consumption
profilu obciążenia, który kosztuje to samo, co w planie Zużycie aplikacji kontenera. Po pierwszym utworzeniu aplikacji funkcji pobiera on początkowy obraz z rejestru.
Na tym etapie funkcje działają w środowisku usługi Container Apps z już dodanymi wymaganymi ustawieniami aplikacji. W razie potrzeby możesz dodać inne ustawienia w aplikacji funkcji w standardowy sposób dla usługi Functions. Aby uzyskać więcej informacji, zobacz Używanie ustawień aplikacji.
Napiwek
Po wprowadzeniu kolejnych zmian w kodzie funkcji należy ponownie skompilować kontener, ponownie opublikować obraz w rejestrze i zaktualizować aplikację funkcji przy użyciu nowej wersji obrazu. Aby uzyskać więcej informacji, zobacz Aktualizowanie obrazu w rejestrze
Weryfikowanie funkcji na platformie Azure
Obraz wdrożony w aplikacji funkcji na platformie Azure umożliwia teraz wywoływanie funkcji za pośrednictwem żądań HTTP.
Uruchom następujące
az functionapp function show
polecenie, aby uzyskać adres URL nowej funkcji:az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate
Zastąp
<APP_NAME>
ciąg nazwą aplikacji funkcji.
- Użyj właśnie uzyskanego
HttpExample
adresu URL, aby wywołać punkt końcowy funkcji, dołączając ciąg?name=Functions
zapytania .
- Użyj właśnie uzyskanego
HttpExample
adresu URL, aby wywołać punkt końcowy funkcji.
Po przejściu do tego adresu URL przeglądarka musi wyświetlać podobne dane wyjściowe, jak podczas lokalnego uruchamiania funkcji.
Adres URL żądania powinien wyglądać mniej więcej tak:
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample
Czyszczenie zasobów
Jeśli chcesz kontynuować pracę z funkcją platformy Azure przy użyciu zasobów utworzonych w tym artykule, możesz pozostawić wszystkie te zasoby na miejscu.
Po zakończeniu pracy z wdrożeniem tej aplikacji funkcji usuń grupę AzureFunctionsContainers-rg
zasobów, aby wyczyścić wszystkie zasoby w tej grupie:
az group delete --name AzureFunctionsContainers-rg