Azure Container Apps'te özel bir kapsayıcıda işlev uygulaması oluşturma

Bu makalede, Linux kapsayıcısında çalışan bir Azure İşlevleri uygulaması oluşturacak ve bunu kapsayıcı kayıt defterinden bir Azure Container Apps ortamına dağıtacaksınız. Container Apps'e dağıtarak işlev uygulamalarınızı bulutta yerel mikro hizmetlerle tümleştirebilirsiniz. Daha fazla bilgi için Azure İşlevleri'ni barındıran Azure Container Apps bölümüne bakın.

Bu hızlı başlangıcı tamamlamak, Azure hesabınızda küçük bir maliyete neden olur ve işiniz bittiğinde kaynakları temizleyerek en aza indirebilirsiniz.

Geliştirme dilinizi seçin

İlk olarak, docker kapsayıcısında dile özgü bir Linux temel görüntüsü kullanarak proje kodunuzu işlev uygulaması olarak oluşturmak için Azure İşlevleri araçlarını kullanırsınız. Makalenin üst kısmında istediğiniz dili seçtiğinizden emin olun.

Çekirdek Araçlar, projeniz için otomatik olarak işlev diliniz için doğru temel görüntünün en güncel sürümünü kullanan bir Dockerfile oluşturur. Kapsayıcınızı en son temel görüntüden düzenli olarak güncelleştirmeli ve kapsayıcınızın güncelleştirilmiş sürümünden yeniden dağıtmalısınız. Daha fazla bilgi için bkz. Kapsayıcılı işlev uygulamaları oluşturma.

Önkoşullar

Başlamadan önce aşağıdaki gereksinimleri karşılamanız gerekir:

  • Azure CLI sürüm 2.4 veya üzerini yükleyin.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Oluşturduğunuz kapsayıcılı işlev uygulaması görüntüsünü bir kapsayıcı kayıt defterinde yayımlamak için yerel bilgisayarınızda çalışan bir Docker Kimliği ve Docker Desktop gerekir. Docker kimliğiniz yoksa bir Docker hesabı oluşturabilirsiniz.

Ayrıca Kapsayıcı Kayıt Defteri hızlı başlangıç bölümünün Kapsayıcı kayıt defteri oluşturma kısmını da tamamlamanız gerekir. Tam nitelikli oturum açma sunucusu adınızı not edin.

Sanal ortam oluşturma ve etkinleştirme

Uygun bir klasörde aşağıdaki komutları çalıştırarak adlı .venvbir sanal ortam oluşturun ve etkinleştirin. Azure İşlevleri tarafından desteklenen Python sürümlerinden birini kullandığınızdan emin olun.

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

Python venv paketini Linux dağıtımınıza yüklemediyse aşağıdaki komutu çalıştırın:

sudo apt-get install python3-venv

Bu etkinleştirilmiş sanal ortamda sonraki tüm komutları çalıştırırsınız.

Yerel işlevler projesini oluşturma ve test etme

Terminalde veya komut isteminde, geçerli klasörde bir işlev uygulaması projesi oluşturmak için seçtiğiniz dil için aşağıdaki komutu çalıştırın:

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

Boş bir klasörde aşağıdaki komutu çalıştırarak İşlevler projesini bir Maven arketipinden oluşturun:

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

parametresi İşlevler -DjavaVersion çalışma zamanına hangi Java sürümünün kullanılacağını bildirir. İşlevlerinizin Java 11 üzerinde çalışmasını istiyorsanız -DjavaVersion=11 ifadesini kullanın. belirtmediğinizde Maven varsayılan olarak Java 8'i kullanır -DjavaVersion. Daha fazla bilgi için bkz. Java sürümleri.

Önemli

Bu JAVA_HOME makaleyi tamamlamak için ortam değişkeni, JDK'nin doğru sürümünün yükleme konumuna ayarlanmalıdır.

Maven, projeyi dağıtımda oluşturma işlemini tamamlamak için gereken değerleri ister. istemleri izleyin ve aşağıdaki bilgileri sağlayın:

Uyarı Değer Description
groupId com.fabrikam Java için paket adlandırma kurallarını izleyerek projenizi tüm projelerde benzersiz olarak tanımlayan bir değer.
artifactId fabrikam-functions Sürüm numarası içermeyen jar'ın adı olarak bir değer.
version 1.0-SNAPSHOT Varsayılan değeri seçin.
paket com.fabrikam.functions Oluşturulan işlev kodu için Java paketi olan bir değer. Varsayılan değeri kullanın.

Yazın Y veya onaylamak için Enter tuşuna basın.

Maven, proje dosyalarını artifactId adlı yeni bir klasörde oluşturur. Bu örnekte şöyledir fabrikam-functions: .

seçeneği --docker , proje için Azure İşlevleri ve seçilen çalışma zamanı ile kullanmak için uygun bir kapsayıcı tanımlayan bir Dockerfile oluşturur.

Proje klasörüne gidin:

cd fabrikam-functions

Aşağıdaki komutu kullanarak projenize işlev ekleyin. Burada --name bağımsız değişken işlevinizin benzersiz adıdır ve --template bağımsız değişken işlevin tetikleyicisini belirtir. func new projenizde bir C# kod dosyası oluşturur.

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

Aşağıdaki komutu kullanarak projenize işlev ekleyin. Burada --name bağımsız değişken işlevinizin benzersiz adıdır ve --template bağımsız değişken işlevin tetikleyicisini belirtir. func new , function.jsonadlı bir yapılandırma dosyası içeren işlev adıyla eşleşen bir alt klasör oluşturur.

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

İşlevi yerel olarak test etmek için projenin kök dizininde yerel Azure İşlevleri çalışma zamanı ortamını başlatın. İşlevin daha sonra Docker'da barındırıldığında çağrılabilmesini sağlamak için yetkilendirme düzeyinin olarak ayarlandığından AuthorizationLevel.Anonymousemin olun veya henüz yapılandırılmadıysa ayarlayın.

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

Çıkışa HttpExample yazılan uç noktayı gördükten sonra bu uç noktaya gidin. Yanıt çıkışında bir karşılama iletisi görmeniz gerekir.

Çıkışa HttpExample yazılan uç noktayı gördükten sonra http://localhost:7071/api/HttpExample?name=Functions adresine gidin. Tarayıcının, Functions sorgu parametresine sağlanan değeri geri döndüren name bir "hello" iletisi görüntülemesi gerekir.

Konağı durdurmak için Ctrl+C (macOS'taC+) tuşlarına basın.

Kapsayıcı görüntüsünü oluşturma ve yerel olarak doğrulama

(İsteğe bağlı) Proje klasörünün kökündeki Dockerfile dosyasını inceleyin. Dockerfile, linux üzerinde işlev uygulamasını çalıştırmak için gerekli ortamı açıklar. Azure İşlevleri için desteklenen temel görüntülerin tam listesi Azure İşlevleri temel görüntü sayfasında bulunabilir.

Kök proje klasöründe docker build komutunu çalıştırın, bir adı azurefunctionsimage olarak sağlayın ve v1.0.0 olarak etiketleyin. <DOCKER-ID> değerini Docker Hub hesabınızın kimliğiyle değiştirin. Bu komut, kapsayıcı için Docker görüntüsünü oluşturur.

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

Komut tamamlandığında, yeni kapsayıcıyı yerel olarak çalıştırabilirsiniz.

Derlemeyi doğrulamak için docker run komutunu kullanarak görüntüyü yerel bir kapsayıcıda çalıştırın, <DOCKER-ID> yerine Docker Hub hesap kimliğinizi yazın ve bağlantı noktaları bağımsız değişkenini olarak -p 8080:80 ekleyin.

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

Görüntü yerel kapsayıcıda başladıktan sonra, öncekiyle aynı karşılama iletisini görüntülemesi gereken http://localhost:8080/api/HttpExample adresine gidin. Oluşturduğunuz HTTP ile tetiklenen işlev anonim yetkilendirme kullandığından, erişim anahtarı almak zorunda kalmadan kapsayıcıda çalışan işlevi çağırabilirsiniz. Daha fazla bilgi için bkz. Yetkilendirme anahtarları.

Görüntü yerel kapsayıcıda başladıktan sonra, öncekiyle aynı "merhaba" iletisini görüntülemesi gereken http://localhost:8080/api/HttpExample?name=Functions adresine gidin. Oluşturduğunuz HTTP ile tetiklenen işlev anonim yetkilendirme kullandığından, erişim anahtarı almak zorunda kalmadan kapsayıcıda çalışan işlevi çağırabilirsiniz. Daha fazla bilgi için bkz. Yetkilendirme anahtarları.

Kapsayıcıdaki işlev uygulamasını doğruladıktan sonra yürütmeyi durdurmak için Ctrl+C (macOS'taC+) tuşlarına basın.

Kapsayıcı görüntüsünü kayıt defterinde yayımlama

Kapsayıcı görüntünüzü bir barındırma ortamına dağıtım için kullanılabilir hale getirmek için kapsayıcı kayıt defterine göndermeniz gerekir. En iyi güvenlik uygulaması olarak bir Azure Container Registry örneği kullanmanız ve yönetilen kimlik tabanlı bağlantıları zorunlu kılmanız gerekir. Docker Hub, paylaşılan gizli dizileri kullanarak kimlik doğrulaması yapmanızı gerektirir ve bu da dağıtımlarınızı daha savunmasız hale getirir.

Azure Container Registry, kapsayıcı görüntülerini ve ilgili yapıtları oluşturmaya, depolamaya ve yönetmeye yönelik özel bir kayıt defteri hizmetidir. Kapsayıcılarınızı Azure hizmetlerinde yayımlamak için özel bir kayıt defteri hizmeti kullanmalısınız.

  1. Geçerli Azure kimlik bilgilerinizi kullanarak kayıt defteri örneğinizde oturum açmak için bu komutu kullanın. <REGISTRY-NAME> değerini Container Registry örneğinizin adıyla değiştirin.

    az acr login --name <REGISTRY-NAME>
    
  2. Görüntünüzü kayıt defteri oturum açma sunucunuzun tam adıyla etiketlemek için bu komutu kullanın. <LOGIN-SERVER> etiketini kayıt defteri oturum açma sunucunuzun tam adıyla ve <DOCKER-ID> etiketini Docker kimliğinizle değiştirin.

    docker tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 <LOGIN-SERVER>/azurefunctionsimage:v1.0.0 
    
  3. Kapsayıcıyı kayıt defteri örneğine göndermek için şu komutu kullanın:

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

İşleviniz için destekleyici Azure kaynakları oluşturma

Kapsayıcınızı Azure'a dağıtmadan önce üç kaynak oluşturmanız gerekir:

  • İlgili kaynaklar için mantıksal bir kapsayıcı olan kaynak grubu.

  • İşlevleriniz hakkındaki durumu ve diğer bilgileri korumak için kullanılan bir Azure depolama hesabı.

  • Log Analytics çalışma alanına sahip bir Azure Container Apps ortamı.

  • kullanıcı tarafından atanan yönetilen kimlik, işlev uygulamanızın paylaşılan gizli dizileri kullanmadan Azure kaynaklarına güvenli bir şekilde bağlanmasını sağlar. Bunun yerine hem Azure depolama hesabına hem de Azure Container Registry örneğine bağlantılar, bu senaryo için önerilen kimlikle Microsoft Entra kimlik doğrulaması kullanılarak yapılır.

    Uyarı

    Docker Hub yönetilen kimlikleri desteklemez.

Gerekli Azure kaynaklarınızı oluşturmak için şu komutları kullanın:

  1. Gerekirse Azure'da oturum açın:

    Azure hesabınıza kaydolmanızı sağlayan az login komutudur. Hesabınızla ilişkili birden fazla aboneliğiniz olduğunda kullanın az account set .

  2. Azure CLI'yi en son sürüme güncelleştirmek için aşağıdaki komutu çalıştırın:

    az upgrade
    

    Azure CLI sürümünüz en son sürüm değilse bir yükleme başlar. Yükseltmenin şekli işletim sisteminize bağlıdır. Yükseltme tamamlandıktan sonra devam edebilirsiniz.

  3. Azure Container Apps uzantısını yükselten ve Container Apps için gereken ad alanlarını kaydeden aşağıdaki komutları çalıştırın:

    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. adlı AzureFunctionsContainers-rgbir kaynak grubu oluşturun.

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

    Bu az group create komut, Doğu ABD bölgesinde bir kaynak grubu oluşturur. Bunun yerine, az account list-locations komutundan döndürülen kullanılabilir bir bölge kodunu kullanarak size yakın bir bölge kullanmak istiyorsanız. Sonraki komutları, eastus yerine özel bölgenizi kullanacak şekilde değiştirmeniz gerekir.

  5. Azure Container Apps ortamı oluşturma.

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

    Bu komutun tamamlanması birkaç dakika sürebilir.

  6. Kaynak grubunuzda ve bölgenizde paylaşılan anahtar erişimi olmadan genel amaçlı bir depolama hesabı oluşturun. Komutta <STORAGE-NAME> öğesini size uygun ve Azure Depolama'da benzersiz bir ad ile değiştirin. Depolama adları yalnızca 3 ile 24 karakter arasında sayı ve küçük harf içermelidir.

    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
    

    az storage account create komutu, yalnızca belirli kaynaklar için izin verilen Microsoft Entra-authenticated kimlikleri kullanılarak erişilebilen bir depolama hesabı oluşturur.

    Standard_LRSİşlevler tarafından desteklenen genel amaçlı bir hesap belirtir.

  7. Yönetilen bir kimlik oluşturun ve size döndürülen principalId'ü kullanarak, hem depolama hesabınıza erişim izni hem de kayıt defteri örneğinizde çekme izni verin. <REGISTRY-NAME>, <USER-IDENTITY-NAME>, ve <STORAGE-NAME> öğelerini, mevcut kapsayıcı kayıt defterinizin adı, yönetilen kimliğinizin adı ve depolama hesabı adıyla değiştirin.

    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
    

    komutu az identity create kullanıcı tarafından atanan bir yönetilen kimlik oluşturur ve az role assignment createkomutlar kimliğinizi gerekli rollere ekler.

    Uygulama, artık paylaşılan gizli bilgileri kullanmadan hem depolama hesabına hem de Azure Container Registry'ye erişmek için yönetilen kimliği kullanabilir.

Görüntüyle Azure'da işlev uygulaması oluşturma ve yapılandırma

Azure'daki bir işlev uygulaması, Azure Container Apps ortamınızda işlevlerinizin yürütülmesini yönetir. Bu bölümde, bir Container Apps ortamındaki bir kapsayıcı kayıt defterindeki bir görüntüden işlev uygulaması oluşturmak için önceki bölümdeki Azure kaynaklarını kullanacaksınız. Ayrıca yeni ortamı gerekli Azure Depolama hesabına bir bağlantı dizesi ile yapılandırabilirsiniz.

az containerapp create --kind=functionapp Komutunu kullanarak Azure Container Apps tarafından desteklenen yeni yönetilen ortamda bir işlev uygulaması oluşturun. az containerapp create --kind-functionapp içinde --environmentparametresi Container Apps ortamını belirtir.

Tip

İşlev uygulamanızın kayıt defteri örneğine yönetilen kimlik tabanlı bir bağlantı kullandığından emin olmak için parametresini --image içinde az containerapp create --kind=functionappayarlamayın. Depodaki görüntünüzün tam nitelikli adını --image olarak ayarladığınızda, paylaşılan gizli kimlik bilgileri kayıt defterinizden alınır ve uygulama ayarlarında depolanır.

İlk olarak, kullanıcı tarafından atanan ve kayıt defterine çekme erişimine sahip yönetilen kimliğinizin tam kimlik değerini almanız gerekir. Daha sonra, az containerapp create --kind=functionapp komutunu kullanarak bu kimliği atanan ve varsayılan görüntüyü kullanan bir işlev uygulaması oluşturmalısınız.

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

Bu sırada, az containerapp create --kind=functionapp içinde, --assign-identity yönetilen kimliğinizi yeni uygulamaya atar. parametreyi --image içinde ayarlamadığınız için, uygulama az functionapp create bir yer tutucu görüntü kullanılarak oluşturulur.

Bu örnekte <APP-NAME> ve <STORAGE-NAME> değerlerini, yeni işlev uygulamanızın adı ve depolama hesabınızın adı ile değiştirin.

Son olarak, site ayarını depodaki görüntünüzün tam adıyla güncelleştirmeniz linuxFxVersion gerekir. Kayıt defterinden görüntü alırken yönetilen kimliklerin kullanılabilmesi için acrUseManagedIdentityCreds ve acrUserManagedIdentityID site ayarlarını güncellemeniz gerekir.

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

Gerekli site ayarlarına ek olarak, az resource patch komut uygulama ayarını kayıt defteri sunucunuzun URL'sine de güncelleştirir DOCKER_REGISTRY_SERVER_URL .

Bu örnekte , <APP-NAME>ve <REGISTRY-NAME> yerine sırasıyla işlev uygulamanızın, kapsayıcı kayıt defterinizin ve kimliğinizin adlarını yazın<USER-IDENTITY-NAME>.

Belirlediğinizde --workload-profile-name "Consumption", uygulamanız varsayılan Consumption iş yükü profili kullanılarak bir ortamda oluşturulur ve bu da Container Apps Tüketim planında çalışmakla aynı maliyeti tutar. İşlev uygulamasını ilk oluşturduğunuzda, ilk görüntüyü kayıt defterinizden çeker.

Uygulama ayarlarını güncelleştirme

İşlevler ana bilgisayarının paylaşılan sırları kullanarak varsayılan depolama hesabına bağlanmasını sağlamak için, AzureWebJobsStorage bağlantı dizesi ayarını depolama hesabına bağlanmak için kullanıcı tarafından atanan yönetilen kimliği kullanan eşdeğer bir ayarla değiştirmeniz gerekir.

  1. Mevcut AzureWebJobsStorage bağlantı dizesi ayarını kaldırın:

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

    komutu az containerapp config appsettings delete bu ayarı uygulamanızdan kaldırır. İşlev uygulamanızın adıyla <APP-NAME> ifadesini değiştirin.

  2. Varsayılan depolama hesabına kullanıcı tarafından atanan yönetilen kimlik bağlantısını tanımlayan bir AzureWebJobsStorage__ ön ek ile eşdeğer ayarlar ekleyin:

    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
    

    Bu örnekte, <APP-NAME>, <USER-IDENTITY-NAME>, ve <STORAGE-NAME> değerlerini sırasıyla işlev uygulamanızın adı, kimliğinizin adı ve depolama hesabı adı ile değiştirin.

Bu noktada, işlevleriniz bir Container Apps ortamında çalışır ve gerekli uygulama ayarları zaten eklenmiştir. Gerektiğinde, işlevler uygulamanıza İşlevler için standart şekilde başka ayarlar ekleyebilirsiniz. Daha fazla bilgi için bkz . Uygulama ayarlarıyla çalışma.

Tip

İşlev kodunuzda sonraki değişiklikleri yaptığınızda kapsayıcıyı yeniden oluşturmanız, görüntüyü kayıt defterinde yeniden yayımlamanız ve işlev uygulamasını yeni görüntü sürümüyle güncelleştirmeniz gerekir.

Azure'da işlevlerinizi doğrulama

Görüntü Azure'daki işlev uygulamanıza dağıtıldığında artık HTTP istekleri aracılığıyla işlevi çağırabilirsiniz. Belirli bir işlev hakkında ayrıntılı bilgi edinin:

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

İşlev uygulamanızın adıyla <APP-NAME> ifadesini değiştirin. Aldığınız URL'yi kullanarak HttpExample işlev uç noktasını çağırın ve ?name=Functions sorgu dizesini ekleyin.

İstek URL'si şuna benzer olmalıdır:

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

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

Go şu anda bu özellik için desteklenmiyor.

Kaynakları temizle

Bu makalede oluşturduğunuz kaynakları kullanarak Azure İşlevi ile çalışmaya devam etmek istiyorsanız, tüm bu kaynakları yerinde bırakabilirsiniz.

Bu işlev uygulaması dağıtımıyla çalışmayı bitirdiğinizde, bu gruptaki AzureFunctionsContainers-rg tüm kaynakları temizlemek için kaynak grubunu silin:

az group delete --name AzureFunctionsContainers-rg

Sonraki adım