Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
AWS SDK for Java 예외로 인해 표시되는 Amazon S3 오류를 해결하려면 어떻게 해야 합니까?
AWS SDK for Java를 사용하여 Amazon Simple Storage Service(Amazon S3) 리소스에 액세스할 때 발생하는 오류를 해결하고 싶습니다.
간략한 설명
AWS SDK를 사용할 때 다음과 같은 클라이언트 및 서비스 오류가 표시될 수 있습니다.
- AmazonClientException 또는 SdkClientException
- AmazonServiceException, AwsServiceException 또는 AmazonS3Exception
- UnknownHostException
위 오류를 해결하려면 먼저 예외 유형을 식별한 다음 문제 해결을 완료하십시오.
해결 방법
AmazonClientException 또는 SdkClientException
클라이언트 코드의 오류로 인해 AWS로 요청을 보낼 수 없거나 AWS의 응답을 구문 분석할 수 없을 때 AmazonClientException 또는 SdkClientException이 발생합니다.
이 문제를 해결하려면 다음 조치를 취하십시오.
-
로컬 환경의 프록시 설정 사용을 확인하고 코드의 S3Client에 프록시 구성을 설정합니다. AWS SDK for Java 2.x를 사용하는 경우 HTTP 프록시를 사용하도록 S3 클라이언트를 구성하십시오.
AWS SDK for Java 1.x를 사용하는 경우 다음 코드를 사용하여 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(); -
nslookup, ping, cURL 또는 텔넷과 같은 도구를 사용하여 S3 엔드포인트에 대한 네트워크 연결을 테스트합니다. 네트워크 연결 문제를 해결하려면 Amazon S3 버킷에서 "cp" 또는 명령을 실행할 때 발생하는 연결 오류 문제를 해결하려면 어떻게 해야 합니까?"sync"를 참조하십시오.
-
S3 클라이언트 구성을 인쇄하거나 로깅하여 S3 클라이언트를 올바르게 구성했는지 확인합니다.
구성 예시:// 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()); } } -
S3 클라이언트 구성의 HTTP 전송 설정에 연결 또는 리소스 제약 조건이 있는지 확인합니다. 자세한 내용은 클라이언트 구성 및 HTTP 클라이언트를 참조하십시오.
-
다음 try-catch-finally 명령을 실행하여 다른 요청에서 연결을 사용할 수 있도록 S3 클라이언트를 최대한 빨리 닫습니다.
try { .... // your code } catch (Exception e) { .... // catch exception } finally { // close the S3 client s3Client.close(); } -
임시 자격 증명을 사용하는 경우 다음 try-catc 명령을 실행하여 자격 증명이 만료되지 않았는지 확인합니다.
// 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 또는 AmazonS3Exception
AmazonServiceException, AwsServiceException 또는 AmazonS3Exception 오류가 표시되는 경우 AWS 서비스로 요청을 성공적으로 전송한 후에 문제가 발생한 것입니다. 문제를 해결하려면 스택 추적 응답에서 HTTP 상태 코드를 확인하십시오. 표시될 수 있는 몇 가지 상태 코드 오류의 예는 다음과 같습니다. HTTP 상태 코드의 전체 목록은 오류 코드 목록을 참조하십시오.
HTTP 400
HTTP 400 오류는 잘못된 요청 구문으로 인해 발생합니다. Amazon S3에 요청을 전송하기 전에 요청을 임시로 로깅하거나 인쇄하여 요청 구문을 확인하십시오.
HTTP 409
새 버킷을 만들기 전에 최근에 삭제된 버킷을 Amazon S3가 제거했는지 확인합니다.
HTTP 403
작업을 수행할 권한이 없는 경우 Access denied 오류가 표시됩니다. AWS Identity and Access Management(AWS IAM) 권한, 서비스 제어 정책(SCP), S3 버킷 정책 및 객체 소유권을 확인하여 충분한 권한이 있는지 확인하십시오. 또한 자격 증명이 만료되지 않았는지 확인하십시오.
IAM 주체가 ****"s3:ListBucket" 권한이 없는 객체를 요청하고 해당 객체가 S3 버킷에 존재하지 않는 경우에도 Access denied 오류가 발생합니다.
자세한 내용은 Amazon S3의 액세스 거부(403 Forbidden) 오류 해결을 참조하십시오.
HTTP 404
S3 객체가 버킷에 있는지 확인합니다.
HTTP 500
요청을 재시도하거나 코드 지연을 도입합니다. 기본적으로 각 AWS SDK 표준 재시도 모드의 최대 재시도 횟수는 3회입니다. 이러한 시도 횟수로 문제가 해결되지 않으면 값을 늘리십시오.
HTTP 503
여러 접두사로 객체를 분산합니다. 자세한 내용은 Amazon S3에서 발생하는 HTTP 500 또는 503 오류를 해결하려면 어떻게 해야 합니까?를 참조하십시오.
UnknownHostException
UnknownHostException 오류가 표시되는 경우 S3 엔드포인트에 대한 DNS 확인 문제가 없는지 확인하십시오.
