es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring Boot Azure App Config y KeyVault – No se puede continuar con la cadena de autenticación.

Para empezar, cuando no tengo ninguna referencia de keyvault con mi config de la aplicación, puedo obtener mi valor en el arranque sin problemas. Sin embargo, estoy intentando conectar mi aplicación Spring Boot a mi recurso de config de la aplicación de Azure que tiene secretos vinculados a Azure Keyvault. Seguí esta guía: https://learn.microsoft.com/en-us/azure/azure-app-configuration/use-key-vault-references-spring-boot#prerequisites

Estoy recibiendo el error:

ERROR 5088 — [ main] c.a.i.implementation.IdentityClient : ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established, connect timed out.

ERROR 5088 — [ main] c.a.identity.ManagedIdentityCredential : Azure Identity => ERROR in getToken() call for scopes [https://{SERVICE-NAME}.azconfig.io/.default]: ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established, connect timed out.

ERROR 5088 — [ main] c.a.core.credential.SimpleTokenCache : Failed to acquire a new access token.
[…]
java.lang.RuntimeException: Max retries 2 times exceeded. Error Details: ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established, connect timed out.

Según entiendo, de esta publicación de SO, DefaultAzureCredentialBuilder() debería pasar por una cadena de posibles valores de autenticación almacenados para obtener y tratar de acceder a Keyvault. Y dado que el ManagedIdentityCredential debería fallar porque esto está solo en mi máquina local (en lugar de estar alojado en una VM de Azure), no parece que lo esté haciendo. Parece que se está quedando atrapado en intentar conectarse y alcanzando el número máximo de veces para volver a intentarlo.

¿Hay alguna manera de forzar a DefaultAzureCredentialBuilder() a saltar el managedIdentityCred y pasar directamente a AzureCliCred?

Aquí está mi pom.xml


com.microsoft.azure
spring-cloud-azure-appconfiguration-config
1.3.0

Aquí está mi clase AzureCredentials y lo que he intentado:

import com.azure.core.credential.TokenCredential;
import com.azure.identity.*;
import com.microsoft.azure.spring.cloud.config.AppConfigurationCredentialProvider;
import com.microsoft.azure.spring.cloud.config.KeyVaultCredentialProvider;

public class AzureCredentials implements AppConfigurationCredentialProvider, KeyVaultCredentialProvider {

@Override
public TokenCredential getKeyVaultCredential(String uri) {
    return getCredential();
}

@Override
public TokenCredential getAppConfigCredential(String uri) {
    return getCredential();
}

private TokenCredential getCredential() {
    return new AzureCliCredentialBuilder().build(); // falla, intenta ManagedIdentityCredential de todos modos! agota el tiempo después de 3 intentos

// return new DefaultAzureCredentialBuilder().build(); // falla, intenta ManagedIdentityCredential pero agota el tiempo después de 3 intentos
}

}

Los spring.factories, bootstrap.yml y el Config bean para hacer referencia a AzureCredentials también se crean (según el tutorial).

Si tiene alguna sugerencia, por favor hágamelo saber.

¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás teniendo problemas para conectar tu aplicación de Spring Boot a un recurso de configuración de la aplicación de Azure que tiene secretos vinculados a Azure Keyvault. El mensaje de error que estás recibiendo indica que la autenticación ManagedIdentityCredential no está disponible y no se puede establecer conexión con el punto de conexión IMDS, ha expirado la conexión.

    Una solución posible es forzar al constructor DefaultAzureCredentialBuilder() a omitir ManagedIdentityCred y conectarse directamente a AzureCliCred. Puedes lograr esto personalizando tu clase AzureCredentials como se muestra a continuación:

    import com.azure.core.credential.TokenCredential;
    import com.azure.identity.AzureCliCredentialBuilder;
    import com.microsoft.azure.spring.cloud.config.AppConfigurationCredentialProvider;
    import com.microsoft.azure.spring.cloud.config.KeyVaultCredentialProvider;
    
    public class AzureCredentials implements AppConfigurationCredentialProvider, KeyVaultCredentialProvider {
    
        @Override
        public TokenCredential getKeyVaultCredential(String uri) {
            return getCredential();
        }
    
        @Override
        public TokenCredential getAppConfigCredential(String uri) {
            return getCredential();
        }
    
        private TokenCredential getCredential() {
            // use AzureCliCredentialBuilder to skip ManagedIdentityCredential
            return new AzureCliCredentialBuilder().build();
        }
    }
    

    Luego puedes hacer referencia a esta clase AzureCredentials en tu bean Config de la siguiente manera:

    @Bean
    public Config config() {
        AppConfigurationProperties appConfigurationProperties = new AppConfigurationProperties();
    
        appConfigurationProperties
                .setConnectionString(connectionString)
                .setCredentialProvider(new AzureCredentials());
    
        return new ConfigServicePropertySourceLocator(appConfigurationProperties).locate(environment);
    }
    

    Esto debería resolver el problema y permitirte conectar con tu recurso de configuración de la aplicación de Azure con secretos vinculados a Azure Keyvault.

Comments are closed.