A MicroProfile konfigurálása az Azure Key Vaulttal

Ez az oktatóanyag bemutatja, hogyan konfigurálhat egy MicroProfile-alkalmazást, hogy titkos kulcsokat kérjen le az Azure Key Vaultból a MicroProfile Config API-k használatával. A fejlesztők használhatják a nyílt standard MicroProfile Config API-t a konfigurációs adatok mikroszolgáltatásaikba való beolvasásához és injektálására.

Előfeltételek

  • Azure-előfizetés; Ha még nem rendelkezik Azure-előfizetéssel, aktiválhatja az MSDN-előfizetői előnyöket , vagy regisztrálhat egy ingyenes fiókra.
  • Azure CLI Unix-szerű környezetekhez. Ehhez a cikkhez csak az Azure CLI Bash-változata szükséges.
    • Telepítse az Azure CLI-t , és jelentkezzen be interaktívan az az login paranccsal, amellyel a kód használata DefaultAzureCredential előtt bejelentkezhet az Azure-ba.
      az login
      
    • Ez a cikk az Azure CLI legalább 2.55.0-s verzióját igényli. Ha Az Azure Cloud Shellt használja, a legújabb verzió már telepítve van.
  • Az Azure Cloud Shell ezeket az előfeltételeket előre telepítette. További információt az Azure Cloud Shell rövid útmutatójában talál.
  • Ha az útmutatóban található parancsokat helyileg futtatja (az Azure Cloud Shell használata helyett), hajtsa végre a következő lépéseket:
    • Helyi gép előkészítése Unix-szerű operációs rendszerrel (például Ubuntu, macOS vagy Linuxos Windows-alrendszer).
    • Telepítse a Java Standard kiadás 17-es vagy újabb verzióját (például az OpenJDK Microsoft-buildet).
    • Telepítse a Maven 3.5.0-s vagy újabb verzióját.
    • Telepítse a cURL-t.

Csatlakozás MicroProfile Config használata az Azure Key Vaulttal

Tekintsük át az Azure Key Vault és a MicroProfile Config API kombinálásának erejét. Íme egy kódrészlet egy olyan osztályban lévő mezőből, amely a következővel van eljegyzve @Inject : és @ConfigProperty. A name megjegyzésben megadott név annak a titkos kulcsnak a neve, amelyet fel szeretne keresni az Azure Key Vaultban, és akkor használja a defaultValue rendszer, ha a titkos kulcs nem található. Az Azure Key Vaultban tárolt titkos kódérték, vagy ha nincs ilyen titkos kód, az alapértelmezett érték automatikusan be lesz adva a mezőbe futásidőben. A tulajdonságértékek ilyen módon történő injektálása számos előnnyel jár. A konstruktorokban és a beállítási metódusokban például már nem kell értékeket átadnia, és a konfigurációt a kódból külsővé teszi. Az egyik leghatékonyabb előnye, hogy különálló értékkészletekkel rendelkezik a fejlesztői, tesztelési és fejlesztői környezetekhez.

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

A MicroProfile konfigurációját is imperatív módon lehet elérni, ahogy az alábbi példában is látható:

public class DemoClass {
    @Inject
    Config config;

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

Ez a minta a MicroProfile Open Liberty-implementációjáthasználja. A kompatibilis implementációk teljes listáját a MicroProfile-kompatibilis implementációkban találja. A minta azt is bemutatja, hogyan tárolózhatja és futtathatja az alkalmazást az Azure-ban.

Ez a minta a MicroProfile Key Vault Custom ConfigSource-kódtár alacsony súrlódású Azure-bővítményét használja. A tárról további információt a README könyvtárban talál.

Ezek a lépések szükségesek a kód helyi gépen történő futtatásához, kezdve az Azure Key Vault-erőforrás létrehozásával.

Azure Key Vault-erőforrás létrehozása

Az Azure CLI használatával hozza létre az Azure Key Vault-erőforrást, és töltse fel két titkos kóddal.

Először jelentkezzen be az Azure-ba, és állítson be egy előfizetést az aktuális aktív előfizetésnek.

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

Ezután hozzon létre egy egyedi nevű erőforráscsoportot, például mp-kv-rg-ejb010424.

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

Most hozzon létre egy egyedi nevű Azure Key Vault-erőforrást (például kvejb010424), adjon hozzá két titkos kulcsot, és exportálja a Key Vault uri-t környezeti változóként.

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

A környezeti változót AZURE_KEYVAULT_URL úgy kell konfigurálni, hogy a kódtár később működjön a mintával. Tartsa nyitva a terminált, és használja az alkalmazás helyi futtatásához később.

Ennyi az egész! Most már két titkos kóddal futtatja a Key Vaultot az Azure-ban. Mostantól klónozhatja a mintaadattárat, és konfigurálhatja úgy, hogy ezt az erőforrást használja az alkalmazásban.

Helyi indítás és futtatás

Ez a példa a GitHubon elérhető mintaalkalmazáson alapul. Váltson a korábban megnyitott terminálra, és futtassa az alábbi parancsokat az adattár klónozásához és az alkalmazás helyi futtatásához:

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

Ha megjelenik egy üzenet, You are in 'detached HEAD' stateezt az üzenetet nyugodtan figyelmen kívül hagyhatja.

Feljegyzés

A kódtár az Alapértelmezett Azure-hitelesítő adatokat használja a hitelesítéshez az Azure-ban.

Mivel helyileg hitelesített egy fiókot az Azure CLI-paranccsal az login , DefaultAzureCredential ezzel a fiókkal hitelesíti magát az Azure Key Vault eléréséhez.

Várjon, amíg a kimenet a következőhöz hasonló lesz The defaultServer server is ready to run a smarter planet. Nyisson meg egy új terminált, és futtassa a következő parancsokat a minta teszteléséhez:

# 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 megjegyzésekben leírt várt kimeneteket kell látnia. Váltson vissza arra a terminálra, ahol az alkalmazás fut. Az alkalmazás leállításához nyomja le a Ctrl C billentyűkombinációt + .

A mintaalkalmazás vizsgálata

Jobban megismerjük a MicroProfile Config általános működését, és különösen a MicroProfile Key Vault Custom ConfigSource-kódtár működik.

Erőforrástár-függőség

A MicroProfile Key Vault Custom ConfigSource-t a következő Maven-függőséggel vegye fel az alkalmazásba:

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

Csatlakozás az Azure Key Vaultba

A azure-microprofile-config-keyvault kódtár anélkül csatlakoztatja az alkalmazást az Azure Key Vaulthoz, hogy közvetlen függőségeket vezet be az Azure API-któl. A kódtár a MicroProfile Config specifikáció ConfigSource felületének implementációját biztosítja, amely tudja, hogyan olvashat az Azure Key Vaultból. A MicroProfile Config implementációjának fennmaradó részét az Open Liberty futtatókörnyezet biztosítja. A specifikációra mutató hivatkozásért tekintse meg a következő lépéseket.

A kódtár meghatározza azt a azure.keyvault.url konfigurációs tulajdonságot, amely az alkalmazást egy adott kulcstartóhoz köti. A MicroProfile Config specifikációja határozza meg a "Környezeti változók leképezési szabályait" ahhoz, hogy a konfigurációs tulajdonság(például azure.keyvault.url) értékei hogyan legyenek felderítve futásidőben. Az egyik ilyen szabály azt állítja, hogy a tulajdonságok környezeti változókká lesznek konvertálva. A tulajdonság azure.keyvault.url miatt a környezeti változóval AZURE_KEYVAULT_URL kell konzultálni.

Kulcsosztályok a mintaalkalmazásban

Vizsgáljuk meg azt a REST-erőforrást, amelyet az előző cURL-parancsok meghívtak. Ez a REST-erőforrás a projekt osztályában ConfigResource.javaintegration-tests/open-liberty-sample van definiálva.

@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));
    }
}

A getConfigValue() metódus az injektált Config implementációval keres értéket az alkalmazáskonfigurációs forrásokból. Az implementációban található értékkeresések a Config MicroProfile Config specifikációja által meghatározott keresési algoritmuson keresztül találhatók. A azure-microprofile-config-keyvault kódtár konfigurációs forrásként hozzáadja az Azure Key Vaultot.

A getConfigSource() metódus elkerüli a keresési algoritmust, és egyenesen a AzureKeyVaultConfigSource tulajdonságok feloldásához vezet. Ezt a metódust a metódusok és getConfigProperties() a getConfigPropertyNames() metódusok használják.

Futtatás az Azure Container Appsben

Ebben a szakaszban tárolóba helyezi az alkalmazást, konfigurál egy felhasználó által hozzárendelt felügyelt identitást az Azure Key Vault eléréséhez, és üzembe helyezi a tárolóalapú alkalmazást az Azure Container Appsben.

Váltson vissza arra a terminálra, ahol az alkalmazást helyileg futtatta, és használja az egész szakaszban.

Azure Container Registry beállítása

Az Azure Container Registry használatával tárolóba helyezi az alkalmazást, és tárolja az alkalmazás lemezképét.

Először hozzon létre egy egyedi nevű Azure Container Registryt, például acrejb010424.

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

A folytatás előtt várjon néhány percet a parancs visszatérése után.

Az alkalmazás tárolóba helyezése

Ezután tárolóba helyezheti az alkalmazást, és leküldheti az alkalmazás lemezképét az Azure Container Registrybe. Győződjön meg arról, hogy a mintaalkalmazás elérési útját járja be, például azure-microprofile/integration-tests/open-liberty-sample.

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

Olyan buildkimenetnek kell megjelennie, amely a következőhöz Run ID: ca1 was successful after 1m28shasonló üzenettel zárul. Ha nem jelenik meg hasonló üzenet, a folytatás előtt hárítsa el és oldja meg a problémát.

Az alábbi parancsokkal lekérheti a rendszerkép eléréséhez szükséges kapcsolati adatokat, amikor később üzembe helyezi az alkalmazást az Azure Container Appsben.

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)

Felhasználó által hozzárendelt felügyelt identitás beállítása

Ahogy korábban említettem, a kódtár az Alapértelmezett Azure-hitelesítő adatokat használja a hitelesítéshez az Azure-ban. Amikor üzembe helyezi az alkalmazást az Azure Container Appsben, a környezeti változót AZURE_CLIENT_ID úgy állítja be, hogy a DefaultAzureCredential felhasználó által definiált felügyelt identitásként legyen hitelesítve, amely rendelkezik az Azure Key Vault elérésére vonatkozó engedélyekkel, és később hozzá lesz rendelve az Azure Container Appshez.

Először az alábbi parancsokkal hozzon létre egy felhasználó által hozzárendelt felügyelt identitást egyedi névvel, például uamiejb010424. További információ: Felhasználó által hozzárendelt felügyelt identitás létrehozása.

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

Ezután az alábbi parancsokkal engedélyt adhat a titkos kulcsok lekérésére és listázására az Azure Key Vaultból. További információ: Hozzáférési szabályzat hozzárendelése.

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

A kimenetnek a következő JSON-t kell tartalmaznia ahhoz, hogy sikeresnek lehessen tekinteni:

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

Ha a kimenet nem tartalmazza ezt a JSON-t, a folytatás előtt hárítsa el és oldja meg a problémát.

Ezután a következő parancsokkal kérje le a felhasználó által hozzárendelt felügyelt identitás azonosítóját és ügyfél-azonosítóját, hogy később hozzárendelhesse az Azure Container Appshez az Azure Key Vault eléréséhez:

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

Az alkalmazás üzembe helyezése az Azure Container Appsben

Tárolóba helyezette az alkalmazást, és konfigurálta a felhasználó által hozzárendelt felügyelt identitást az Azure Key Vault eléréséhez. Most már üzembe helyezheti a tárolóalapú alkalmazást az Azure Container Appsben.

Először hozzon létre egy környezetet az Azure Container Apps számára. Az Azure Container Apps környezete biztonságos határt hoz létre a tárolóalkalmazások egy csoportja körül. Az ugyanabban a környezetben üzembe helyezett Tárolóalkalmazások ugyanabban a virtuális hálózaton vannak üzembe helyezve, és naplókat írnak ugyanarra a Log Analytics-munkaterületre. Az az containerapp env create paranccsal egyedi nevű környezetet hozhat létre (például acaenvejb010424), ahogyan az alábbi példában látható:

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

Ezután az az containerapp create paranccsal hozzon létre egy egyedi nevű Container Apps-példányt (például acaappejb010424) az alkalmazás futtatásához, miután lekérte a lemezképet a Tárolóregisztrációs adatbázisból, ahogyan az a következő példában látható:

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'

Feljegyzés

A felhasználó által hozzárendelt felügyelt identitást a Container Apps-példányhoz rendeli a paraméterrel --user-assigned ${USER_ASSIGNED_IDENTITY_ID}.

A Container Apps-példány a paraméterekben --env-vars AZURE_CLIENT_ID=${USER_ASSIGNED_IDENTITY_CLIENT_ID} AZURE_KEYVAULT_URL=${AZURE_KEYVAULT_URL}megadott két környezeti változóval férhet hozzá az Azure Key Vaulthoz. Ne feledje, hogy a AZURE_KEYVAULT_URL környezeti változó a MicroProfile Config specifikációja által meghatározott környezeti változók leképezési szabályai miatt van betekintve.

Ezután kérjen le egy teljes url-címet az alkalmazás eléréséhez az alábbi paranccsal:

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

Végül futtassa újra a következő parancsokat a Container Apps-példányon futó minta teszteléséhez:

# 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 megjegyzésekben leírt várt kimeneteket kell látnia. Ha nem látja őket, az alkalmazás továbbra is elindulhat. Várjon egy ideig, majd próbálkozzon újra.

Az erőforrások eltávolítása

Az Azure-díjak elkerülése érdekében távolítsa el a szükségtelen erőforrásokat. Ha már nincs szükség az erőforrásokra, futtassa az alábbi parancsokat az erőforrások törléséhez.

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

Következő lépések

A következő hivatkozásokból tudhat meg többet: