Ir para o conteúdo

How do I troubleshoot the Amazon S3 errors that I receive from AWS SDK for Java exceptions? (Como soluciono os erros do Amazon S3 que recebo de exceções do AWS SDK para Java?)

5 minuto de leitura
0

Quero solucionar os erros que encontro ao usar o AWS SDK para Java para acessar meus recursos do Amazon Simple Storage Service (Amazon S3).

Breve descrição

Ao usar os SDKs da AWS, é possível receber os seguintes erros de cliente e serviço:

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

Para solucionar os erros anteriores, primeiro identifique o tipo de exceção e, em seguida, conclua a resolução do problema.

Resolução

AmazonClientException ou SdkClientException

O AmazonClientException ou o SdkClientException ocorrem quando você não consegue enviar uma solicitação ou analisar uma resposta da AWS devido a erros no código do cliente.

Para resolver esse problema, execute as seguintes ações:

  • Verifique o uso das configurações de proxy pelo seu ambiente local e defina a configuração de proxy no S3Client do seu código. Se você estiver usando o AWS SDK para Java 2.x, configure seu cliente S3 para usar proxies HTTP.
    Se você estiver usando o AWS SDK para Java 1.x, use o código a seguir para atualizar a configuração do seu cliente 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();
  • Teste sua conectividade de rede com endpoints do S3 com ferramentas como nslookup, ping, cURL ou telnet. Para solucionar problemas de conectividade de rede, consulte Como solucionar um erro de conexão ao executar os comandos "cp" ou no meu bucket do Amazon S3?"sync"

  • Imprima ou registre as configurações do cliente S3 para verificar se você configurou o cliente S3 corretamente.
    Exemplo de configuração:

    // 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());
            }
        }
  • Verifique se há restrições de conexão ou de recursos nas configurações de transporte HTTP na configuração do seu cliente S3. Para obter mais informações, consulte Configuração do cliente e clientes HTTP.

  • Execute o seguinte comando try-catch-finally para fechar seu cliente S3 o mais rápido possível para que outras solicitações possam usar a conexão:

    try {
                .... // your code
            } catch (Exception e) {
                .... // catch exception
            } finally {
                // close the S3 client
                s3Client.close();
            }
  • Se você estiver usando credenciais temporárias, execute o seguinte comando try-catch para confirmar que suas credenciais não expiraram:

    // 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 ou AmazonS3Exception

Se você receber um erro AmazonServiceException, AwsServiceException ou AmazonS3Exception, ocorreu um problema após o envio bem-sucedido da solicitação ao serviço da AWS. Para resolver o problema, verifique o código de status HTTP na resposta do rastreamento da pilha. Os exemplos a seguir são alguns dos erros de código de status que é possível encontrar. Para obter uma lista completa dos códigos de status HTTP, consulte Lista de códigos de erro.

HTTP 400

O erro HTTP 400 ocorre devido à sintaxe de solicitação incorreta. Antes de enviar sua solicitação para o Amazon S3, registre ou imprima temporariamente sua solicitação para verificar a sintaxe da solicitação.

HTTP 409

Verifique se o Amazon S3 removeu um bucket excluído recentemente antes de criar um novo.

HTTP 403

Você recebe um erro Access denied quando não tem permissão para realizar ações. Verifique suas permissões do AWS Identity and Access Management (AWS IAM), políticas de controle de serviços (SCPs), política de bucket do S3 e propriedade de objetos para garantir que você tenha permissões suficientes. Além disso, certifique-se de que suas credenciais não tenham expirado.

O erro Access denied também ocorre quando uma entidade principal do IAM solicita um objeto sem ****"s3:ListBucket" permissões e o objeto não existe no bucket do S3.

Para obter mais informações, consulte Solucionar erros de acesso negado (403 Forbidden) no Amazon S3.

HTTP 404

Certifique-se de que o objeto S3 exista no bucket.

HTTP 500

Tente suas solicitações novamente ou introduza um atraso no seu código. Por padrão, cada modo de nova tentativa padrão do AWS SDK tem três tentativas no máximo. Se essas tentativas não resolverem seu problema, aumente o valor.

HTTP 503

Distribua seus objetos em vários prefixos. Para obter mais informações, consulte How do I troubleshoot a HTTP 500 or 503 error from Amazon S3? (Como soluciono um erro HTTP 500 ou 503 do Amazon S3?)

UnknownHostException

Se você receber um erro UnknownHostException, certifique-se de que não haja problemas de resolução de DNS nos endpoints do S3.

Informações relacionadas

Tratamento de exceções para o AWS SDK para Java 2.x.x

Tratamento de exceções

AWS OFICIALAtualizada há 7 meses
Sem comentários