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