Aracılığıyla paylaş


Azure Key Vault ile MicroProfile web hizmetini yapılandırma

Bu öğreticide, MicroProfile Yapılandırma API'lerini kullanarak Azure Key Vault'tan gizli dizileri almak için bir MicroProfile uygulamasını yapılandırma adımları gösterilmektedir. Geliştiriciler, yapılandırma verilerini almak ve mikro hizmetlere eklemek için açık standart MicroProfile Yapılandırma API'sinden yararlanıyor.

Önkoşullar

  • Azure aboneliği; Henüz bir Azure aboneliğiniz yoksa MSDN abone avantajlarınızı etkinleştirebilir veya ücretsiz bir hesaba kaydolabilirsiniz.
  • Unix benzeri ortamlar için Azure CLI. Bu makale yalnızca Azure CLI'nın Bash değişkenini gerektirir.
    • Azure CLI'yi yükleyin ve kodu kullanmadan DefaultAzureCredential önce Azure'da oturum açmak için az login komutuyla etkileşimli olarak oturum açın.
      az login
      
    • Bu makale, Azure CLI'nın en az 2.55.0 sürümünü gerektirir. Azure Cloud Shell kullanıyorsanız en son sürüm zaten yüklüdür.
  • Azure Cloud Shell'de bu önkoşulların tümü önceden yüklenmiştir. Daha fazla bilgi için bkz . Azure Cloud Shell için Hızlı Başlangıç.
  • Bu kılavuzdaki komutları yerel olarak çalıştırıyorsanız (Azure Cloud Shell kullanmak yerine) aşağıdaki adımları tamamlayın:
    • Unix benzeri işletim sistemi yüklü yerel bir makine hazırlayın (örneğin, Ubuntu, macOS veya Linux için Windows Alt Sistemi).
    • Java SE uygulama sürümü 17 veya üzerini yükleyin (örneğin, OpenJDK'nin Microsoft derlemesi).
    • Maven 3.5.0 veya üzerini yükleyin.
    • cURL'yi yükleyin.

Azure Key Vault ile MicroProfile Config'i Bağlan

Şimdi Azure Key Vault ve MicroProfile Config API'sini birleştirmenin gücüne hızlıca göz atalım. Aşağıda ve ile @Inject@ConfigPropertyek açıklama ekli sınıftaki bir alanın kod parçacığı yer alır. name Ek açıklama içinde belirtilen, Azure Key Vault'ta aramak için kullanılan gizli dizinin adıdır ve defaultValue gizli dizi bulunamazsa kullanılır. Azure Key Vault'ta depolanan gizli dizi değeri veya böyle bir gizli dizi yoksa varsayılan değer çalışma zamanında alana otomatik olarak eklenir. Özellik değerlerini bu şekilde eklemek çok sayıda avantaj sağlar. Örneğin, artık oluşturucular ve ayarlayıcı yöntemlerinde değerleri geçirmeniz gerekmez ve yapılandırma koddan dışlanır. En güçlü avantajlardan biri geliştirme, test ve üretim ortamları için ayrı değer kümelerine sahip olmaktır.

@Inject
@ConfigProperty(name = "key-name", defaultValue = "Unknown")
String keyValue;

Aşağıdaki örnekte gösterildiği gibi MicroProfile yapılandırmasına kesin olarak erişmek de mümkündür:

public class DemoClass {
    @Inject
    Config config;

    public void method() {
        System.out.println("Hello: " + config.getValue("key-name", String.class));
    }
}

Bu örnek, MicroProfile'ın Open Liberty uygulamasını kullanır. Uyumlu uygulamaların tam listesi için bkz . MicroProfile Uyumlu Uygulamalar. Örnek ayrıca Azure'da uygulamayı kapsayıcıya alma ve çalıştırma adımlarını da gösterir.

Bu örnek, MicroProfile Key Vault Özel ConfigSource kitaplığı için düşük sürtünmeli Azure uzantısını kullanır. Bu kitaplık hakkında daha fazla bilgi için bkz . KITAPLıK BENİOKU.

Burada, bir Azure Key Vault kaynağı oluşturmakla başlayıp bu kodu yerel makinenizde çalıştırmak için gereken adımlar yer alır.

Azure Key Vault kaynağı oluşturma

Azure Key Vault kaynağını oluşturmak ve iki gizli diziyle doldurmak için Azure CLI'yi kullanırsınız.

İlk olarak Azure'da oturum açın ve bir aboneliği geçerli etkin abonelik olarak ayarlayın.

az login
az account set --subscription <subscription-id>

Ardından, benzersiz bir ada sahip bir kaynak grubu oluşturun; örneğin, mp-kv-rg-ejb010424.

export RESOURCE_GROUP_NAME=mp-kv-rg-ejb010424
az group create \
    --name ${RESOURCE_GROUP_NAME} \
    --location eastus

Şimdi benzersiz bir ada sahip bir Azure Key Vault kaynağı oluşturun (örneğin, kvejb010424), iki gizli dizi ekleyin ve Key Vault uri'sini ortam değişkeni olarak dışarı aktarın.

export KEY_VAULT_NAME=kv-ejb010424
az keyvault create \
    --resource-group "${RESOURCE_GROUP_NAME}" \
    --name "${KEY_VAULT_NAME}" \
    --location eastus

az keyvault secret set \
    --vault-name "${KEY_VAULT_NAME}" \
    --name secret \
    --value 1234
az keyvault secret set \
    --vault-name "${KEY_VAULT_NAME}" \
    --name anotherSecret \
    --value 5678

export AZURE_KEYVAULT_URL=$(az keyvault show \
    --resource-group "${RESOURCE_GROUP_NAME}" \
    --name "${KEY_VAULT_NAME}" \
    --query properties.vaultUri \
    --output tsv)
echo $AZURE_KEYVAULT_URL

Ortam değişkeni AZURE_KEYVAULT_URL , kitaplığı daha sonra örnekle çalışacak şekilde yapılandırmak için gereklidir. Terminali açık tutun ve uygulamayı daha sonra yerel olarak çalıştırmak için kullanın.

İşte hepsi bu! Artık Azure'da iki gizli diziyle çalışan Key Vault'a sahipsiniz. Artık örnek depoyu kopyalayabilir ve uygulamanızda bu kaynağı kullanacak şekilde yapılandırabilirsiniz.

Yerel olarak çalışmaya başlama

Bu örnek, GitHub'da bulunan örnek bir uygulamayı temel alır. Daha önce açtığınız terminale geçin ve depoyu kopyalamak ve uygulamayı yerel olarak çalıştırmak için aşağıdaki komutları çalıştırın:

git clone https://github.com/Azure/azure-microprofile.git
cd azure-microprofile
git checkout 20240116
cd integration-tests/open-liberty-sample
mvn package liberty:run

hakkında You are in 'detached HEAD' statebir ileti görürseniz, bu iletiyi yoksayabilirsiniz.

Not

Kitaplık, Azure'da kimlik doğrulaması yapmak için Varsayılan Azure kimlik bilgilerini kullanır.

Azure CLI az login komutuyla yerel olarak bir hesabın kimliğini doğruladığınızdan, DefaultAzureCredential Azure Key Vault'a erişmek için bu hesapla kimlik doğrulaması yapar.

benzeri bir çıkış görene The defaultServer server is ready to run a smarter planetkadar bekleyin. Yeni bir terminal açın ve örneği test etmek için aşağıdaki komutları çalıştırın:

# Get the value of secret "secret" stored in the Azure key vault. You should see 1234 in the response.
echo $(curl -s http://localhost:9080/config/value/secret -X GET)

# Get the value of secret "anotherSecret" stored in the Azure key vault. You should see 5678 in the response.
echo $(curl -s http://localhost:9080/config/value/anotherSecret -X GET)

# Get the names of secrets stored in the Azure key vault. You should see ["anotherSecret","secret"] in the response.
echo $(curl -s http://localhost:9080/config/propertyNames -X GET)

# Get the name-value paris of secrets stored in the Azure key vault. You should see {"anotherSecret":"5678","secret":"1234"} in the response.
echo $(curl -s http://localhost:9080/config/properties -X GET)

Açıklamalarda açıklanan beklenen çıkışları görmeniz gerekir. Uygulamanın çalıştığı terminale geri dönün. Uygulamayı durdurmak için Ctrl + C tuşlarına basın.

Örnek uygulamayı inceleme

Şimdi MicroProfile Config'in genel olarak nasıl çalıştığını ve MicroProfile Key Vault Özel ConfigSource kitaplığının özellikle nasıl çalıştığını daha iyi anlayalım.

Kitaplık bağımlılığı

Aşağıdaki Maven bağımlılığıyla uygulamanıza MicroProfile Key Vault Özel ConfigSource ekleyin:

<dependency>
  <groupId>com.azure.microprofile</groupId>
  <artifactId>azure-microprofile-config-keyvault</artifactId>
</dependency>

Azure Key Vault'a Bağlan

Kitaplık, Azure API'lerine azure-microprofile-config-keyvault doğrudan bağımlılık eklemeden uygulamanızı Azure Key Vault'a bağlar. Kitaplık, Azure Key Vault'tan okumayı bilen MicroProfile Yapılandırma belirtimi ConfigSource arabiriminin bir uygulamasını sağlar. MicroProfile Config uygulamasının geri kalanı Open Liberty çalışma zamanı tarafından sağlanır. Belirtim bağlantısı için bkz . Sonraki adımlar.

Kitaplık, uygulamanızı belirli bir anahtar kasasına bağlamak için yapılandırma özelliğini tanımlar azure.keyvault.url . MicroProfile Yapılandırma belirtimi, gibi azure.keyvault.urlbir yapılandırma özelliğinin değerinin çalışma zamanında nasıl bulunduğuna ilişkin "Ortam Değişkenleri Eşleme Kuralları"nı tanımlar. Bu kurallardan biri özelliklerin ortam değişkenlerine dönüştürüldüğünü belirtir. özelliği azure.keyvault.url ortam değişkenine AZURE_KEYVAULT_URL başvurulmaya neden olur.

Örnek uygulamadaki temel sınıflar

Şimdi önceki cURL komutlarının çağırmış olduğu REST kaynağını inceleyelim. Bu REST kaynağı projedeki sınıfında ConfigResource.javaintegration-tests/open-liberty-sample tanımlanır.

@Path("/config")
public class ConfigResource {

    @Inject
    private Config config;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/value/{name}")
    public String getConfigValue(@PathParam("name") String name) {
        return config.getConfigValue(name).getValue();
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/propertyNames")
    public Set<String> getConfigPropertyNames() {
        ConfigSource configSource = getConfigSource(AzureKeyVaultConfigSource.class.getSimpleName());
        return configSource.getPropertyNames();
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/properties")
    public Map<String, String> getConfigProperties() {
        ConfigSource configSource = getConfigSource(AzureKeyVaultConfigSource.class.getSimpleName());
        return configSource.getProperties();
    }

    private ConfigSource getConfigSource(String name) {
        return StreamSupport.stream(config.getConfigSources().spliterator(), false)
                .filter(source -> source.getName().equals(name))
                .findFirst()
                .orElseThrow(() -> new RuntimeException("ConfigSource not found: " + name));
    }
}

yöntemi, getConfigValue() uygulama yapılandırma kaynaklarından bir değer aramak için eklenen Config uygulamayı kullanır. Uygulamadaki Config tüm değer aramaları, MicroProfile Config belirtimi tarafından tanımlanan arama algoritması aracılığıyla bulunur. Kitaplık, azure-microprofile-config-keyvault Azure Key Vault'a yapılandırma kaynağı olarak ekler.

getConfigSource() yöntemi, arama algoritmasını önler ve özellikleri çözümlemek için doğrudan öğesine AzureKeyVaultConfigSource gider. Bu yöntem ve getConfigProperties() yöntemleri tarafından getConfigPropertyNames() kullanılır.

Azure Container Apps'te çalıştırma

Bu bölümde uygulamayı kapsayıcıya alır, Azure Key Vault'a erişmek için kullanıcı tarafından atanan yönetilen kimliği yapılandırır ve kapsayıcılı uygulamayı Azure Container Apps'e dağıtırsınız.

Uygulamayı yerel olarak çalıştırdığınız terminale dönün ve bu bölümün tamamında kullanın.

Azure Container Registry'yi ayarlama

Uygulamayı kapsayıcıya almak ve uygulama görüntüsünü depolamak için Azure Container Registry'yi kullanırsınız.

İlk olarak, benzersiz bir adla (örneğin, acrejb010424) bir Azure Container Registry oluşturun.

export ACR_NAME=acrejb010424
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACR_NAME \
    --sku Basic \
    --admin-enabled

Devam etmeden önce bu komutun döndürülmesini birkaç dakika bekleyin.

Uygulamayı kapsayıcıya alma

Ardından, uygulamayı kapsayıcıya alıp uygulama görüntüsünü Azure Container Registry'nize gönderin. Örnek uygulamanın yolunda olduğunuzdan emin olun; örneğin, azure-microprofile/integration-tests/open-liberty-sample.

az acr build \
    --registry ${ACR_NAME} \
    --image open-liberty-mp-azure-keyvault:latest \
    .

gibi bir iletiyle biten derleme çıktısını Run ID: ca1 was successful after 1m28sgörmeniz gerekir. Benzer bir ileti görmüyorsanız devam etmeden önce sorunu giderin ve çözün.

Uygulamayı daha sonra Azure Container Apps'e dağıtırken görüntüye erişmek için gereken bağlantı bilgilerini almak için aşağıdaki komutları kullanın.

export ACR_LOGIN_SERVER=$(az acr show \
    --name $ACR_NAME \
    --query 'loginServer' \
    --output tsv)
export ACR_USER_NAME=$(az acr credential show \
    --name $ACR_NAME \
    --query 'username' \
    --output tsv)
export ACR_PASSWORD=$(az acr credential show \
    --name $ACR_NAME \
    --query 'passwords[0].value' \
    --output tsv)

Kullanıcı tarafından atanan yönetilen kimliği ayarlama

Daha önce belirtildiği gibi kitaplık, Azure'da kimlik doğrulaması yapmak için Varsayılan Azure kimlik bilgilerini kullanır. Uygulamayı Azure Container Apps'e dağıttığınızda ortam değişkeniniAZURE_CLIENT_ID, Azure Key Vault'a erişim izinleri olan ve daha sonra Azure Container Apps'e atanan kullanıcı tanımlı yönetilen kimlik olarak kimlik doğrulaması yapmak üzere DefaultAzureCredential'ı yapılandıracak şekilde ayarlarsınız.

İlk olarak, benzersiz bir ada sahip kullanıcı tarafından atanan yönetilen kimlik oluşturmak için aşağıdaki komutları kullanın( örneğin, uamiejb010424). Daha fazla bilgi için bkz . Kullanıcı tarafından atanan yönetilen kimlik oluşturma.

export USER_ASSIGNED_IDENTITY_NAME=uamiejb010424
az identity create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME}

Ardından, Azure Key Vault'tan gizli dizileri alma ve listeleme izinleri vermek için aşağıdaki komutları kullanın. Daha fazla bilgi için bkz . Erişim ilkesini atama.

export USER_ASSIGNED_IDENTITY_OBJECT_ID="$(az identity show \
    --resource-group "${RESOURCE_GROUP_NAME}" \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --query 'principalId' \
    --output tsv)"

az keyvault set-policy --name "${KEY_VAULT_NAME}" \
    --resource-group "${RESOURCE_GROUP_NAME}" \
    --secret-permissions get list \
    --object-id "${USER_ASSIGNED_IDENTITY_OBJECT_ID}"

Çıktının başarılı kabul edilebilmesi için aşağıdaki JSON'yi içermesi gerekir:

"permissions": {
  "certificates": null,
  "keys": null,
  "secrets": [
    "list",
    "get"
  ],
  "storage": null
}

Çıktıda bu JSON yoksa devam etmeden önce sorunu giderin ve çözün.

Ardından, kullanıcı tarafından atanan yönetilen kimliğin kimliğini ve istemci kimliğini almak için aşağıdaki komutları kullanın; böylece daha sonra Azure Key Vault'a erişmek üzere Azure Container Apps'inize atayabilirsiniz:

export USER_ASSIGNED_IDENTITY_ID="$(az identity show \
    --resource-group "${RESOURCE_GROUP_NAME}" \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --query 'id' \
    --output tsv)"
export USER_ASSIGNED_IDENTITY_CLIENT_ID="$(az identity show \
    --name "${USER_ASSIGNED_IDENTITY_NAME}" \
    --resource-group "${RESOURCE_GROUP_NAME}" \
    --query 'clientId' \
    --output tsv)"
echo $USER_ASSIGNED_IDENTITY_ID
echo $USER_ASSIGNED_IDENTITY_CLIENT_ID

Uygulamayı Azure Container Apps'te dağıtma

Uygulamayı kapsayıcıya alıp Azure Key Vault'a erişmek için kullanıcı tarafından atanan bir yönetilen kimlik yapılandırdıysanız. Artık kapsayıcılı uygulamayı Azure Container Apps'te dağıtabilirsiniz.

İlk olarak Azure Container Apps için bir ortam oluşturun. Azure Container Apps'teki bir ortam, bir grup kapsayıcı uygulaması çevresinde güvenli bir sınır oluşturur. Aynı ortama dağıtılan Container Apps aynı sanal ağa dağıtılır ve günlükleri aynı Log Analytics çalışma alanına yazar. Aşağıdaki örnekte gösterildiği gibi benzersiz bir ada (örneğin, acaenvejb010424) sahip bir ortam oluşturmak için az containerapp env create komutunu kullanın:

export ACA_ENV=acaenvejb010424
az containerapp env create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location eastus \
    --name $ACA_ENV

Ardından, aşağıdaki örnekte gösterildiği gibi, uygulamayı Container Registry'den çektikten sonra çalıştırmak üzere benzersiz ada sahip bir Container Apps örneği (örneğin, acaappejb010424) oluşturmak için az containerapp create komutunu kullanın:

export ACA_NAME=acaappejb010424
az containerapp create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${ACA_NAME} \
    --environment ${ACA_ENV} \
    --image ${ACR_LOGIN_SERVER}/open-liberty-mp-azure-keyvault:latest  \
    --registry-server $ACR_LOGIN_SERVER \
    --registry-username $ACR_USER_NAME \
    --registry-password $ACR_PASSWORD \
    --user-assigned ${USER_ASSIGNED_IDENTITY_ID} \
    --env-vars \
        AZURE_CLIENT_ID=${USER_ASSIGNED_IDENTITY_CLIENT_ID} \
        AZURE_KEYVAULT_URL=${AZURE_KEYVAULT_URL} \
    --target-port 9080 \
    --ingress 'external'

Not

Kullanıcı tarafından atanan yönetilen kimliği parametresiyle --user-assigned ${USER_ASSIGNED_IDENTITY_ID}Container Apps örneğine atarsınız.

Container Apps örneği, parametrelerinde --env-vars AZURE_CLIENT_ID=${USER_ASSIGNED_IDENTITY_CLIENT_ID} AZURE_KEYVAULT_URL=${AZURE_KEYVAULT_URL}sağlanan iki ortam değişkeniyle Azure Key Vault'a erişebilir. Ortam değişkenine AZURE_KEYVAULT_URL MicroProfile Config belirtimi tarafından tanımlanan Ortam Değişkenleri Eşleme Kuralları nedeniyle başvuruldu olduğunu unutmayın.

Ardından, aşağıdaki komutu kullanarak uygulamaya erişmek için tam url'yi alın:

export APP_URL=https://$(az containerapp show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${ACA_NAME} \
    --query properties.configuration.ingress.fqdn \
    --output tsv)

Son olarak, Container Apps örneğinde çalışan örneği test etmek için aşağıdaki komutları yeniden çalıştırın:

# Get the value of secret "secret" stored in the Azure key vault. You should see 1234 in the response.
echo $(curl -s ${APP_URL}/config/value/secret -X GET)

# Get the value of secret "anotherSecret" stored in the Azure key vault. You should see 5678 in the response.
echo $(curl -s  ${APP_URL}/config/value/anotherSecret -X GET)

# Get the names of secrets stored in the Azure key vault. You should see ["anotherSecret","secret"] in the response.
echo $(curl -s  ${APP_URL}/config/propertyNames -X GET)

# Get the name-value paris of secrets stored in the Azure key vault. You should see {"anotherSecret":"5678","secret":"1234"} in the response.
echo $(curl -s  ${APP_URL}/config/properties -X GET)

Açıklamalarda açıklanan beklenen çıkışları görmeniz gerekir. Bunları görmüyorsanız, uygulama hala başlatılıyor olabilir. Bir süre bekleyin ve yeniden deneyin.

Kaynakları temizleme

Azure ücretlerinden kaçınmak için gereksiz kaynakları temizlemeniz gerekir. Kaynaklara artık gerek kalmadığında, kaynakları temizlemek için aşağıdaki komutları çalıştırın.

az keyvault delete \
    --resource-group "${RESOURCE_GROUP_NAME}" \
    --name "${KEY_VAULT_NAME}"

az keyvault purge \
    --name "${KEY_VAULT_NAME}" \
    --no-wait

az group delete \
    --name ${RESOURCE_GROUP_NAME} \
    --yes \
    --no-wait

Sonraki adımlar

Aşağıdaki başvurulardan daha fazla bilgi edinebilirsiniz: