Ich versuche, auf einen Bucket und sein gesamtes Objekt mit AWS SDK zuzugreifen. Beim Ausführen des Codes erhalte ich jedoch einen Fehler als Ausnahme im Thread "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=
.
Bitte schildern Sie, wo ich vermisse und warum der Zugriff verweigert wird, obwohl ich folgende Erlaubnis für den Eimer erhalten habe:
s3:GetObject
s3:GetObjectVersion
s3:GetObjectAcl
s3:GetBucketAcl
s3:GetBucketCORS
s3:GetBucketLocation
s3:GetBucketLogging
s3:ListBucket
s3:ListBucketVersions
s3:ListBucketMultipartUploads
s3:GetObjectTorrent
s3:GetObjectVersionAcl
Code lautet wie folgt:
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());
Das Problem ist jetzt gelöst. Es gab folgende Probleme mit dem Code:
Unten ist der richtige Code
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());
Gehen Sie zu IAM und prüfen Sie, ob der Benutzer [Zugriffsschlüssel und geheimer Schlüssel], der für die API verwendet wird, das Recht hat, die S3-basierte API zu verwenden.
Angeschlossene S3-Richtlinie an den angegebenen Benutzer - versuchen Sie es mit S3 Full Access; Sie können den Zugriff verfeinern, sobald dies funktioniert. Weitere Informationen finden Sie unter diesem Link [ Verwalten von IAM-Richtlinien ]
Wenn der Fehler auch nach dem Festlegen der richtigen IAM-Richtlinie und dem Überprüfen des Buckets/Pfads weiterhin auftritt, überprüfen Sie die Apache-HTTP-Client-Abhängigkeit. Der Apache http-Client 4.5.5 funktioniert einwandfrei, während 4.5.7 und höher aus seltsamen Gründen fehlschlägt (die Trennzeichen für Ordnerpfade werden nicht richtig codiert). In diesem Fall müssen Sie die Apache http-Client-Version explizit auf 4.5.5 setzen. Oder zumindest eine andere Version, die funktioniert.
In der Registerkarte "Erlaubnis" des Buckets deaktiviere ich:
- Verwalten Sie öffentliche Zugriffssteuerungslisten (ACLs) für diesen Bucket
- Neue öffentliche ACLs blockieren und öffentliche Objekte hochladen (empfohlen)
und das Problem ist weg.