Cadena predeterminada de proveedores de credenciales en AWS SDK for Java 2.x - AWS SDK for Java 2.x

Cadena predeterminada de proveedores de credenciales en AWS SDK for Java 2.x

La cadena de proveedores de credenciales predeterminados de AWS SDK for Java 2.x busca automáticamente las credenciales de AWS en una secuencia predefinida de ubicaciones, lo que permite a las aplicaciones autenticarse con Servicios de AWS sin especificar explícitamente las fuentes de credenciales.

La cadena predeterminada de proveedores de credenciales se implementa mediante la clase DefaultCredentialsProvider. Delega secuencialmente en otros proveedores de credenciales las implementaciones que comprueban la configuración en varias ubicaciones. El primer proveedor de credenciales que puede encontrar todos los elementos de configuración necesarios hace que la cadena finalice.

Para usar la cadena de proveedores de credenciales predeterminados para proporcionar las credenciales temporales, cree un compilador de clientes de servicio, pero no especifique un proveedor de credenciales. El siguiente fragmento de código crea una DynamoDbClient que utiliza la cadena de proveedores de credenciales predeterminados para localizar y recuperar los valores de configuración.

// Any external Region configuration is overridden. // The SDK uses the default credentials provider chain because no specific credentials provider is specified. Region region = Region.US_WEST_2; DynamoDbClient ddb = DynamoDbClient.builder() .region(region) .build();

Orden de recuperación de la configuración de credenciales

La cadena predeterminada de proveedores de credenciales del SDK para Java 2.x busca la configuración en su entorno mediante una secuencia predefinida.

  1. Propiedades del sistema Java

    • El SDK usa la clase SystemPropertyCredentialsProvider para cargar credenciales temporales desde las propiedades del sistema Java aws.accessKeyId, aws.secretAccessKey y aws.sessionToken.

      nota

      Para obtener información sobre cómo configurar las propiedades del sistema Java, consulte el tutorial Propiedades del sistema en el sitio web oficial de tutoriales de Java.

  2. Variables de entorno

  3. Token de identidad web y ARN del rol de IAM

    • El SDK usa la clase WebIdentityTokenFileCredentialsProvider para cargar las credenciales asumiendo un rol que utiliza un token de identidad web.

    • El proveedor de credenciales busca las siguientes variables de entorno o propiedades del sistema JVM:

      • AWS_WEB_IDENTITY_TOKEN_FILE or aws.webIdentityTokenFile

      • AWS_ROLE_ARN or aws.roleArn

      • AWS_ROLE_SESSION_NAME o aws.roleSessionName (opcional)

    • Una vez que el SDK adquiere los valores, llama a AWS Security Token Service (STS) y utiliza las credenciales temporales que devuelve para firmar solicitudes.

    • Los entornos de tiempo de ejecución, como Amazon Elastic Kubernetes Service (EKS), ponen automáticamente los tokens de identidad web a disposición de los AWS SDK, lo que permite a las aplicaciones obtener credenciales temporales de AWS.

  4. Los archivos compartidos credentials y config

    • El SDK utiliza ProfilecredentialsProvider para cargar la configuración de inicio de sesión único de IAM Identity Center o las credenciales temporales desde el perfil [default] en los archivos AND compartidos credentials y config.

      La guía de referencia de herramientas y SDK de AWS contiene información detallada sobre cómo funciona el SDK para Java con el token de inicio de sesión único del IAM Identity Center para obtener las credenciales temporales que el SDK utiliza para llamar a Servicios de AWS.

      nota

      Los archivos credentials y config son compartidos por varios SDK y herramientas de AWS. Para obtener más información, consulte Archivos .aws/credentials y .aws/config en la Guía de referencia de SDK y herramientas de AWS.

    • Dado que un perfil de los archivos compartidos credentials y config puede contener muchos conjuntos distintos de ajustes, el ProfileCredentialsProvider delega en otros proveedores la tarea de buscar los ajustes en el perfil de [default]:

      • Credenciales básicas (clase StaticCredentialsProvider): cuando el perfil contiene aws_access_key_id y aws_secret_access_key.

      • Credenciales de sesión (clase StaticSessionCredentialsProvider): cuando el perfil contiene aws_access_key_id, aws_secret_access_key y aws_session_token.

      • Credenciales de proceso (clase ProcessCredentialsProvider): cuando el perfil contiene credential_process.

      • Credenciales de SSO (claseSsoCredentialsProvider): cuando el perfil contiene propiedades relacionadas con SSO, como sso_role_name, sso_account_id.

      • Credenciales de token de identidad web (clase WebIdentityTokenCredentialsProvider): cuando el perfil contiene role_arn y web_identity_token_file.

      • Credenciales basadas en roles con perfil de origen (clase StsAssumeRoleCredentialsProvider): cuando el perfil contiene role_arn y source_profile.

      • Credenciales basadas en roles con origen de credenciales (clase StsAssumeRoleWithSourceCredentialsProvider): cuando el perfil contiene role_arn y credential_source.

        • Cuando credential_source = Environment: utiliza una cadena de SystemPropertyCredentialsProvider y EnvironmentVariableCredentialsProvider

        • Cuando credential_source = Ec2InstanceMetadata: utiliza InstanceProfileCredentialsProvider

        • Cuando credential_source = EcsContainer: utiliza ContainerCredentialsProvider

  5. Credenciales de contenedor de Amazon ECS

    • El SDK usa la clase ContainerCredentialsProvider para cargar credenciales temporales desde las variables de entorno del sistema:

      1. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI o AWS_CONTAINER_CREDENTIALS_FULL_URI

      2. AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE o AWS_CONTAINER_AUTHORIZATION_TOKEN

    El agente contenedor de ECS establece automáticamente la variable de entorno AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, que apunta al punto de conexión de credenciales de ECS. Las demás variables de entorno suelen configurarse en escenarios específicos en los que no se utiliza el punto de conexión de credenciales de ECS estándar.

  6. Credenciales proporcionadas por el rol de IAM de instancia de Amazon EC2

  7. Si el SDK no encuentra los ajustes de configuración necesarios siguiendo todos los pasos enumerados anteriormente, lanza una excepción con un resultado similar al siguiente:

    software.amazon.awssdk.core.exception.SdkClientException: Unable to load credentials from any of the providers in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(), ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()])

Uso del DefaultCredentialsProvider in código

Puede utilizar explícitamente la cadena de proveedores de credenciales predeterminados en el código. Esto equivale funcionalmente a no especificar ningún proveedor de credenciales, ya que el SDK usa DefaultCredentialsProvider de forma predeterminada. Sin embargo, su uso explícito puede hacer que el código sea más legible y autodocumentado. Muestra claramente su intención de utilizar la cadena de credenciales predeterminadas.

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; public class ExplicitDefaultCredentialsExample { public static void main(String[] args) { // Explicitly create the DefaultCredentialsProvider. DefaultCredentialsProvider defaultCredentialsProvider = DefaultCredentialsProvider .builder().build(); // Use it with any service client. S3Client s3Client = S3Client.builder() .region(Region.US_WEST_2) .credentialsProvider(defaultCredentialsProvider) .build(); // Now you can use the client with the default credentials chain. s3Client.listBuckets(); } }

Al crear el proveedor de credenciales predeterminado, puede proporcionar más configuraciones:

DefaultCredentialsProvider customizedProvider = DefaultCredentialsProvider.builder() .profileName("custom-profile") // Use a specific profile if the chain gets to the `ProfileCredentialsProvider` stage. .asyncCredentialUpdateEnabled(true) // Enable async credential updates. .build();

Este método le brinda más control y, al mismo tiempo, le brinda la comodidad de la cadena de credenciales predeterminadas.