Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Azure Container Apps, uygulamanız için yönetilen bir kimlik sağlar. Bu, PostgreSQL için Azure Veritabanı ve diğer Azure hizmetlerine erişimin güvenliğini sağlamaya yönelik anahtar teslimi bir çözümdür. Container Apps'teki yönetilen kimlikler, uygulamanızdaki ortam değişkenlerindeki kimlik bilgileri gibi gizli dizileri ortadan kaldırarak uygulamanızı daha güvenli hale getirir.
Bu öğretici, Azure'da Java kapsayıcı uygulamaları oluşturma, yapılandırma, dağıtma ve ölçeklendirme işleminde size yol gösterir. Bu öğreticinin sonunda, Container Apps üzerinde çalışan yönetilen kimlikle, verilerini bir PostgreSQL veritabanında depolayan bir Quarkus uygulamanız olacaktır.
Öğrendikleri:
- Postgre SQL Veritabanı ile Microsoft Entra Id kullanarak kimlik doğrulaması yapmak için bir Quarkus uygulaması yapılandırın.
- Bir Azure Container Registry örneği oluşturun ve buna bir Java uygulaması görüntüsü gönderin.
- Azure'da kapsayıcı uygulaması oluşturma.
- Azure'da bir PostgreSQL veritabanı oluşturun.
- Sistem tarafından atanan yönetilen bir kimlik ile bir PostgreSQL Veritabanına bağlanın.
Azure hesabınız yoksa, başlamadan önce ücretsiz hesap oluşturun.
1. Önkoşullar
- Azure CLI sürüm 2.45.0 veya üzeri.
- Aptal
- Java JDK
- Maven
- liman işçisi
2. Kapsayıcı kayıt defteri oluşturun
az group create komutuyla bir kaynak grubu oluşturun. Azure kaynak grubu, Azure kaynaklarının dağıtıldığı ve yönetildiği bir mantıksal kapsayıcıdır.
Aşağıdaki örnek, Doğu ABD Azure bölgesinde adlı myResourceGroup bir kaynak grubu oluşturur.
RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
az group create --name $RESOURCE_GROUP --location $LOCATION
az acr create komutunu kullanarak bir Azure Container Registry örneği oluşturun ve az acr show komutunu kullanarak oturum açma sunucusunu alın. Kaynak defteri adı Azure’da benzersiz olmalı ve 5-50 arası alfasayısal karakter içermelidir. Tüm harfler küçük harfle belirtilmelidir. Aşağıdaki örnekte mycontainerregistry007 kullanılmıştır. Bunu benzersiz bir değerle güncelleştirin.
REGISTRY_NAME=mycontainerregistry007
az acr create \
--resource-group $RESOURCE_GROUP \
--name $REGISTRY_NAME \
--sku Basic
REGISTRY_SERVER=$(az acr show \
--name $REGISTRY_NAME \
--query 'loginServer' \
--output tsv | tr -d '\r')
3. Örnek uygulamayı kopyalayın ve kapsayıcı görüntüsünü hazırlayın
Bu öğreticide, PostgreSQL için Azure Veritabanı tarafından desteklenen quarkus REST API'sini çağıran bir web kullanıcı arabirimine sahip örnek bir Fruits listesi uygulaması kullanılmaktadır. Uygulamanın kodu GitHub'da kullanılabilir. Quarkus ve PostgreSQL kullanarak Java uygulamaları yazma hakkında daha fazla bilgi edinmek için Quarkus Hibernate ORM with Panache Kılavuzu ve Quarkus Veri Kaynağı Kılavuzu'na bakın.
Örnek depoyu kopyalamak ve örnek uygulama ortamını ayarlamak için terminalinizde aşağıdaki komutları çalıştırın.
git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart
Projenizi değiştirme
Projenizin POM dosyasına gerekli bağımlılıkları ekleyin.
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.2.0</version> </dependency>Quarkus uygulama özelliklerini yapılandırın.
Quarkus yapılandırması src/main/resources/application.properties dosyasında bulunur. Bu dosyayı düzenleyicinizde açın ve birkaç varsayılan özelliği gözlemleyin. ön ekli
%prodözellikler yalnızca uygulama derlendiğinde ve dağıtıldığında, örneğin Azure Uygulaması Hizmeti'ne dağıtıldığında kullanılır. Uygulama yerel olarak çalıştırıldığında,%prodözelliği yoksayılır. Benzer şekilde,%devözellikler Quarkus'un Canlı Kodlama / Geliştirme modunda ve%testözellikler de sürekli test sırasında kullanılır.application.properties dosyasındaki mevcut içeriği silin ve veritabanını geliştirme, test ve üretim modları için yapılandırmak üzere aşağıdakilerle değiştirin:
quarkus.hibernate-orm.database.generation=drop-and-create quarkus.datasource.db-kind=postgresql quarkus.datasource.jdbc.max-size=8 quarkus.datasource.jdbc.min-size=2 quarkus.hibernate-orm.log.sql=true quarkus.hibernate-orm.sql-load-script=import.sql quarkus.datasource.jdbc.acquisition-timeout = 10 %dev.quarkus.datasource.username=${CURRENT_USERNAME} %dev.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\ authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\ &sslmode=require %prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME} %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\ authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\ &sslmode=require %dev.quarkus.class-loading.parent-first-artifacts=com.azure:azure-core::jar,\ com.azure:azure-core-http-netty::jar,\ io.projectreactor.netty:reactor-netty-core::jar,\ io.projectreactor.netty:reactor-netty-http::jar,\ io.netty:netty-resolver-dns::jar,\ io.netty:netty-codec::jar,\ io.netty:netty-codec-http::jar,\ io.netty:netty-codec-http2::jar,\ io.netty:netty-handler::jar,\ io.netty:netty-resolver::jar,\ io.netty:netty-common::jar,\ io.netty:netty-transport::jar,\ io.netty:netty-buffer::jar,\ com.azure:azure-identity::jar,\ com.azure:azure-identity-extensions::jar,\ com.fasterxml.jackson.core:jackson-core::jar,\ com.fasterxml.jackson.core:jackson-annotations::jar,\ com.fasterxml.jackson.core:jackson-databind::jar,\ com.fasterxml.jackson.dataformat:jackson-dataformat-xml::jar,\ com.fasterxml.jackson.datatype:jackson-datatype-jsr310::jar,\ org.reactivestreams:reactive-streams::jar,\ io.projectreactor:reactor-core::jar,\ com.microsoft.azure:msal4j::jar,\ com.microsoft.azure:msal4j-persistence-extension::jar,\ org.codehaus.woodstox:stax2-api::jar,\ com.fasterxml.woodstox:woodstox-core::jar,\ com.nimbusds:oauth2-oidc-sdk::jar,\ com.nimbusds:content-type::jar,\ com.nimbusds:nimbus-jose-jwt::jar,\ net.minidev:json-smart::jar,\ net.minidev:accessors-smart::jar,\ io.netty:netty-transport-native-unix-common::jar,\ net.java.dev.jna:jna::jar
Kapsayıcı kayıt defterine Docker görüntüsü oluşturma ve gönderme
Kapsayıcı görüntüsünü oluşturun.
Quarkus uygulama görüntüsünü oluşturmak için aşağıdaki komutu çalıştırın. Bunu kayıt defteri oturum açma sunucunuzun tam adıyla etiketlemeniz gerekir.
CONTAINER_IMAGE=${REGISTRY_SERVER}/quarkus-postgres-passwordless-app:v1 mvn quarkus:add-extension -Dextensions="container-image-jib" mvn clean package -Dquarkus.container-image.build=true -Dquarkus.container-image.image=${CONTAINER_IMAGE}Kayıt defterinde oturum açın.
Kapsayıcı görüntülerini göndermeden önce kayıt defterinde oturum açmanız gerekir. Bunu yapmak için [az acr login][az-acr-login] komutunu kullanın.
az acr login --name $REGISTRY_NAMEBu komut tamamlandığında
Login Succeedediletisi döndürülür.İmajı kayıt dizinine gönderin.
Görüntüyü kayıt defteri örneğine göndermek için kullanın
docker push. Bu örnek,quarkus-postgres-passwordless-appdeposunu,quarkus-postgres-passwordless-app:v1görüntüsünü içeren şekilde oluşturur.docker push $CONTAINER_IMAGE
4. Azure'da Kapsayıcı Uygulaması oluşturma
Aşağıdaki komutu çalıştırarak bir Container Apps örneği oluşturun. Ortam değişkenlerinin değerini kullanmak istediğiniz gerçek ad ve konumla değiştirdiğinizden emin olun.
CONTAINERAPPS_ENVIRONMENT="my-environment" az containerapp env create \ --resource-group $RESOURCE_GROUP \ --name $CONTAINERAPPS_ENVIRONMENT \ --location $LOCATIONAşağıdaki komutu çalıştırarak uygulama görüntünüzle bir kapsayıcı uygulaması oluşturun:
APP_NAME=my-container-app az containerapp create \ --resource-group $RESOURCE_GROUP \ --name $APP_NAME \ --image $CONTAINER_IMAGE \ --environment $CONTAINERAPPS_ENVIRONMENT \ --registry-server $REGISTRY_SERVER \ --registry-identity system \ --ingress 'external' \ --target-port 8080 \ --min-replicas 1Not
ve
--registry-usernameseçenekleri--registry-passwordhala desteklenir, ancak kimlik sistemini kullanmak daha güvenli olduğundan önerilmez.
5. Kimlik bağlantısı ile PostgreSQL veritabanı oluşturma ve bağlama
Ardından bir Postgre SQL Veritabanı oluşturun ve kapsayıcı uygulamanızı sistem tarafından atanan yönetilen kimlikle postgre SQL Veritabanı bağlanacak şekilde yapılandırın. Quarkus uygulaması bu veritabanına bağlanır ve çalıştırılırken verilerini depolar ve uygulamayı nerede çalıştırdığınızdan bağımsız olarak uygulama durumunu kalıcı hale döndürür.
Veritabanı hizmetini oluşturun.
DB_SERVER_NAME='msdocs-quarkus-postgres-webapp-db' az postgres flexible-server create \ --resource-group $RESOURCE_GROUP \ --name $DB_SERVER_NAME \ --location $LOCATION \ --public-access None \ --sku-name Standard_B1ms \ --tier Burstable \ --active-directory-auth EnabledNot
ve
--admin-userseçenekleri--admin-passwordhala desteklenir, ancak kimlik sistemini kullanmak daha güvenli olduğundan önerilmez.Yukarıdaki Azure CLI komutunda aşağıdaki parametreler kullanılır:
-
resource-group → Web uygulamasını oluşturduğunuz kaynak grubu adını kullanın; örneğin,
msdocs-quarkus-postgres-webapp-rg. -
name → PostgreSQL veritabanı sunucu adı. Bu ad tüm Azure'da benzersiz olmalıdır (sunucu uç noktası
https://<name>.postgres.database.azure.comolur). İzin verilen karakterler ,A-Zve0şeklindedir.-9-İyi bir desen, şirketinizin adıyla sunucu tanımlayıcısının bir birleşimini kullanmaktır. (msdocs-quarkus-postgres-webapp-db) - konum → Web uygulaması için kullanılan konumu kullanın. Çalışmazsa farklı bir konuma geçin.
-
genel erişim →
None, sunucuyu güvenlik duvarı kuralları olmadan genel erişim modunda ayarlar. Kurallar sonraki bir adımda oluşturulur. -
sku-name → Fiyatlandırma katmanının adı ve işlem yapılandırması ; örneğin,
Standard_B1ms. Daha fazla bilgi için Azure Veritabanı için PostgreSQL fiyatlandırması sayfasına bakın. - katman → Sunucunun işlem katmanı. Daha fazla bilgi için Azure Veritabanı için PostgreSQL fiyatlandırması sayfasına bakın.
-
Active-directory-auth → Microsoft Entra kimlik doğrulamasını etkinleştirmek için
Enabled.
-
resource-group → Web uygulamasını oluşturduğunuz kaynak grubu adını kullanın; örneğin,
Şu komutla PostgreSQL hizmetinde adlı
fruitsbir veritabanı oluşturun:DB_NAME=fruits az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $DB_SERVER_NAME \ --database-name $DB_NAMEKonteyner uygulamanızın sistem tarafından atanan yönetilen bir kimlik olduğundan emin olun ve ana kimliğini yakalayın. Uygulamayı oluştururken kimliği atarsınız.
--registry-identity systemAşağıdaki komut gerekirse açıkça atanır.az containerapp identity assign \ --resource-group $RESOURCE_GROUP \ --name $APP_NAME \ --system-assigned PRINCIPAL_ID=$(az containerapp show \ --resource-group $RESOURCE_GROUP \ --name $APP_NAME \ --query identity.principalId \ --output tsv)PostgreSQL sunucusunda Microsoft Entra yöneticisi olarak kendinizi ayarlayın ki veritabanı rolleri oluşturabilesiniz.
CURRENT_USER=$(az account show --query user.name --output tsv) CURRENT_USER_OID=$(az ad signed-in-user show --query id --output tsv) az postgres flexible-server ad-admin create \ --resource-group $RESOURCE_GROUP \ --server-name $DB_SERVER_NAME \ --display-name $CURRENT_USER \ --object-id $CURRENT_USER_OIDKonteyner uygulamasının yönetilen kimliğine eşlenmiş bir veritabanı rolü oluşturun ve ona veritabanına
fruitserişim izni verin.az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $CURRENT_USER \ --admin-password $(az account get-access-token --resource-type oss-rdbms --query accessToken --output tsv) \ --querytext "SELECT * FROM pgaadauth_create_principal_with_oid('$APP_NAME', '$PRINCIPAL_ID', 'service', false, false); GRANT ALL PRIVILEGES ON DATABASE fruits TO \"$APP_NAME\";"Quarkus uygulamasının ortam değişkenlerinden okuduğu bağlantı bilgileriyle konteyner uygulamasını yapılandırın.
az containerapp update \ --resource-group $RESOURCE_GROUP \ --name $APP_NAME \ --set-env-vars \ AZURE_POSTGRESQL_HOST=$DB_SERVER_NAME.postgres.database.azure.com \ AZURE_POSTGRESQL_PORT=5432 \ AZURE_POSTGRESQL_DATABASE=$DB_NAME \ AZURE_POSTGRESQL_USERNAME=$APP_NAME
6. Değişikliklerinizi gözden geçirin
Aşağıdaki komutu kullanarak uygulama URL'sini (FQDN) bulabilirsiniz:
echo https://$(az containerapp show \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--query properties.configuration.ingress.fqdn \
--output tsv)
Yeni web sayfası meyve listenizi gösterdiğinde, uygulamanız yönetilen kimliği kullanarak veritabanına bağlanır. Artık meyve listesini daha önce olduğu gibi düzenleyebilmeniz gerekir.
Kaynakları temizleme
Önceki adımlarda, bir kaynak grubunda Azure kaynakları oluşturdunuz. Bu kaynakların gelecekte gerekli olacağını düşünmüyorsanız, Cloud Shell’de aşağıdaki komutu çalıştırarak kaynak grubunu silin:
az group delete --name myResourceGroup
Bu komutun çalıştırılması bir dakika sürebilir.
Sonraki adımlar
Geliştirici kılavuzunda Azure'da Java uygulamalarını çalıştırma hakkında daha fazla bilgi edinin.