Saltar al contenido

¿Cómo puedo solucionar los errores de Amazon S3 que recibo de las excepciones de AWS SDK para Java?

5 minutos de lectura
0

Quiero solucionar los errores que aparecen cuando uso el AWS SDK para Java para acceder a mis recursos de Amazon Simple Storage Service (Amazon S3).

Descripción corta

Al usar los AWS SDK, es posible que recibas los siguientes errores de cliente y servicio:

  • AmazonClientException o SdkClientException
  • AmazonServiceException, AwsServiceException o AmazonS3Exception
  • UnknownHostException

Para solucionar los errores anteriores, primero identifica el tipo de excepción y, a continuación, completa la resolución del problema.

Resolución

AmazonClientException o SdkClientException

AmazonClientException o SdkClientException se produce cuando no puedes enviar una solicitud o analizar una respuesta de AWS debido a errores en el código del cliente.

Para solucionar este problema, toma las siguientes medidas:

  • Comprueba el uso de la configuración de proxy en el entorno local y establece la configuración de proxy en el S3Client del código. Si utilizas AWS SDK para Java 2.x, configura tu cliente de S3 para que utilice proxies HTTP.
    Si utilizas AWS SDK para Java 1.x, usa el siguiente código para actualizar la configuración del cliente de S3:

    // Proxy configuration Java 1.x
            ClientConfiguration clientConfig = new ClientConfiguration();
            clientConfig.setProxyHost("your_proxy.example.com");
            clientConfig.setProxyPort(YOUR_PROXY_PORT);
    
            // Optional: If proxy requires authentication
            clientConfig.setProxyUsername(YOUR_PROXY_USERNAME);
            clientConfig.setProxyPassword(YOUR_PROXY_PASSWORD);
    
            // Create S3 client with proxy configuration
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(YOUR_REGION)
                    .withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .withClientConfiguration(clientConfig)
                    .build();
  • Prueba la conectividad de la red con los puntos de enlace de S3 con herramientas como nslookup, ping, cURL o telnet. Para solucionar problemas de conectividad de red, consulta ¿Cómo puedo solucionar un error de conexión cuando ejecuto los comandos "cp" o en mi bucket de Amazon S3?"sync"

  • Imprime o registra las configuraciones de tus clientes de S3 para comprobar que has configurado correctamente tu cliente de S3.
    Configuración del ejemplo:

    // AWS SDK for Java v1.x
    
        public static void validateClientConfiguration(AmazonS3 s3Client) {
            try {
                // See: https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ClientConfiguration.html
                ClientConfiguration config = s3Client.getClientConfiguration();
    
                System.out.println("=== Currnt S3 Client Configuration ===");
    
                // Connection Settings
                System.out.println("Max Connections: " + config.getMaxConnections());
                System.out.println("Connection Timeout: " + config.getConnectionTimeout() + "ms");
                System.out.println("Socket Timeout: " + config.getSocketTimeout() + "ms");
                System.out.println("Request Timeout: " + config.getRequestTimeout() + "ms");
                System.out.println("Client Execution Timeout: " + config.getClientExecutionTimeout() + "ms");
    
                // Retry Settings
                System.out.println("Max Error Retry: " + config.getMaxErrorRetry());
                System.out.println("Retry Policy: " + config.getRetryPolicy());
    
                // Proxy Settings
                if (config.getProxyHost() != null) {
                    System.out.println("Proxy Host: " + config.getProxyHost());
                    System.out.println("Proxy Port: " + config.getProxyPort());
                }
    
                // Protocol Settings
                System.out.println("Protocol: " + config.getProtocol());
    
                // Region/Endpoint but only if you are using the AmazonS3ClientBuilder client
                // See https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3ClientBuilder.html
    
                System.out.println("Region: " + s3Client.getRegion());
    
    
            } catch (Exception e) {
                System.err.println("Error validating client configuration: " + e.getMessage());
            }
        }
  • Comprueba si hay restricciones de conexión o de recursos en la configuración de transporte HTTP de la configuración de tu cliente de S3. Para obtener más información, consulta Configuración del cliente y Clientes HTTP

  • Ejecuta el siguiente comando try-catch-finally para cerrar el cliente de S3 lo antes posible para que otras solicitudes puedan usar la conexión:

    try {
                .... // your code
            } catch (Exception e) {
                .... // catch exception
            } finally {
                // close the S3 client
                s3Client.close();
            }
  • Si utilizas credenciales temporales, ejecuta el siguiente comando try-catch para confirmar que tus credenciales no han vencido:

    // sample method for AWS SDK Java 2.x
        public static boolean areCredentialsExpired(AwsCredentialsProvider credentialsProvider) {
            try {
                AwsCredentials credentials = credentialsProvider.resolveCredentials();
    
                if (credentials instanceof AwsSessionCredentials) {
                    return false;
                }
            } catch (S3Exception e) {
                //Check if exception contains any expired credentials indication.
                if("ExpiredToken".equals(e.awsErrorDetails().errorCode())){
                   return true;
                }
            } catch (Exception e) {
                // If we can't resolve credentials, they're likely expired
                return true;
            }
    
            return true;
        }

AmazonServiceException, AwsServiceException o AmazonS3Exception

Si recibes un error AmazonServiceException, AwsServiceException o AmazonS3Exception, significa que se ha producido un problema después de enviar correctamente la solicitud al servicio de AWS. Para resolver el problema, comprueba el código de estado HTTP en la respuesta de rastreo de la pila. Los siguientes ejemplos son algunos de los errores de código de estado que puedes encontrar. Para obtener una lista completa de los códigos de estado HTTP, consulta Lista de códigos de error.

HTTP 400

El error HTTP 400 se produce debido a una sintaxis de solicitud incorrecta. Antes de enviar la solicitud a Amazon S3, registra o imprime temporalmente la solicitud para comprobar la sintaxis de la solicitud.

HTTP 409

Comprueba si Amazon S3 ha eliminado un bucket recientemente eliminado antes de crear uno nuevo.

HTTP 403

Recibes un error Access denied cuando no tienes permiso para realizar acciones. Comprueba los permisos de AWS Identity and Access Management (IAM), las políticas de control de servicios (SCP), la política de bucket de S3 y la propiedad de los objetos para asegurarte de que dispones de los permisos suficientes. Además, asegúrate de que tus credenciales no hayan vencido.

El error Access denied también se produce cuando una entidad principal de IAM solicita un objeto sin permisos ****"s3:ListBucket" y el objeto no existe en el bucket de S3.

Para obtener más información, consulta Solución de problemas de errores 403 Forbidden en Amazon S3.

HTTP 404

Asegúrate de que el objeto de S3 existe en el bucket.

HTTP 500

Vuelve a intentar realizar las solicitudes o introduce un retraso en el código. De forma predeterminada, cada modo de reintento estándar del AWS SDK tiene un máximo de tres intentos. Si estos intentos no resuelven el problema, aumenta el valor.

HTTP 503

Distribuye los objetos entre varios prefijos. Para obtener más información, consulta ¿Cómo puedo solucionar un error HTTP 500 o 503 de Amazon S3?

UnknownHostException

Si recibes un error UnknownHostException, asegúrate de que no haya problemas de resolución de DNS en los puntos de enlace de S3.

Información relacionada

Exception handling for the AWS SDK for Java 2.x.x (Gestión de excepciones para el AWS SDK para Java 2.x.x)

Exception handling (Gestión de excepciones)

OFICIAL DE AWSActualizada hace 7 meses