com.amazonaws.services.s3.model.AmazonS3Exception: доступ запрещен
Вот мой код Java:
AmazonS3 conn = new AmazonS3Client();
AmazonS3URI uri = new AmazonS3URI(s3uri);
ObjectListing objects = conn.listObjects(uri.getBucket(), uri.getKey());
Очень простая задача, я пытаюсь использовать AmazonS3 Java-клиент для доступа к S3, но эта строка conn.listObjects
продолжает терпеть неудачу и дал мне следующее исключение:
Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXXX), S3 Extended Request ID: xxxxxxxxx
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1389)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:902)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:607)
at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376)
at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3826)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3778)
at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:610)
at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:588)
Совершенно очевидный код ошибки: 403, который обозначает, что мои учетные данные aws неверны, однако это те же учетные данные, которые мои коллеги используют для доступа к тому же контейнеру s3, чтобы исключить возможность того, что у меня где-то есть опечатка, которую я буквально удалил. мой предыдущий и использовал тот же, который мне прислали мои коллеги и поместили их в ~/.aws/
Я также исследовал другие возможные причины, одна из которых может заключаться в том, что эта корзина S3 не дает разрешения для моей роли в IAM, по-видимому, это тоже не мой случай.
Любая помощь, пожалуйста? Что может быть виновником?
1 ответ
AWS SDK для Java имеет DefaultAWSCredentialsProviderChain
который проверяет учетные данные в следующем порядке:
- Переменные среды - AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY (РЕКОМЕНДУЕТСЯ, поскольку они распознаются всеми AWS SDK и CLI, за исключением.NET) или AWS_ACCESS_KEY и AWS_SECRET_KEY (распознается только Java SDK)
- Свойства системы Java - aws.accessKeyId и aws.secretKey
- Файл учетных профилей в расположении по умолчанию (
~/.aws/credentials
) для всех AWS SDK и интерфейса командной строки AWS - Учетные данные доставляются через контейнерную службу Amazon EC2, если
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
переменная окружения установлена, и администратор безопасности имеет разрешение на доступ к переменной - Учетные данные профиля экземпляра, предоставляемые через сервис метаданных Amazon EC2
Вполне возможно, что ваши учетные данные устанавливаются до того, как вы запросите нужный файл конфигурации.
Один из способов проверить, какие учетные данные используются, - это использовать aws iam get-user
Команда для отображения текущего пользователя. Вы также можете попробовать это в Java с GetUser()
вызов.
Если это кому-то поможет - я получил эту ошибку, потому что политика корзины была настроена на отклонение, когда не было указано шифрование на стороне сервера
s3:x-amz-server-side-encryption
при попытке загрузки в ведро.