wake-up-neo.com

AWS S3 Java SDK - Zugriff verweigert

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());
19
gkbstar

Das Problem ist jetzt gelöst. Es gab folgende Probleme mit dem Code:

  1. Der Endpunkt war nicht korrekt. Es sollte einen korrekten Endpunkt geben.
  2. Der Eimer hatte nicht genügend Erlaubnis. Vor dem Verwenden des Buckets in AWS SDK muss eine Liste der vollständigen Berechtigungen erstellt werden.

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());
7
gkbstar

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 ]

23
Naveen Vijay

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.

0

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.

0
phongnt