13

Ich versuche, signierte URL zu verwenden, um Bilder in s3-Bucket hochzuladen. Folgende ist meine Eimer Politik:Wie lege ich ein Objekt auf Amazon S3 mit der vordefinierten URL?

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": [ 
        "arn:aws:iam::12345678:user/myuser", 
        "arn:aws:iam::12345678:root" 
       ] 
      }, 
     "Action": [ 
       "s3:List*", 
       "s3:Put*", 
       "s3:Get*" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::myBucket", 
       "arn:aws:s3:::myBucket/*" 
      ] 
     } 
    ] 
} 

Ich bin die signierte URL von dem Server erzeugt wird, wie folgt:

var aws = require('aws-sdk'); 
aws.config = { 
    accessKeyId: myAccessKeyId, 
    secretAccessKey: mySecretAccessKey 
}; 

var s3 = new aws.s3(); 
s3.getSignedUrl('putObject', { 
    Bucket: 'myBucket', 
    Expires: 60*60, 
    key: 'myKey' 
}, function (err, url) { 
    console.log(url); 
}); 

ich die URL bekommen. Aber wenn ich versuche, ein Objekt habe ich die folgende Fehlermeldung erhalten:

<Error> 
    <Code>AccessDenied</Code> 
    <Message>Access Denied</Message> 
    <RequestId>FXXXXXXXXX</RequestId> 
    <HostId>fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId> 
</Error> 

Update 1

Hier ist myuser Politik:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Sid": "", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::2xxxxxxxxxxx:user/myuser", 
       "arn:aws:iam::2xxxxxxxxxxx:root" 
      ] 
     }, 
     "Action": [ 
      "s3:*" 
     ], 
     "Resource": [ 
      "arn:aws:s3:::myBucket", 
      "arn:aws:s3:::myBucket/*" 
     ] 
    } 
    ] 
} 

Update 2 kann ich nur Upload wenn folgende Option eingestellt ist. Ich verstehe nicht, was die Verwendung von Bucket-Politik ist, wenn nur die manuelle Auswahl der Erlaubnis funktioniert.

Permission for everyone

aktualisieren 3

Der folgende Code funktioniert. Jetzt das einzige Problem ist die signierte URL

#!/bin/bash 

file="$1" 

bucket="mybucket" 
resource="/${bucket}/${file}" 
contentType="image/png" 
dateValue=`date -R` 
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}" 
s3Key="AKxxxxxxxxxxxxxxxxx" 
s3Secret="/Wuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret}  -binary | base64` 
curl -X PUT -T "${file}" \ 
    -H "Host: ${bucket}.s3.amazonaws.com" \ 
    -H "Date: ${dateValue}" \ 
    -H "Content-Type: ${contentType}" \ 
    -H "Authorization: AWS ${s3Key}:${signature}" \ 
    https://${bucket}.s3.amazonaws.com/${file} 
+0

Ich nehme an, myAccessKeyId und mySecretAccessKey gehören beide zu myuser? – Brooks

+0

Ja, sie sind vom Benutzer – Pravin

+0

Sie laden eine Datei mit dem Namen "myKey" hoch, wenn Sie die URL für "myKey" generieren, richtig? –

Antwort

6

Ich habe es erfolgreich geschafft, eine Datei mit Ihrem Code hochzuladen.

Hier sind die Schritte, die ich gefolgt:

  1. einen neuen Bucket erstellt und einen neuen IAM Benutzer

  2. Sets IAM Benutzer-Politik wie folgt:

    { 
        "Version": "2012-10-17", 
        "Statement": [ 
         { 
          "Sid": "Stmt1418647210000", 
          "Effect": "Allow", 
          "Action": [ 
           "s3:Put*" 
          ], 
          "Resource": [ 
           "arn:aws:s3:::myBucket/*" 
          ] 
         } 
        ] 
    } 
    
  3. nicht selbst erstellt haben eine Bucket-Richtlinie

  4. Verwendet Ihren Code t o erzeugen, um die Pre-signierte URL:

    var aws = require('aws-sdk'); 
    aws.config = { 
        accessKeyId: myAccessKeyId, 
        secretAccessKey: mySecretAccessKey 
    }; 
    
    var s3 = new aws.s3(); 
    s3.getSignedUrl('putObject', { 
        Bucket: 'myBucket', 
        Expires: 60*60, 
        Key: 'myKey' 
    }, function (err, url) { 
        console.log(url); 
    }); 
    
  5. die URL auf dem Bildschirm kopiert und verwendet curl, wie unten mit dem Hochladen zu testen:

    curl.exe -k -X PUT -T "someFile" "https://myBucket.s3.amazonaws.com/myKey?AWSAccessKeyId=ACCESS_KEY_ID&Expires=1457632663&Signature=Dhgp40j84yfjBS5v5qSNE4Q6l6U%3D" 
    

In meinem Fall dauerte es im allgemeinen 5- 10 Sekunden, damit die Richtlinienänderungen wirksam werden. Wenn es beim ersten Mal fehlschlägt, stellen Sie sicher, dass Sie es für eine Weile senden.

Hoffe, das hilft.

+0

Hallo, können Sie bitte sagen, was MyKey in der Funktion 'getSignedUrl' ist. – formatkaka

+0

@Siddhant Das ist im Grunde der Name des Objekts in S3. Schau dir die Parameterbeschreibungen hier an: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property –

+0

Oy, die Zitate um die URL sind hier wirklich wichtig ... – chrismarx

2

Sie haben die Berechtigungen für den Bucket richtig eingerichtet, um den Zugriff vom Benutzer zu ermöglichen.

Sie müssen jedoch auch die Richtlinie des Benutzers bearbeiten, damit der Benutzer auf den S3-Dienst zugreifen kann.

Bearbeiten Sie die IAM-Richtlinie des Benutzers, dessen Anmeldeinformationen Sie zum Generieren der selbstsignierten URL verwenden. So etwas wie dies wird auf jeden Fall alles abdecken:

{ 
    "Statement": [ 
    { 
     "Sid": "AllowAllS3Access", 
     "Action": "s3:*", 
     "Effect": "Allow", 
     "Resource": "*" 
    } 
    ] 
} 
+0

ich verstehe immer noch nicht den Menschen. Was ist los? Es gibt immer noch Zugriff verweigert Fehler. – Pravin

+1

Dies gewährt dem Benutzer alle Rechte für alle S3-Buckets. Ziemlich offen und unsicher. –

1
  1. In Ihrer IAM-Konsole click Users
  2. Auf der rechten Liste, wählen Sie die IAM Benutzer, den Sie verwendet (sollte 'myuser' sein)
  3. Wählen Sie Berechtigungen für Bringen Sie die Unter Registerkarten
  4. Klicken Sie Politik und wählen AmazonS3FullAccess

Die letzte Seite wiesein.

Sie können auch Unterregisterkarte Security Credentials überprüfen, Ihre accessKeyId sollte in der Liste sein. Der secretAccessKey kann einfach nicht mehr erhalten.

+0

Es hat den vollen Administratorzugriff für jetzt. Ich kann von der s3-Konsole hochladen. Das Problem ist, dass ich keine signierte URL hochladen kann. – Pravin