>

디지털 자산 관리 시스템 인 앱이 있습니다. 썸네일을 표시합니다. https와 같은 썸네일을 AWS S3 사전 서명 URL과 함께 제공하도록 설정했습니다. : //docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html . 이 코드는 요청을 통해 처리되는 항목 수를 변경할 때까지 작동합니다. 응용 프로그램에 25, 50, 100, 200을 선택할 수 있습니다. 100 또는 200을 선택하면 "오류 : com.amazonaws.AmazonServiceException : 너무 많은 요청 (서비스 : null;상태 코드 : 429;오류 코드 : null)과 함께 프로세스가 실패합니다. ;요청 ID : null) "

현재 프로세스는 다음과 같습니다. 검색을 수행하고 해당 객체에 대해 미리 서명 된 URL을 반환하는 메소드를 통해 각 객체 키를 실행합니다.

ContainerCredentialsProvider를 통해 자격 증명을 가져올 수있는 Elastic Container Service를 통해이 애플리케이션을 실행합니다.

검토를위한 관련 코드 :

String s3SignedUrl(String objectKeyUrl) {
    // Environment variables for S3 client.
    String clientRegion = System.getenv("REGION");
    String bucketName = System.getenv("S3_BUCKET");
    try {
        // S3 credentials get pulled in from AWS via ContainerCredentialsProvider.
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withRegion(clientRegion)
                .withCredentials(new ContainerCredentialsProvider())
                .build();
        // Set the pre-signed URL to expire after one hour.
        java.util.Date expiration = new java.util.Date();
        long expTimeMillis = expiration.getTime();
        expTimeMillis += 1000 * 60 * 60;
        expiration.setTime(expTimeMillis);
        // Generate the presigned URL.
        GeneratePresignedUrlRequest generatePresignedUrlRequest =
                new GeneratePresignedUrlRequest(bucketName, objectKeyUrl)
                        .withMethod(HttpMethod.GET)
                        .withExpiration(expiration);
        return s3Client.generatePresignedUrl(generatePresignedUrlRequest).toString();
    } catch (AmazonServiceException e) {
        throw new AssetException(FAILED_TO_GET_METADATA, "The call was transmitted successfully, but Amazon " +
                "S3 couldn't process it, so it returned an error response. Error: " + e);
    } catch (SdkClientException e) {
        throw new AssetException(FAILED_TO_GET_METADATA, "Amazon S3 couldn't be contacted for a response, or " +
                "the client couldn't parse the response from Amazon S3. Error: " + e);
    }
}

이 부분은 우리가 아이템을 처리하는 부분입니다 :

// Overwrite the url, it's nested deeply in maps of maps.
    for (Object anAssetList : assetList) {
        String assetId = ((Map) anAssetList).get("asset_id").toString();
        if (renditionAssetRecordMap.containsKey(assetId)) {
            String s3ObjectKey = renditionAssetRecordMap.get(assetId).getThumbObjectLocation();
            ((Map) ((Map) ((Map) anAssetList)
                    .getOrDefault("rendition_content", new HashMap<>()))
                    .getOrDefault("thumbnail_content", new HashMap<>()))
                    .put("url", s3SignedUrl(s3ObjectKey));
        }
    }

모든 안내를 부탁드립니다. AWS 측에서 간단하고 희망적으로 구성 할 수있는 솔루션을 원할 것입니다. 그렇지 않으면 지금 당장 URL을 일괄 생성하는 프로세스를 추가하려고합니다.

  • 답변 # 1

    문제는 사전 서명 된 URL 생성과 관련이 없습니다. 이는 서비스와의 상호 작용없이 수행되므로 속도 제한이 가능한 방법은 없습니다. 사전 서명 된 URL은 HMAC-SHA 알고리즘을 사용하여 자격 증명을 소유 한 엔터티가 특정 요청을 승인했음을 서비스에 증명합니다. HMAC-SHA의 단방향 (비가 역적) 특성으로 인해 서비스 상호 작용없이 코드가 실행중인 시스템에서 이러한 URL을 완전히 생성 할 수 있습니다.

    그러나 자격 증명을 반복적으로 가져 오는 것이 예외의 실제 원인 일 수 있으며 불필요하게 반복해서 수행하는 것 같습니다.

    비용이 많이 드는 작업입니다 :

       AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withRegion(clientRegion)
                .withCredentials(new ContainerCredentialsProvider())
                .build();
    
    

    이를 다시 호출 할 때마다 자격 증명을 다시 가져와야합니다. 그것은 실제로 당신이 치는 한계입니다.

    와이즈 비즈 건설  한 번만 s3client 를 리팩토링  해당 객체가 전달 될 것으로 예상하므로 재사용 할 수 있습니다.

    s3SignedUrl() 를 해결하는 것 외에도 눈에 띄는 성능 향상이 나타납니다.  오류.

    429

관련 자료

  • 이전 javascript - 조건 문의 Fullpagejs 호출 함수
  • 다음 c# - 진행률 표시 줄로 패널 채우기