Membuat aplikasi fungsi dalam kontainer kustom di Azure Container Apps

Dalam artikel ini, Anda membuat aplikasi Azure Functions yang berjalan di kontainer Linux dan menyebarkannya ke lingkungan Azure Container Apps dari registri kontainer. Dengan menyebarkan ke Container Apps, Anda dapat mengintegrasikan aplikasi fungsi Anda ke dalam layanan mikro cloud-native. Untuk informasi selengkapnya, lihat Hosting Azure Container Apps azure Functions.

Menyelesaikan quickstart ini akan dikenakan biaya kecil di akun Azure Anda, yang dapat diminimalkan dengan membersihkan sumber daya setelah selesai.

Memilih bahasa pengembangan Anda

Pertama, Anda menggunakan alat Azure Functions untuk membuat kode proyek Anda sebagai aplikasi fungsi dalam kontainer Docker dengan menggunakan gambar dasar Linux khusus bahasa. Pastikan untuk memilih bahasa pilihan Anda di bagian atas artikel.

Core Tools secara otomatis menghasilkan Dockerfile untuk proyek Anda yang menggunakan versi terbaru dari gambar dasar yang benar untuk bahasa fungsi Anda. Anda harus memperbarui kontainer Anda secara teratur dari gambar dasar terbaru dan menyebarkan ulang dari versi kontainer Anda yang diperbarui. Untuk informasi selengkapnya, lihat Membuat aplikasi fungsi dalam kontainer.

Prasyarat

Sebelum memulai, Anda harus memiliki persyaratan berikut:

  • Instal Azure CLI versi 2.4 atau yang lebih baru.

Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

Untuk menerbitkan gambar aplikasi fungsi kontainer yang Anda buat ke registri kontainer, Anda memerlukan ID Docker dan Docker Desktop yang berjalan di komputer lokal Anda. Jika Anda tidak memiliki ID Docker, Anda dapat membuat akun Docker.

Anda juga perlu menyelesaikan bagian Buat registri kontainer dari panduan memulai cepat Container Registry. Catat nama server masuk Anda yang sepenuhnya memenuhi syarat.

Membuat dan mengaktifkan lingkungan virtual

Di folder yang sesuai, jalankan perintah berikut untuk membuat dan mengaktifkan lingkungan virtual bernama .venv. Pastikan untuk menggunakan salah satu versi Python yang didukung oleh Azure Functions.

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

Jika Python tidak memasang paket venv pada distribusi Linux Anda, jalankan perintah berikut:

sudo apt-get install python3-venv

Anda menjalankan semua perintah berikutnya di lingkungan virtual yang diaktifkan ini.

Membuat dan menguji proyek fungsi lokal

Pada prompt terminal atau perintah, jalankan perintah berikut ini untuk bahasa yang telah dipilih untuk membuat proyek aplikasi fungsi pada folder saat ini:

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

Di folder kosong, jalankan perintah berikut untuk menghasilkan proyek Functions dari arketipe Maven:

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

Parameter -DjavaVersion memberi tahu runtime Functions versi Java mana yang akan digunakan. Gunakan -DjavaVersion=11 jika Anda ingin fungsi Anda berjalan di Java 11. Saat Anda tidak menentukan -DjavaVersion, Maven secara default menggunakan Java 8. Untuk informasi selengkapnya, lihat Versi Java.

Penting

Variabel lingkungan JAVA_HOME harus diatur ke lokasi penginstalan versi JDK yang benar untuk menyelesaikan artikel ini.

Maven meminta Anda memasukkan nilai yang diperlukan untuk menyelesaikan pembuatan proyek selama penyebaran. Ikuti perintahnya dan berikan informasi berikut:

Cepat Nilai Description
groupId com.fabrikam Nilai yang secara unik mengidentifikasi proyek Anda dari semua proyek, mengikuti aturan penamaan paket untuk Java.
artifactId fabrikam-functions Sebuah nilai yang merupakan nama jar, tanpa nomor versi.
version 1.0-SNAPSHOT Harap pilih nilai default.
package com.fabrikam.functions Nilai yang merupakan paket Java untuk kode fungsi yang dihasilkan. Gunakan default.

Ketik Y atau tekan Enter untuk mengonfirmasi.

Maven membuat file proyek di folder baru bernama artifactId, yang dalam contoh ini adalah fabrikam-functions.

Opsi --docker ini menghasilkan Dockerfile untuk proyek, yang menentukan kontainer yang cocok untuk digunakan dengan Azure Functions dan runtime yang dipilih.

Navigasi ke folder proyek:

cd fabrikam-functions

Gunakan perintah berikut ini untuk menambahkan fungsi ke proyek Anda, dengan argumen --name merupakan nama unik fungsi Anda dan argumen --template menentukan pemicu fungsi. func new membuat file kode C# dalam proyek Anda.

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

Gunakan perintah berikut ini untuk menambahkan fungsi ke proyek Anda, dengan argumen --name merupakan nama unik fungsi Anda dan argumen --template menentukan pemicu fungsi. func new membuat subfolder yang cocok dengan nama fungsi yang berisi file konfigurasi bernama function.json.

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

Untuk menguji fungsi secara lokal, mulailah host lokal runtime Azure Functions di root folder proyek. Untuk memastikan fungsi dapat dipanggil nanti ketika dihosting di Docker, periksa apakah tingkat otorisasi diatur ke AuthorizationLevel.Anonymous, atau atur jika belum dikonfigurasi.

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

Setelah Anda melihat HttpExample titik akhir yang ditulis ke output, navigasikan ke titik akhir tersebut. Anda akan melihat pesan selamat datang dalam output respons.

Setelah Anda melihat titik akhir yang HttpExample ditulis ke output, navigasikan ke http://localhost:7071/api/HttpExample?name=Functions. Browser harus menampilkan pesan "halo" yang mengulang Functions, berupa nilai yang diberikan ke parameter kueri name.

Tekan Ctrl+C (Command+C di macOS) untuk menghentikan host.

Membangun gambar kontainer dan memverifikasi secara lokal

(Opsional) Periksa Dockerfile di akar folder proyek. Dockerfile menjelaskan lingkungan yang diperlukan untuk menjalankan aplikasi fungsi di Linux. Daftar lengkap gambar dasar yang didukung untuk Azure Functions dapat ditemukan di halaman gambar dasar Azure Functions.

Di folder proyek akar, jalankan perintah build docker , berikan nama sebagai azurefunctionsimage, dan tag sebagai v1.0.0. Ganti <DOCKER-ID> dengan ID akun Docker Hub Anda. Perintah ini menyusun gambar Docker untuk kontainer.

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

Ketika perintah selesai, Anda dapat menjalankan kontainer baru secara lokal.

Untuk memverifikasi build, jalankan gambar dalam kontainer lokal menggunakan perintah jalankan docker , ganti <DOCKER-ID> lagi dengan ID akun Docker Hub Anda, dan tambahkan argumen port sebagai -p 8080:80:

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

Setelah gambar berjalan pada kontainer lokal, telusuri ke http://localhost:8080/api/HttpExample, yang akan menampilkan pesan sapaan yang sama dengan sebelumnya. Karena fungsi yang terpicu HTTP yang telah Anda buat menggunakan otorisasi anonim, Anda dapat memanggil fungsi yang berjalan di kontainer tanpa harus mendapatkan kunci akses. Untuk informasi selengkapnya, lihat kunci otorisasi.

Setelah gambar berjalan dalam kontainer lokal, telusuri ke http://localhost:8080/api/HttpExample?name=Functions, yang akan menampilkan pesan "halo" yang sama dengan sebelumnya. Karena fungsi yang terpicu HTTP yang telah Anda buat menggunakan otorisasi anonim, Anda dapat memanggil fungsi yang berjalan di kontainer tanpa harus mendapatkan kunci akses. Untuk informasi selengkapnya, lihat kunci otorisasi.

Setelah memverifikasi aplikasi fungsi di kontainer, tekan Ctrl+C (Command+C di macOS) untuk menghentikan eksekusi.

Menerbitkan gambar kontainer ke registri

Untuk membuat image kontainer Anda tersedia untuk penyebaran ke lingkungan hosting, Anda perlu mengunggahnya ke registri kontainer. Sebagai praktik terbaik keamanan, Anda harus menggunakan instans Azure Container Registry dan menerapkan koneksi berbasis identitas terkelola. Docker Hub mengharuskan Anda mengautentikasi menggunakan rahasia bersama, yang membuat penyebaran Anda lebih rentan.

Azure Container Registry adalah layanan registri privat untuk membangun, menyimpan, dan mengelola gambar kontainer dan artefak terkait. Anda harus menggunakan layanan registri privat untuk menerbitkan kontainer Anda ke layanan Azure.

  1. Gunakan perintah ini untuk masuk ke instans registri Anda menggunakan kredensial Azure Anda saat ini. Ganti <REGISTRY-NAME> dengan nama instans Container Registry Anda.

    az acr login --name <REGISTRY-NAME>
    
  2. Gunakan perintah ini untuk menandai gambar Anda dengan nama server masuk registri Anda yang sepenuhnya memenuhi syarat. Ganti <LOGIN-SERVER> dengan nama server masuk registri Anda yang sepenuhnya memenuhi syarat dan <DOCKER-ID> dengan ID Docker Anda.

    docker tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 <LOGIN-SERVER>/azurefunctionsimage:v1.0.0 
    
  3. Gunakan perintah ini untuk mendorong kontainer ke instans registri Anda:

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

Membuat sumber daya Azure pendukung untuk fungsi Anda

Sebelum dapat menyebarkan kontainer ke Azure, Anda perlu membuat tiga sumber daya:

  • Grup sumber daya, yang merupakan kontainer logis untuk sumber daya terkait.

  • Akun penyimpanan Azure, yang digunakan untuk mempertahankan status dan informasi lain tentang fungsi Anda.

  • Lingkungan Azure Container Apps dengan ruang kerja Log Analytics.

  • Identitas terkelola yang ditetapkan pengguna, yang memungkinkan aplikasi fungsi Anda terhubung dengan aman ke sumber daya Azure tanpa menggunakan rahasia bersama. Koneksi ke akun penyimpanan Azure dan ke instans Azure Container Registry dibuat dengan menggunakan autentikasi Microsoft Entra dengan identitas, yang direkomendasikan untuk skenario ini.

    Nota

    Docker Hub tidak mendukung identitas terkelola.

Gunakan perintah ini untuk membuat sumber daya Azure yang diperlukan:

  1. Jika perlu, masuk ke Azure:

    Perintah az login akan menandatangani Anda ke akun Azure Anda. Gunakan az account set saat Anda memiliki lebih dari satu langganan yang terkait dengan akun Anda.

  2. Jalankan perintah berikut untuk memperbarui Azure CLI ke versi terbaru:

    az upgrade
    

    Jika versi Azure CLI Anda bukan versi terbaru, penginstalan dimulai. Cara peningkatan tergantung pada sistem operasi Anda. Anda dapat melanjutkan setelah peningkatan selesai.

  3. Jalankan perintah berikut yang meningkatkan ekstensi Azure Container Apps dan mendaftarkan namespace layanan yang diperlukan oleh 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. Buat grup sumber daya bernama AzureFunctionsContainers-rg.

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

    Perintah ini az group create membuat grup sumber daya di wilayah US Timur. Jika Anda ingin menggunakan wilayah di dekat Anda, gunakan kode wilayah yang tersedia yang dikembalikan oleh perintah az account list-locations. Anda harus mengubah perintah berikutnya untuk menggunakan wilayah kustom Anda alih-alih eastus.

  5. Buat lingkungan Azure Container Apps.

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

    Perintah ini bisa memakan waktu beberapa menit untuk diselesaikan.

  6. Buat akun penyimpanan tujuan umum di grup dan wilayah sumber daya Anda, tanpa akses kunci bersama. Dalam perintah , ganti <STORAGE-NAME> dengan nama yang sesuai untuk Anda dan unik di Azure Storage. Nama penyimpanan harus terdiri dari 3 hingga 24 karakter, angka, dan huruf kecil saja.

    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
    

    Perintah az storage account create membuat akun penyimpanan yang hanya dapat diakses dengan menggunakan identitas terautentikasi Microsoft Entra yang diberikan izin ke sumber daya tertentu.

    Standard_LRS menentukan akun tujuan umum yang didukung oleh Functions.

  7. Buat identitas terkelola dan gunakan yang dikembalikan principalId untuk memberinya akses ke akun penyimpanan Anda dan menarik izin di instans registri Anda. Ganti <REGISTRY-NAME>, <USER-IDENTITY-NAME>, dan <STORAGE-NAME> dengan nama registri kontainer yang ada, nama untuk identitas terkelola Anda, dan nama akun penyimpanan masing-masing.

    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
    

    Perintah az identity create membuat identitas terkelola yang ditetapkan pengguna dan az role assignment createperintah menambahkan identitas Anda ke peran yang diperlukan.

    Identitas terkelola sekarang tersedia untuk aplikasi untuk mengakses akun penyimpanan dan Azure Container Registry tanpa menggunakan rahasia bersama.

Membuat dan mengonfigurasi aplikasi fungsi di Azure dengan gambar

Aplikasi fungsi di Azure mengelola eksekusi fungsi Anda di lingkungan Azure Container Apps Anda. Di bagian ini, Anda menggunakan sumber daya Azure dari bagian sebelumnya untuk membuat aplikasi fungsi dari gambar di registri kontainer di lingkungan Container Apps. Anda juga mengonfigurasi lingkungan baru dengan string koneksi ke akun Azure Storage yang diperlukan.

az containerapp create --kind=functionapp Gunakan perintah untuk membuat aplikasi fungsi di lingkungan terkelola baru yang didukung oleh Azure Container Apps. Dalam az containerapp create --kind-functionapp, --environment parameter menentukan lingkungan Aplikasi Kontainer.

Petunjuk / Saran

Untuk memastikan bahwa aplikasi fungsi Anda menggunakan koneksi berbasis identitas terkelola ke instans registri Anda, jangan atur --image parameter di az containerapp create --kind=functionapp. Saat Anda mengatur --image ke nama gambar Anda yang sepenuhnya memenuhi syarat di repositori, kredensial rahasia bersama diperoleh dari registri Anda dan disimpan di pengaturan aplikasi.

Pertama, Anda harus mendapatkan nilai ID yang sepenuhnya memenuhi syarat dari identitas terkelola yang ditetapkan oleh pengguna Anda dengan akses penarikan ke registri, lalu gunakan perintah az containerapp create --kind=functionapp untuk membuat aplikasi fungsi menggunakan gambar default dan menetapkan identitas ini ke aplikasi tersebut.

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

Di az containerapp create --kind=functionapp, identitas terkelola Anda di-assign ke aplikasi baru oleh --assign-identity. Karena Anda tidak mengatur parameter --image di dalam az functionapp create, aplikasi dibuat menggunakan gambar sementara.

Dalam contoh ini, ganti <APP-NAME> dan <STORAGE-NAME> dengan nama untuk aplikasi fungsi baru Anda serta nama akun penyimpanan Anda.

Terakhir, Anda harus memperbarui linuxFxVersion pengaturan situs ke nama gambar Anda yang sepenuhnya memenuhi syarat di repositori. Anda juga harus memperbarui acrUseManagedIdentityCreds dan acrUserManagedIdentityID pengaturan situs sehingga identitas terkelola digunakan saat memperoleh gambar dari registri.

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\"}]}}"

Selain pengaturan situs yang diperlukan, az resource patch perintah juga memperbarui DOCKER_REGISTRY_SERVER_URL pengaturan aplikasi ke URL server registri Anda.

Dalam contoh ini, ganti <APP-NAME>, <REGISTRY-NAME>, dan <USER-IDENTITY-NAME> dengan nama aplikasi fungsi, registri kontainer, dan identitas Anda.

Menentukan --workload-profile-name "Consumption" membuat aplikasi Anda di lingkungan menggunakan profil beban kerja default Consumption , yang biayanya sama dengan berjalan dalam paket Konsumsi Aplikasi Kontainer. Saat pertama kali Anda membuat aplikasi fungsi, aplikasi tersebut menarik gambar awal dari registri Anda.

Memperbarui pengaturan aplikasi

Untuk mengaktifkan host Functions agar dapat terhubung ke akun penyimpanan default menggunakan kunci bersama, Anda harus mengganti pengaturan string koneksi AzureWebJobsStorage dengan pengaturan yang setara yang menggunakan identitas terkelola pengguna untuk menyambungkan ke akun penyimpanan.

  1. Hapus pengaturan string koneksi AzureWebJobsStorage yang ada:

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

    Perintah az containerapp config appsettings delete menghapus pengaturan ini dari aplikasi Anda. Ganti <APP-NAME> dengan nama aplikasi fungsi Anda.

  2. Tambahkan pengaturan setara, dengan awalan AzureWebJobsStorage__, yang mendefinisikan koneksi identitas terkelola yang ditetapkan pengguna ke akun penyimpanan default:

    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
    

    Dalam contoh ini, ganti <APP-NAME>, <USER-IDENTITY-NAME>, <STORAGE-NAME> dengan nama aplikasi fungsi Anda, nama identitas Anda, dan nama akun penyimpanan.

Pada titik ini, fungsi Anda berjalan di lingkungan Container Apps, dengan pengaturan aplikasi yang diperlukan sudah ditambahkan. Jika diperlukan, Anda dapat menambahkan pengaturan lain di aplikasi fungsi Anda dengan cara standar untuk Functions. Untuk informasi selengkapnya, harap lihat Bekerja dengan pengaturan aplikasi.

Petunjuk / Saran

Saat membuat perubahan berikutnya pada kode fungsi, Anda perlu membangun kembali kontainer, menerbitkan ulang gambar ke registri, dan memperbarui aplikasi fungsi dengan versi gambar baru.

Memverifikasi fungsi Anda di Azure

Dengan gambar yang disebarkan ke aplikasi fungsi Anda di Azure, Anda sekarang dapat memanggil fungsi melalui permintaan HTTP. Dapatkan informasi terperinci tentang fungsi tertentu:

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

Ganti <APP-NAME> dengan nama aplikasi fungsi Anda. Gunakan URL yang baru saja Anda peroleh untuk memanggil HttpExample titik akhir fungsi, menambahkan string kueri ?name=Functions.

URL permintaan akan terlihat seperti ini:

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

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

Go saat ini tidak didukung untuk fitur ini.

Membersihkan sumber daya

Jika Anda ingin terus bekerja dengan Azure Function menggunakan sumber daya yang Anda buat di artikel ini, Anda dapat membiarkan semua sumber daya tersebut di tempatnya.

Setelah selesai bekerja dengan penyebaran aplikasi fungsi ini, hapus AzureFunctionsContainers-rg grup sumber daya untuk membersihkan semua sumber daya dalam grup tersebut:

az group delete --name AzureFunctionsContainers-rg

Langkah selanjutnya