Aracılığıyla paylaş


** Eğitim: Yönetilen kimlik kullanarak gizli anahtarlar olmadan Java Quarkus kapsayıcı uygulamasını kullanarak PostgreSQL Veritabanı'na bağlanmak

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.
  • Hizmet Bağlayıcısı'nı kullanarak yönetilen kimlikle Postgre SQL Veritabanı'ye bağlanın.

Azure hesabınız yoksa, başlamadan önce ücretsiz hesap oluşturun.

1. Önkoşullar

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

  1. 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>
    
  2. 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

  1. 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}
    
  2. 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_NAME
    

    Bu komut tamamlandığında Login Succeeded iletisi döndürülür.

  3. İ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-app deposunu, quarkus-postgres-passwordless-app:v1 görüntüsünü içeren şekilde oluşturur.

    docker push $CONTAINER_IMAGE
    

4. Azure'da Kapsayıcı Uygulaması oluşturma

  1. 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 $LOCATION
    
  2. Aş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 1
    

    Not

    ve --registry-username seçenekleri --registry-password hala 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.

  1. 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 Enabled
    

    Not

    ve --admin-user seçenekleri --admin-password hala 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.com olur). İzin verilen karakterler , A-Zve 0ş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şimNone , 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.
  2. Şu komutla PostgreSQL hizmetinde adlı fruits bir veritabanı oluşturun:

    DB_NAME=fruits
    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $DB_SERVER_NAME \
        --database-name $DB_NAME
    
  3. Azure CLI için Hizmet Bağlayıcısı parolasız uzantısını yükleyin:

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  4. Bağlantı komutunu kullanarak sistem tarafından atanan yönetilen kimlikle veritabanını kapsayıcı uygulamasına bağlayın.

    az containerapp connection create postgres-flexible \
        --resource-group $RESOURCE_GROUP \
        --name $APP_NAME \
        --target-resource-group $RESOURCE_GROUP \
        --server $DB_SERVER_NAME \
        --database $DB_NAME \
        --system-identity \
        --container $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.