[英]How to copy object in aws s3 from private bucket to public bucket without downloading?
使用此請求,可以更輕松地在s3中的同一區域中跨存儲桶復制對象:
AmazonS3 pS3client = new AmazonS3Client(new BasicAWSCredentials(/*supressed*/));
String key = "key";
pS3client.copyObject("sourceBucket", key, "destinationBucket", key);
但是,當sourceBucket
是私有訪問存儲桶,並且需要預簽名的url來訪問存儲桶中的對象時,上述請求將失敗。
由於私有訪問,文件訪問被拒絕。
com.amazonaws.services.s3.model.AmazonS3Exception:訪問被拒絕(服務:Amazon S3;狀態代碼:403;錯誤代碼:AccessDenied;請求ID:<>),S3擴展請求ID:<>,位於com.amazonaws.http .com.amazonaws上的.AmazonHttpClient $ RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1579)。 )的com.amazonaws.http.AmazonHttpClient $ RequestExecutor的com.amazonaws.http.AmazonHttpClient $ RequestExecutor.executeWithTimer(AmazonHttpClient.java:716)的com.amazonaws.http.AmazonHttpClient $ RequestExecutor.doExecute(AmazonHttpClient.java:742)的com.amazonaws.http.Amazon.Http。在com.amazonaws.http.AmazonHttpClient $ RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)上執行(AmazonHttpClient.java:699)在com.amazonaws.http.AmazonHttpClient $ RequestExecutor.access $ 500(AmazonHttpClient.java:667)
如何發出s3請求或在copyObject請求中提供預先簽名的參數以從私有存儲桶復制到公共destinationBucket
?
對於變通辦法,顯而易見的解決方案是使用GeneratePresignedUrlRequest
並獲取預簽名的url以訪問sourceBucket的對象,下載到臨時文件中,並使用putObject
在目標存儲桶中上載。 那是太多的網絡-所以想知道有什么更好的選擇嗎?
s3:CopyObject
命令不能使用預簽名的URL。
為了使用s3:CopyObject
命令,所使用的AWS憑證僅要求對源存儲桶具有讀訪問權限,而對目標存儲桶具有寫訪問權限。
如果兩個存儲桶都在同一個AWS賬戶中,那么這應該很簡單。
但是,如果存儲桶位於不同的帳戶中,則您需要在源存儲桶上應用存儲桶策略,以授予對擁有目標存儲桶的AWS賬戶的讀取訪問權限,並使用擁有目標存儲桶的AWS賬戶執行副本。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::BUCKET_NAME",
"arn:aws:s3:::BUCKET_NAME/*"
]
}
]
}
將BUCKET_NAME
替換為源 S3存儲桶的名稱,並將123456789012
替換為目標 AWS賬戶的AWS賬戶ID。 編輯后,將此策略應用於您的源 S3存儲桶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.