Bagikan melalui


Tutorial: Menyambungkan ke Database PostgreSQL dari Aplikasi Kontainer Java Quarkus tanpa rahasia menggunakan identitas terkelola

Azure Container Apps menyediakan identitas terkelola untuk aplikasi Anda, yang merupakan solusi turn-key untuk mengamankan akses ke Azure Database for PostgreSQL dan layanan Azure lainnya. Identitas terkelola di Container Apps membuat aplikasi Anda lebih aman dengan menghilangkan rahasia dari aplikasi Anda, seperti kredensial dalam variabel lingkungan.

Tutorial ini memandikan Anda melalui proses membangun, mengonfigurasi, menyebarkan, dan menskalakan aplikasi kontainer Java di Azure. Di akhir tutorial ini, Anda memiliki aplikasi Quarkus yang menyimpan data dalam database PostgreSQL dengan identitas terkelola yang berjalan di Container Apps.

Apa yang Anda pelajari:

  • Konfigurasikan aplikasi Quarkus untuk mengautentikasi menggunakan ID Microsoft Entra dengan Database PostgreSQL.
  • Buat instans Azure Container Registry dan dorong gambar aplikasi Java ke dalamnya.
  • Membuat Aplikasi Kontainer di Azure.
  • Buat database PostgreSQL di Azure.
  • Sambungkan ke Database PostgreSQL dengan identitas terkelola menggunakan Konektor Layanan.

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

1. Prasyarat

2. Buat registri kontainer

Buat grup sumber daya dengan perintah az group create . Grup sumber daya Azure adalah kontainer logis tempat sumber daya Azure disebarkan dan dikelola.

Contoh berikut membuat grup sumber daya bernama myResourceGroup di wilayah Azure US Timur.

RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"

az group create --name $RESOURCE_GROUP --location $LOCATION

Buat instans Azure Container Registry menggunakan perintah az acr create dan ambil server login-nya menggunakan perintah az acr show . Nama registri harus unik dalam Azure dan berisi 5-50 karakter alfanumerik. Semua huruf harus ditentukan dalam huruf kecil. Dalam contoh berikut, mycontainerregistry007 digunakan. Perbarui ini menjadi nilai yang unik.

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. Kloning aplikasi sampel dan siapkan gambar kontainer

Tutorial ini menggunakan contoh aplikasi daftar Buah dengan UI web yang memanggil Quarkus REST API yang didukung oleh Azure Database for PostgreSQL. Kode untuk aplikasi tersedia di GitHub. Untuk mempelajari selengkapnya tentang menulis aplikasi Java menggunakan Quarkus dan PostgreSQL, lihat Quarkus Hibernate ORM dengan Panduan Panache dan Panduan Sumber Data Quarkus.

Jalankan perintah berikut pada terminal Anda untuk mengkloning repositori sampel dan menyiapkan lingkungan aplikasi sampel.

git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart

Mengubah proyek Anda

  1. Tambahkan dependensi yang diperlukan ke file POM proyek Anda.

    <dependency>
       <groupId>com.azure</groupId>
       <artifactId>azure-identity-extensions</artifactId>
       <version>1.2.0</version>
    </dependency>
    
  2. Konfigurasikan properti aplikasi Quarkus.

    Konfigurasi Quarkus terletak di file src/main/resources/application.properties . Buka file ini di editor Anda, dan amati beberapa properti default. Properti yang diawali dengan %prod hanya digunakan ketika aplikasi dibuat dan disebarkan, misalnya saat disebarkan ke Azure App Service. Ketika aplikasi berjalan secara lokal, properti %prod diabaikan. Demikian pula, properti %dev digunakan dalam mode Live Coding / Dev Quarkus, dan properti %test digunakan selama pengujian berkelanjutan.

    Hapus konten yang ada di application.properties dan ganti dengan yang berikut ini untuk mengonfigurasi database untuk mode dev, test, dan production:

    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
    

Membangun dan mengunggah image Docker ke registri kontainer

  1. Bangun citra kontainer.

    Jalankan perintah berikut untuk membangun gambar aplikasi Quarkus. Anda harus menandainya dengan nama server masuk registri Anda yang sepenuhnya memenuhi syarat.

    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. Masuk ke registri.

    Sebelum mengunggah image kontainer, Anda harus masuk ke registri. Untuk melakukannya, gunakan perintah [az acr login][az-acr-login].

    az acr login --name $REGISTRY_NAME
    

    Perintah mengembalikan pesan Login Succeeded setelah selesai.

  3. Dorong gambar ke registri.

    Gunakan docker push untuk mendorong gambar ke instans registri. Contoh ini membuat quarkus-postgres-passwordless-app repositori, yang berisi quarkus-postgres-passwordless-app:v1 gambar.

    docker push $CONTAINER_IMAGE
    

4. Buat Aplikasi Kontainer di Azure

  1. Buat instans Container Apps dengan menjalankan perintah berikut. Pastikan Anda mengganti nilai variabel lingkungan dengan nama dan lokasi aktual yang ingin Anda gunakan.

    CONTAINERAPPS_ENVIRONMENT="my-environment"
    
    az containerapp env create \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --location $LOCATION
    
  2. Buat aplikasi kontainer dengan gambar aplikasi Anda dengan menjalankan perintah berikut:

    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
    

    Catatan

    Opsi --registry-username dan --registry-password masih didukung tetapi tidak disarankan karena menggunakan sistem identitas lebih aman.

5. Membuat dan menyambungkan database PostgreSQL dengan konektivitas identitas

Selanjutnya, buat Database PostgreSQL dan konfigurasikan aplikasi kontainer Anda untuk menyambungkan ke Database PostgreSQL dengan identitas terkelola yang ditetapkan sistem. Aplikasi Quarkus terhubung ke database ini dan menyimpan datanya saat berjalan, mempertahankan status aplikasi di mana pun Anda menjalankan aplikasi.

  1. Buat layanan database.

    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
    

    Catatan

    Opsi --admin-user dan --admin-password masih didukung tetapi tidak disarankan karena menggunakan sistem identitas lebih aman.

    Parameter berikut digunakan dalam perintah Azure CLI di atas:

    • grup sumber daya → Gunakan nama grup sumber daya yang sama tempat Anda membuat aplikasi web - misalnya, msdocs-quarkus-postgres-webapp-rg.
    • nama → Nama server database PostgreSQL. Nama ini harus unik di semua Azure (titik akhir server menjadi https://<name>.postgres.database.azure.com). Karakter yang diperbolehkan adalah: A-Z, 0-9, dan -. Pola yang baik adalah menggunakan kombinasi nama perusahaan dan pengidentifikasi server Anda. Aku akan menemuinya.msdocs-quarkus-postgres-webapp-db
    • lokasi → Gunakan lokasi yang sama yang digunakan untuk aplikasi web. Ubah ke lokasi lain jika tidak berfungsi.
    • akses publikNone yang mengatur server dalam mode akses publik tanpa aturan firewall. Aturan dibuat di langkah selanjutnya.
    • sku-name → Nama tingkat harga dan konfigurasi komputasi - misalnya, Standard_B1ms. Untuk informasi selengkapnya, lihat Harga Azure Database for PostgreSQL.
    • tingkat → Tingkat komputasi server. Untuk informasi selengkapnya, lihat Harga Azure Database for PostgreSQL.
    • active-directory-authEnabled untuk mengaktifkan autentikasi Microsoft Entra.
  2. Buat database bernama fruits dalam layanan PostgreSQL dengan perintah ini:

    DB_NAME=fruits
    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $DB_SERVER_NAME \
        --database-name $DB_NAME
    
  3. Instal ekstensi konektor layanan tanpa kata sandi untuk Azure CLI:

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  4. Sambungkan database ke aplikasi kontainer dengan identitas terkelola yang ditetapkan sistem, menggunakan perintah koneksi.

    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. Tinjau perubahan Anda

Anda dapat menemukan URL aplikasi (FQDN) dengan menggunakan perintah berikut:

echo https://$(az containerapp show \
    --name $APP_NAME \
    --resource-group $RESOURCE_GROUP \
    --query properties.configuration.ingress.fqdn \
    --output tsv)

Saat halaman web baru menampilkan daftar buah Anda, aplikasi Anda tersambung ke database menggunakan identitas terkelola. Anda sekarang dapat mengedit daftar buah seperti sebelumnya.

Membersihkan sumber daya

Di langkah-langkah sebelumnya, Anda membuat sumber daya Azure dalam grup sumber daya. Jika Anda tidak membutuhkan sumber daya ini di masa mendatang, hapus grup sumber daya dengan menjalankan perintah berikut ini di Cloud Shell:

az group delete --name myResourceGroup

Perintah ini mungkin perlu waktu satu menit untuk dijalankan.

Langkah berikutnya

Pelajari selengkapnya tentang menjalankan aplikasi Java di Azure di panduan pengembang.