AWS S3 Java SDK - доступ запрещен
Я пытаюсь получить доступ к ведру и всему его объекту с помощью AWS SDK, но при запуске кода я получаю сообщение об ошибке как исключение в потоке "main" com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: X), S3 Extended Request ID: Y=
Не стесняйтесь предлагать, где мне не хватает и почему доступ запрещен, происходит ошибка, хотя я принял все следующие разрешения на ведро:
s3:GetObject
s3:GetObjectVersion
s3:GetObjectAcl
s3:GetBucketAcl
s3:GetBucketCORS
s3:GetBucketLocation
s3:GetBucketLogging
s3:ListBucket
s3:ListBucketVersions
s3:ListBucketMultipartUploads
s3:GetObjectTorrent
s3:GetObjectVersionAcl
Код выглядит следующим образом:
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
conn.setEndpoint(bucketName);
Bucket bucket = conn.createBucket(bucketName);
ObjectListing objects = conn.listObjects(bucket.getName());
do {
for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
System.out.println(objectSummary.getKey() + "\t" +
objectSummary.getSize() + "\t" +
StringUtils.fromDate(objectSummary.getLastModified()));
}
objects = conn.listNextBatchOfObjects(objects);
} while (objects.isTruncated());
Ответы
Ответ 1
Теперь проблема решена. В код были внесены следующие изменения:
- Конечная точка не была правильной, должна быть правильная конечная точка.
- Недостаточно разрешений на ведро. Прежде чем использовать ведро в AWS SDK, необходимо получить полный разрешающий запрос.
Ниже приведен правильный код
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
conn.setEndpoint("correct end point");
Bucket bucket = conn.createBucket(bucketName);
ObjectListing objects = conn.listObjects(bucket.getName());
do {
for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
System.out.println(objectSummary.getKey() + "\t" +
objectSummary.getSize() + "\t" +
StringUtils.fromDate(objectSummary.getLastModified()));
}
objects = conn.listNextBatchOfObjects(objects);
} while (objects.isTruncated());
Ответ 2
Перейдите в IAM и проверьте, имеет ли пользователь [Ключ доступа и секретный ключ], который используется для API, previliges для использования API на основе S3.
Прикрепленная политика S3 для указанного пользователя - попробуйте с S3 Full Access; вы можете очистить доступ, как только это будет работать.
Дополнительная информация Проверьте эту ссылку [Управление политиками IAM]
Ответ 3
На вкладке "Разрешения" в ведре я снимите флажок:
- Управление списками контроля доступа (ACL) для этого ведра
- Блокировать новые публичные списки ACL и загружать общедоступные объекты (рекомендуется)
и проблема исчезла.