Пользователь S3 может загружать и удалять файлы из корзины, но не может их загрузить
Я создал пользователя AWS IAM и использовал политику S3 Bucket, чтобы предоставить этому пользователю все привилегии для определенного сегмента и связанных с ним объектов, как показано ниже (там, где используются X, должны быть определенные идентификаторы). Этот пользователь может программно (AWS JAVA SDK) добавлять (выгружать) и удалять файлы из этого сегмента, но я не понимаю, почему он не может загрузить какой-либо файл. Я знаю, что вопрос как-то так был задан здесь, но кажется, что проблема была в том, что он не указал доступ на уровне корзины, что в моем случае я сделал. belew - это политика S3 Bucket.
{
"Version": "2012-10-17",
"Id": "PolicyXXXXXXXXXXXXX",
"Statement": [
{
"Sid": "StmtXXXXXXXXXXXXX",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/username"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucketName"
},
{
"Sid": "StmtXXXXXXXXXXXXX",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/username"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucketName/*"
}
]
}
Ниже приведен исходный код загрузки
public void downloadS3(String bucketName, String accessKey, String secretKey, String urlString)
throws AmazonServiceException, AmazonClientException, IOException {
BasicAWSCredentials creds = new BasicAWSCredentials(accessKey, secretKey);
System.out.println("bucket Name:"+bucketName);
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(creds))
.withRegion(Regions.US_EAST_2).build() ;
//The urlString is the s3 object url saved in database
URL url = new URL(urlString);
String key=(FilenameUtils.getName(url.getPath())); // -> file.extension
System.out.println("Downloading an object file with name:"+key);
//This returns an ObjectMetadata file which we don't need to use it in this case
//ObjectMetadata object =
s3.getObject(new GetObjectRequest(bucketName, key), new File(key));
/*end downloading logic*/
System.out.println("File "+key+" Downloaded succesifully ");
}
public void downloadFile(String urlString) {
ExecutorService service = Executors.newFixedThreadPool(4);
service.submit(new Runnable() {
public void run() {
try {
this.downloadS3("bucket",accessKey,secretKey,urlString);
} catch (AmazonServiceException ase) {
System.err
.println("Caught an AmazonServiceException, which means your request made it "
+ "to Amazon S3, but was rejected with an error response for some reason.");
System.err.println("Error Message: " + ase.getMessage());
System.err.println("HTTP Status Code: " + ase.getStatusCode());
System.err.println("AWS Error Code: " + ase.getErrorCode());
System.err.println("Error Type: " + ase.getErrorType());
System.err.println("Request ID: " + ase.getRequestId());
} catch (AmazonClientException ace) {
System.err
.println("Caught an AmazonClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with S3, "
+ "such as not being able to access the network.");
System.err.println("Error Message: " + ace.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
Ниже приведено исключение, которое я получаю
Caught an AmazonClientException, which means the client encountered a serious internal problem while trying to communicate with S3, such as not being able to access the network.Error Message: java.io.FileNotFoundException: fileName.mp3 (Permission denied)
Помните, что файл на самом деле там (тот же ключ).
Я также определил политику IAM (встроенную политику) для пользователя (как показано ниже), но та же проблема все еще сохраняется. Заранее спасибо за помощь.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}